SlideShare une entreprise Scribd logo
1  sur  141
Télécharger pour lire hors ligne
Performance

as User Experience
Aaron Gustafson
@AaronGustafson
slideshare.net/AaronGustafson
/dəˈzīn/
JEFF VEEN
“I’ve been amazed at how often those
outside the discipline of design assume
that what designers do is decoration—
likely because so much bad design

simply is decoration. Good design isn’t.

Good design is problem solving.”
/ˈfrikSH(ə)n/
PERFORMANCE AS USER EXPERIENCE
Hallmarks of Good UX
๏ Streamlined flow
๏ Clear, concise copy
๏ Low cognitive load
๏ Fast performance
5
Poor performance

is friction
Source: eMarketer
A 1s delay in page

load can reduce

conversions by 7%
Source: Kissmetrics
For an online shop earning
$100k/day, that’s about
$2.5m in lost sales
Source: Kissmetrics
For Amazon, 1s is worth

about $1.6b in sales
Source: HubSpot
Source: eMarketer
53% abandon

websites that take

more than 3s to load
Source: Google
By shaving 7s off load,
Edmunds increased

page views by 17%

& ad revenue by 3%
Source: HubSpot
Mozilla reduced page load
by 2.2s and saw a 15.4%
increase in downloads
Source: HubSpot
Performance

matters
PERFORMANCE AS USER EXPERIENCE
What we were looking for
๏ Usable pages are delivered in 10kB or less
๏ Pages are accessible via screen readers, the keyboard, etc.
๏ Entries follow the philosophy of progressive enhancement
๏ Users can do what they need to without JavaScript
18
/dôɡˈfo͞odiNG/
Let’s talk (briefly)

about page load
time
Your Device The Web
Where can I find a-k-apart.com?
DNS Lookup
 Icons by Mahmure Alp
time
Your Device The Web
Where can I find a-k-apart.com?
It’s at 40.77.56.174
DNS Lookup
 Icons by Mahmure Alp
time
Your Device The Web
Where can I find a-k-apart.com?
It’s at 40.77.56.174
TCP Handshake
Hello 40.77.56.174
 Icons by Mahmure Alp
time
Your Device The Web
Where can I find a-k-apart.com?
It’s at 40.77.56.174
TCP Handshake
Hello 40.77.56.174
Howdy!
 Icons by Mahmure Alp
time
Your Device The Web
Where can I find a-k-apart.com?
It’s at 40.77.56.174
Request
Hello 40.77.56.174
Howdy!
I’d like /index.html
 Icons by Mahmure Alp
time
Your Device The Web
Where can I find a-k-apart.com?
It’s at 40.77.56.174
Server Processing
Hello 40.77.56.174
Howdy!
I’d like /index.html
 Icons by Mahmure Alp
time
Your Device The Web
Where can I find a-k-apart.com?
It’s at 40.77.56.174
Response
Hello 40.77.56.174
Howdy!
I’d like /index.html
Ok, here it is.
 Icons by Mahmure Alp
 Icons by Mahmure Alp
 Icons by Mahmure Alp
Response
Load
Paint
Layout
RenderTree
CSS
DOM
 Icons by Mahmure Alp
Response
Load
Paint
Layout
RenderTree
CSS
DOM
CSS & JavaScript can
delay rendering or cause
these to be run again
PERFORMANCE AS USER EXPERIENCE
DOM Parsing
<html>	
	<head>	
		<title>Silly	example</title>		
		<script	src="head.js"></script>	
		<link	rel="stylesheet"	href="main.css">	
		<style>h2	{	font-wight:	bold;	}</style>	
		<script>console.log('hi');</script>	
	</head>	
	<body>	
				<img	src="my.png"	alt="">	
				<script	src="body.js"></script>	
	</body>	
</html>	
wait while the browser

fetches & parses the script
PERFORMANCE AS USER EXPERIENCE
DOM Parsing
<html>	
	<head>	
		<title>Silly	example</title>		
		<script	src="head.js"></script>	
		<link	rel="stylesheet"	href="main.css">	
		<style>h2	{	font-wight:	bold;	}</style>	
		<script>console.log('hi');</script>	
	</head>	
	<body>	
				<img	src="my.png"	alt="">	
				<script	src="body.js"></script>	
	</body>	
</html>	
wait while the browser

fetches & parses the CSS
PERFORMANCE AS USER EXPERIENCE
DOM Parsing
<html>	
	<head>	
		<title>Silly	example</title>	
		<script	src="head.js"></script>	
		<link	rel="stylesheet"	href="main.css">	
		<style>h2	{	font-wight:	bold;	}</style>	
		<script>console.log('hi');</script>	
	</head>	
	<body>	
				<img	src="my.png"	alt="">	
				<script	src="body.js"></script>	
	</body>	
</html>	
kicks off downloading

the image
PERFORMANCE AS USER EXPERIENCE
DOM Parsing
<html>	
	<head>	
		<title>Silly	example</title>		
		<script	src="head.js"></script>	
		<link	rel="stylesheet"	href="main.css">	
		<style>h2	{	font-wight:	bold;	}</style>	
		<script>console.log('hi');</script>	
	</head>	
	<body>	
				<img	src="my.png"	alt="">	
				<script	src="body.js"></script>	
	</body>	
</html>	 wait while the browser

fetches & parses the script
PERFORMANCE AS USER EXPERIENCE
Steps for better performance
1. Use native features whenever possible
2. Only include assets you actually need
3. Optimize everything
4. Think about when you load assets
5. Consider how you load assets
6. Only load assets when they add value
43
Step 1:

Use native features

whenever possible
(they’re effectively free)
PERFORMANCE AS USER EXPERIENCE
Por exemplo
<header>	
		Header	content…	
</header> not only shorter than

<div id=“header">, but

semantic too
depending on its location
in the document, could also
provide a landmark
for navigation
PERFORMANCE AS USER EXPERIENCE
Por exemplo
<input	id="n"	name="n"	
							required	aria-required="true"			
							autocorrect="off"

							autocapitalize="words"			
							placeholder="Sir	Tim	Berners	Lee"	
							autocomplete="name"	
							>
modern browsers require

users to enter content
browser can inform

assistive tech that

the field is required
don’t let the browser
try to correct
someone’s name
auto-disappearing suggestion
without JavaScript
if the browser already

knows the user’s name,

by all means, let it fill it in
PERFORMANCE AS USER EXPERIENCE
Por exemplo
<input	type="email"

							id="e"	name="e"

							required	aria-required="true"

							autocorrect="off"

							autocapitalize="off"

							autocomplete="email"

							placeholder="you@yourdomain.tld"

							>
modern browsers validate

the email address

and may supply a

custom keyboard layout
let the browser suggest

an email address if it has one
PERFORMANCE AS USER EXPERIENCE
Por exemplo
@media	(min-width:600px)	{

		.layout-container	{	
				display:	flex;	
		}	
		.primary	{

				width:	68%;

		}

		.secondary	{

				width:	32%;

		}

}	
So much better than floats
PERFORMANCE AS USER EXPERIENCE
Por exemplo
var	$radios	=	document.querySelectorAll(	
																'input[type=radio]'	
														);
CSS selector-based

DOM traversal

without a JS library
PERFORMANCE AS USER EXPERIENCE
Por exemplo
font-family:	Georgia,	Times,

													"Times	New	Roman",	serif
font-family:	"Segoe	UI",	Frutiger,

													"Frutiger	Linotype",

													"Dejavu	Sans",	"Helvetica	Neue",

													Arial,	sans-serif;
Serif
Sans Serif
If you need

a custom font:

subset, subset, subset
PERFORMANCE AS USER EXPERIENCE
Proceed with caution
Source: Bran Stein
Step 2:

Only include assets

you actually need
Great tools,
possibly overkill
PERFORMANCE AS USER EXPERIENCE
Every tool has a cost
Framework Size (Compressed)
Bootstrap 2 149 kB
Bootstrap 3 103 kB
Angular 1.4 51 kB
Ember 2.2.0 111 kB
Foundation 4 266 kB
jQuery 32 kB
UI Kit 86 kB
React 16 + React DOM 35 kB
Vue 2.4.2 20 kB
Chances are, your

library of choice

is on a CDN
time
Your Device The Web
Where can I find cdn.foo.com?
It’s at 123.45.67.89
Hello 123.45.67.89
Howdy!
I’d like /jquery.min.js
Ok, here it is.
 Icons by Mahmure Alp
time
Your Device The Web
Where can I find cdn.foo.com?
It’s at 123.45.67.89
 Icons by Mahmure Alp
You can optimize this
PERFORMANCE AS USER EXPERIENCE
Find the server early
<link	rel="dns-prefetch"

						href="https://cdn.foo.com">
Drop this in the

head of your pages
time
Your Device The Web
Where can I find cdn.foo.com?
It’s at 123.45.67.89
Hello 123.45.67.89
Howdy!
 Icons by Mahmure Alp
You can optimize this
PERFORMANCE AS USER EXPERIENCE
Go for the handshake
<link	rel="preconnect"

						href="https://cdn.foo.com">
time
Your Device The Web
I’d like /jquery.min.js
Ok, here it is.
 Icons by Mahmure Alp
You can even optimize this
PERFORMANCE AS USER EXPERIENCE
Grab that resource
<link	rel="preload"

						href="https://cdn.foo.com/jquery.min.js"

						as="script">
Helps optimize the process
PERFORMANCE AS USER EXPERIENCE
Download isn’t everything
Source: The Filament Group
PERFORMANCE AS USER EXPERIENCE
Download isn’t everything
Framework Method/function operations/s
Vanilla JS document.getElementById() 12,137,211
Dojo dojo.byId(); 5,443,343
Prototype $() 2,940,734
Ext JS Ext.get() 997,562
jQuery $() 350,557
YUI YAHOO.util.Dom.get() 326,534
MooTools document.id() 78,802
Source: VanillaJS
100% library free
PERFORMANCE AS USER EXPERIENCE
We used some hints though
<link	rel="preconnect"

						href="//10kapart.blob.core.windows.net">	
<link	rel="preconnect"

						href="//cdnjs.cloudflare.com">	
<link	rel="preconnect"

						href="//www.google-analytics.com">
Step 3:

Optimize
everything
PERFORMANCE AS USER EXPERIENCE
Our approach to CSS (Gulp)
1. Write modular CSS in Sass (+ Breakup for MQ management)
2. Compile CSS with a precision of 4 decimal places (gulp-sass)
3. Fallbacks for the last 2 browser versions (gulp-autoprefixer)
4. CSS shorthand declarations if possible (gulp-shorthand)
5. Remove any unused declarations/rule sets (gulp-uncss)
6. Optimize the files (gulp-csso)
7. Minify (gulp-clean-css)
8. Gzip (gulp-zopfli)
9. Brotli (gulp-brotli)
71
PERFORMANCE AS USER EXPERIENCE
Before
PERFORMANCE AS USER EXPERIENCE
After
PERFORMANCE AS USER EXPERIENCE
After
everyone else

8 kB
browsers that support

brotli compression

2 kB
browsers that support
gzip compression
3 kB
PERFORMANCE AS USER EXPERIENCE
Our approach to JS (Gulp)
1. Write modular JavaScript, grouped as appropriate
2. Combine files based on folder structure (gulp-folders, gulp-concat)
3. Create an wrapping closure to isolate from other JS (gulp-insert)
4. Minify (gulp-uglify)
5. Gzip (gulp-zopfli)
6. Brotli (gulp-brotli)
74
PERFORMANCE AS USER EXPERIENCE
Results
about 8 kB all-up
4 kB
1 kB
2 kB
PERFORMANCE AS USER EXPERIENCE
Interesting side note
indexes last
indexes first
We also minified

& pre-compressed

our HTML
Step 4:

Think about when

you load assets
PERFORMANCE AS USER EXPERIENCE
We had 10 JS files
๏ Global
‣ main.js - the site’s library
‣ serviceworker.js - The site’s service worker
๏ Browser-specific
‣ html5shiv.js - local copy of the HTML5 Shiv for < IE9
79
PERFORMANCE AS USER EXPERIENCE
We had 10 JS files
๏ Page-specific
‣ enter.js - Entry form-related code
‣ form-saver.js - Used to save form entries locally until submitted
‣ hero.js - Runs the SVG animation on the homepage
‣ home.js - Handles homepage-specific tasks
‣ project.js - Used on project pages during voting
‣ update.js - Handles the winner update form
80
PERFORMANCE AS USER EXPERIENCE
Per the common wisdom
				<script	src="/j/main.min.js"></script>

		</body>

</html>
PERFORMANCE AS USER EXPERIENCE
No need to run immediately
				<script	src="/j/main.min.js"></script>

				<script	src="/j/home.min.js"

												defer

												></script>

		</body>

</html>
run after the DOM is loaded
PERFORMANCE AS USER EXPERIENCE
Run whenever you can
				<script	src="/j/main.min.js"></script>

				<script	src="/j/home.min.js"

												async

												></script>

		</body>

</html>
run whenever it becomes

available, but don’t

delay page load
PERFORMANCE AS USER EXPERIENCE
Consider dependencies
<script	src="/j/main.min.js"></script>

<script	src="/j/home.min.js"	async></script>
PERFORMANCE AS USER EXPERIENCE
Consider dependencies
<script	src="/j/main.min.js"	async></script>

<script	src="/j/home.min.js"	async></script>
what if this calls a function

in main.min.js?
“race condition”
PERFORMANCE AS USER EXPERIENCE
Avoid race conditions
<script	src="/j/main.min.js"></script>

<script	src="/j/home.min.js"	async></script>
Why so many

separate files?
PERFORMANCE AS USER EXPERIENCE
Connections in HTTP/1.1
Browser Per host Overall
IE 9 6 35
IE 10 8 17
IE 11 13 17
Firefox 4+ 6 17
Opera 11+ 6 user defined
Chrome 4+ 6 10
Safari 7+ 6 17
time
Your Device The Web
HTTP/1.1
 Icons by Mahmure Alp
I’d like /c/main.css
I’d like /j/main.min.js
I’d like /i/o.svg
I’d like /j/home.min.js
I’d like /i/edge.svg
I’d like /i/aea.svg
HTTP/2 creates

a single connection and
contents stream in
time
Your Device The Web
HTTP/2
 Icons by Mahmure Alp
I’d like /c/main.css
I’d like /i/o.svg
I’d like /i/edge.svg
Source: A List Apart
Source: A List Apart
Step 5:

Consider how

you load assets
PERFORMANCE AS USER EXPERIENCE
Start simple
<link	rel="stylesheet"	href="/c/d.min.css">		
<link	rel="stylesheet"	href="/c/a.min.css"

						media="only	screen">		
default styles
(all browsers)
advanced styles

(modern browsers)
PERFORMANCE AS USER EXPERIENCE
Fault tolerance FTW!
<link	rel="stylesheet"	href="/c/d.min.css">		
<link	rel="stylesheet"	href="/c/a.min.css"

						media="only	screen">		
browsers that don’t grok

media queries ignore this file
PERFORMANCE AS USER EXPERIENCE
Conditional scripting
<!--[if	lt	IE	9]>		
		<script	src="/j/html5shiv.min.js"></script>		
<![endif]-->	
delivers this script

to <= IE 8
PERFORMANCE AS USER EXPERIENCE
Conditional scripting
				<!--[if	gt	IE	8]><!-->

						<script	src="/j/main.min.js"></script>

						<script	src="/j/home.min.js"	async

														></script>

				<!--<![endif]-->

		</body>

</html>
hides scripts from <= IE8
(no need to test!)
PERFORMANCE AS USER EXPERIENCE
Conditional imagery
PERFORMANCE AS USER EXPERIENCE
Conditional images
@media	(min-width:	36.375em)	{	
		.presented-by	[href*=microsoft]::before	{	
				background-image:	url(/i/c/edge.png);	
				background-image:	url(/i/c/edge.svg),

																						none;

				…	
		}	
}
PERFORMANCE AS USER EXPERIENCE
Conditional images
@media	(min-width:	36.375em)	{	
		.presented-by	[href*=microsoft]::before	{	
				background-image:	url(/i/c/edge.png);	
				background-image:	url(/i/c/edge.svg),

																						none;

				…	
		}	
}
PERFORMANCE AS USER EXPERIENCE
Conditional images
@media	(min-width:	36.375em)	{	
		.presented-by	[href*=microsoft]::before	{	
				background-image:	url(/i/c/edge.png);	
				background-image:	url(/i/c/edge.svg),

																						none;

				…	
		}	
}
browsers that support
multiple backgrounds
also support SVG
PERFORMANCE AS USER EXPERIENCE
Conditional animation
PERFORMANCE AS USER EXPERIENCE
How do we get there?
JS?
No
No imageLoad
Yes
<>
SVG support?
Yes
SVG
Ajax request SVG

Yank out script & add to document
No
picture
Save the markup for

next page load
NoYes
Verify browser
width condition
Step 6:

Only load assets
when they add value
PERFORMANCE AS USER EXPERIENCE
Evaluate images case-by-case
๏ Does the image reiterate information found in the surrounding text?
๏ Is the image necessary to understand the surrounding content?
๏ Does the image contain text?
๏ Is the image a graph, chart, or table?
๏ Could the content of the image be presented in a different format
that would not require an image?
๏ Is the image purely presentational?
111
PERFORMANCE AS USER EXPERIENCE
53% of the average web page
Source: Internet Archive
PERFORMANCE AS USER EXPERIENCE
And they don’t always fit
Source: The Outline
If you can avoid

using an image, do it
If you need an image,
choose the best format
PERFORMANCE AS USER EXPERIENCE
Quick format recap
๏ GIF
‣ for images with large swaths of solid colors
‣ Binary transparency
๏ JPG
‣ For photographs and images with gradations of color
‣ Can be compressed (introduces artifacts)
117
PERFORMANCE AS USER EXPERIENCE
Quick format recap
๏ PNG (8-Bit)
‣ Alternative to GIF
‣ Can support alpha transparency (with the right creation software)
๏ PNG (24-bit)
‣ Alternative to JPG
‣ Usually larger than JPGs
‣ Supports alpha tranparency
118
PERFORMANCE AS USER EXPERIENCE
Quick format recap
๏ WebP
‣ Newer format, not universally supported
‣ Smaller than JPGs and 24-bit PNGs
‣ Support alpha transparency
‣ and so much more…
119
Sometimes images

are “nice to have”
that’s 29 kB of images
PERFORMANCE AS USER EXPERIENCE
How it works
<li	class="gallery__item	h-card"

				data-img="/i/j/r.jpg||y"

				>	
		<a	href="https://twitter.com/rachelandrew">

				<b>Rachel	Andrew</b>

		</a>	
</li>
PERFORMANCE AS USER EXPERIENCE
How it works
<li	class="gallery__item	h-card"

				data-img="/i/j/r.jpg||y"

				>	
		<a	href="https://twitter.com/rachelandrew">

				<b>Rachel	Andrew</b>

		</a>	
</li>
image path
no alt necessary
prepend to

this list item
PERFORMANCE AS USER EXPERIENCE
Getting CSS & JS in sync
var	$watcher	=	document.createElement('div'),	
				re	=	/['"]/g;	
$watcher.setAttribute(	'id',	'getActiveMQ-watcher'	);	
$watcher.style.display	=	'none';	
document.body.appendChild(	$watcher	);	
window.getActiveMQ	=	function()	{	
		return	window.getComputedStyle(	$watcher,	null	)	
															.getPropertyValue(	'font-family'	)	
															.replace(	re,	''	);	
};
PERFORMANCE AS USER EXPERIENCE
Getting CSS & JS in sync
#getActiveMQ-watcher	{	font-family:	global;	}	
@media	(min-width:	15em)	{	
		#getActiveMQ-watcher	{	font-family:	tiny;	}	
}	
@media	(min-width:	20em)	{	
		#getActiveMQ-watcher	{	font-family:	small;	}	
}	
@media	(min-width:	30em)	{	
		#getActiveMQ-watcher	{	font-family:	medium;	}	
}	
@media	(min-width:	40em)	{	
		#getActiveMQ-watcher	{	font-family:	large;	}	
}	
@media	(min-width:	48.75em)	{	
		#getActiveMQ-watcher	{	font-family:	larger;	}	
}	
@media	(min-width:	60em)	{	
		#getActiveMQ-watcher	{	font-family:	full;	}	
}
PERFORMANCE AS USER EXPERIENCE
Getting CSS & JS in sync
#getActiveMQ-watcher	{	font-family:	global;	}	
@media	(min-width:	15em)	{	
		#getActiveMQ-watcher	{	font-family:	tiny;	}	
}	
@media	(min-width:	20em)	{	
		#getActiveMQ-watcher	{	font-family:	small;	}	
}	
@media	(min-width:	30em)	{	
		#getActiveMQ-watcher	{	font-family:	medium;	}	
}	
@media	(min-width:	40em)	{	
		#getActiveMQ-watcher	{	font-family:	large;	}	
}	
@media	(min-width:	48.75em)	{	
		#getActiveMQ-watcher	{	font-family:	larger;	}	
}	
@media	(min-width:	60em)	{	
		#getActiveMQ-watcher	{	font-family:	full;	}	
}
PERFORMANCE AS USER EXPERIENCE
Getting CSS & JS in sync
var	$watcher	=	document.createElement('div'),	
				re	=	/['"]/g;	
$watcher.setAttribute(	'id',	'getActiveMQ-watcher'	);	
$watcher.style.display	=	'none';	
document.body.appendChild(	$watcher	);	
window.getActiveMQ	=	function()	{	
		return	window.getComputedStyle(	$watcher,	null	)	
															.getPropertyValue(	'font-family'	)	
															.replace(	re,	''	);	
};
PERFORMANCE AS USER EXPERIENCE
Getting CSS & JS in sync
var	MQ	=	getActiveMQ();	
if	(	MQ	==	'larger'	||	MQ	==	'full'	)	{	
		lazyLoadImages();	
}
PERFORMANCE AS USER EXPERIENCE
How it works
<li	class="gallery__item	h-card"

				data-img="/i/j/r.jpg||y"

				>	
		<a	href="https://twitter.com/rachelandrew">

				<b>Rachel	Andrew</b>

		</a>	
</li>
PERFORMANCE AS USER EXPERIENCE
Indicating alternate formats
<li	class="gallery__item	h-card"

				data-img="/i/j/r.jpg||y"

				data-imaged="true"

				>

		<img	src="/i/j/r.jpg"	alt="">

		<a	href="https://twitter.com/rachelandrew">

				<b>Rachel	Andrew</b>

		</a>	
</li>
Oh wait…
optimize everything
Source: 38 kB JPG
B&W: 35 kB JPG (-7%)
Crop & Resize: 12 kB JPG (-68%)
Blur & optimize: 9 kB JPG (-76%)
blurred everything

but their faces
WebP: 4 kB (-89%)JPG: 9 kB (-76%)
!

Not every browser

supports WebP
PERFORMANCE AS USER EXPERIENCE
Indicating alternate formats
<picture>	
		<source	type="image/webp"	srcset="my.webp">

		<img	src="my.jpg"	alt="Alt	text	goes	here">	
</picture>
first choice if
WebP is supported fallback image

if it isn’t
PERFORMANCE AS USER EXPERIENCE
Indicating alternate formats
<picture>	
		<source	type="image/svg+xml"

										srcset="my.svg">	
		<source	type="image/webp"	srcset="my.webp">

		<img	src="my.jpg"	alt="Alt	text	goes	here">	
</picture>
PERFORMANCE AS USER EXPERIENCE
Indicating alternate formats
<li	class="gallery__item	h-card"

				data-img="/i/j/r.jpg||y"

				data-imaged="true"

				>

		<img	src="/i/j/r.jpg"	alt="">

		<a	href="https://twitter.com/rachelandrew">

				<b>Rachel	Andrew</b>

		</a>	
</li>
PERFORMANCE AS USER EXPERIENCE
Indicating alternate formats
<li	class="gallery__item	h-card"

				data-img="/i/j/r.jpg||y"

				data-imaged="true"

				>

		<picture>

				<source	type="image/webp"

												srcset="/i/j/r.webp">

				<img	src="/i/j/r.jpg"	alt="">

		</picture>	
		<a	href="https://twitter.com/rachelandrew">

				<b>Rachel	Andrew</b>

		</a>	
</li>
PERFORMANCE AS USER EXPERIENCE
Steps for better performance
1. Use native features whenever possible
2. Only include assets you actually need
3. Optimize everything
4. Think about when you load assets
5. Consider how you load assets
6. Only load assets when they add value
146
Every choice we

make affects our

users’ experiences
Let’s spend our time to

save it for our users
Speedy performance is

a great user experience
Thank you!
@AaronGustafson
aaron-gustafson.com	
slideshare.net/AaronGustafson

Contenu connexe

Tendances

Bruce Lawson: Progressive Web Apps: the future of Apps
Bruce Lawson: Progressive Web Apps: the future of AppsBruce Lawson: Progressive Web Apps: the future of Apps
Bruce Lawson: Progressive Web Apps: the future of Appsbrucelawson
 
Extreme Web Performance for Mobile Devices - Velocity NY
Extreme Web Performance for Mobile Devices - Velocity NYExtreme Web Performance for Mobile Devices - Velocity NY
Extreme Web Performance for Mobile Devices - Velocity NYMaximiliano Firtman
 
Template tuning for high performance
Template tuning for high performanceTemplate tuning for high performance
Template tuning for high performanceChris Davenport
 
High Performance Web Design
High Performance Web DesignHigh Performance Web Design
High Performance Web DesignKoji Ishimoto
 
Belgrade when its just too slow
Belgrade when its just too slowBelgrade when its just too slow
Belgrade when its just too slowDoug Sillars
 
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...Shift Conference
 
Front end performance tip
Front end performance tipFront end performance tip
Front end performance tipSteve Yu
 
Front end performance optimization
Front end performance optimizationFront end performance optimization
Front end performance optimizationStevie T
 
Nl when its just too slow
Nl when its just too slowNl when its just too slow
Nl when its just too slowDoug Sillars
 
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]Mindfire Solutions
 
Responsive Responsive Design
Responsive Responsive DesignResponsive Responsive Design
Responsive Responsive DesignTim Kadlec
 
Qa fest kiev_when its just too slow
Qa fest kiev_when its just too slowQa fest kiev_when its just too slow
Qa fest kiev_when its just too slowDoug Sillars
 
Web Development for UX Designers
Web Development for UX DesignersWeb Development for UX Designers
Web Development for UX DesignersAshlimarie
 

Tendances (19)

Bruce Lawson: Progressive Web Apps: the future of Apps
Bruce Lawson: Progressive Web Apps: the future of AppsBruce Lawson: Progressive Web Apps: the future of Apps
Bruce Lawson: Progressive Web Apps: the future of Apps
 
Extreme Web Performance for Mobile Devices - Velocity NY
Extreme Web Performance for Mobile Devices - Velocity NYExtreme Web Performance for Mobile Devices - Velocity NY
Extreme Web Performance for Mobile Devices - Velocity NY
 
Template tuning for high performance
Template tuning for high performanceTemplate tuning for high performance
Template tuning for high performance
 
High Performance Web Design
High Performance Web DesignHigh Performance Web Design
High Performance Web Design
 
Belgrade when its just too slow
Belgrade when its just too slowBelgrade when its just too slow
Belgrade when its just too slow
 
Using Wireframes
Using WireframesUsing Wireframes
Using Wireframes
 
Seven deadly theming sins
Seven deadly theming sinsSeven deadly theming sins
Seven deadly theming sins
 
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...
 
Site optimization
Site optimizationSite optimization
Site optimization
 
Front end performance tip
Front end performance tipFront end performance tip
Front end performance tip
 
Optimizing wp
Optimizing wpOptimizing wp
Optimizing wp
 
Front end performance optimization
Front end performance optimizationFront end performance optimization
Front end performance optimization
 
Nl when its just too slow
Nl when its just too slowNl when its just too slow
Nl when its just too slow
 
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]
 
Front End Performance
Front End PerformanceFront End Performance
Front End Performance
 
Modelling Web Performance Optimization - FFSUx
Modelling  Web Performance Optimization - FFSUxModelling  Web Performance Optimization - FFSUx
Modelling Web Performance Optimization - FFSUx
 
Responsive Responsive Design
Responsive Responsive DesignResponsive Responsive Design
Responsive Responsive Design
 
Qa fest kiev_when its just too slow
Qa fest kiev_when its just too slowQa fest kiev_when its just too slow
Qa fest kiev_when its just too slow
 
Web Development for UX Designers
Web Development for UX DesignersWeb Development for UX Designers
Web Development for UX Designers
 

Similaire à Performance as User Experience [AEA SEA 2018]

Ajax to the Moon
Ajax to the MoonAjax to the Moon
Ajax to the Moondavejohnson
 
[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web Design[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web DesignChristopher Schmitt
 
It's a Mod World - A Practical Guide to Rocking Modernizr
It's a Mod World - A Practical Guide to Rocking ModernizrIt's a Mod World - A Practical Guide to Rocking Modernizr
It's a Mod World - A Practical Guide to Rocking ModernizrMichael Enslow
 
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3Jamie Matthews
 
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012 Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012 Atlassian
 
Socket applications
Socket applicationsSocket applications
Socket applicationsJoão Moura
 
3 Tips to Deliver Fast Performance Across Mobile Web
3 Tips to Deliver Fast Performance Across Mobile Web3 Tips to Deliver Fast Performance Across Mobile Web
3 Tips to Deliver Fast Performance Across Mobile WebDynatrace
 
SPA, isomorphic and back to the server: our journey with JavaScript @ JsDay 2...
SPA, isomorphic and back to the server: our journey with JavaScript @ JsDay 2...SPA, isomorphic and back to the server: our journey with JavaScript @ JsDay 2...
SPA, isomorphic and back to the server: our journey with JavaScript @ JsDay 2...Alessandro Nadalin
 
jAPS 2 0 - Presentation Layer Comparison
jAPS 2 0 - Presentation Layer ComparisonjAPS 2 0 - Presentation Layer Comparison
jAPS 2 0 - Presentation Layer ComparisonWilliam Ghelfi
 
Testable client side_mvc_apps_in_javascript
Testable client side_mvc_apps_in_javascriptTestable client side_mvc_apps_in_javascript
Testable client side_mvc_apps_in_javascriptTimothy Oxley
 
[cssdevconf] Adaptive Images in Responsive Web Design
[cssdevconf] Adaptive Images in Responsive Web Design[cssdevconf] Adaptive Images in Responsive Web Design
[cssdevconf] Adaptive Images in Responsive Web DesignChristopher Schmitt
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
Introduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint WorkshopIntroduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint WorkshopMark Rackley
 
Developing High Performance Web Apps
Developing High Performance Web AppsDeveloping High Performance Web Apps
Developing High Performance Web AppsTimothy Fisher
 
Web Performance, Scalability, and Testing Techniques - Boston PHP Meetup
Web Performance, Scalability, and Testing Techniques - Boston PHP MeetupWeb Performance, Scalability, and Testing Techniques - Boston PHP Meetup
Web Performance, Scalability, and Testing Techniques - Boston PHP MeetupJonathan Klein
 
[refreshaustin] Adaptive Images in Responsive Web Design
[refreshaustin] Adaptive Images in Responsive Web Design[refreshaustin] Adaptive Images in Responsive Web Design
[refreshaustin] Adaptive Images in Responsive Web DesignChristopher Schmitt
 
[HEWEBAR 2012] Adaptive Images in Responsive Web Design
[HEWEBAR 2012] Adaptive Images in Responsive Web Design[HEWEBAR 2012] Adaptive Images in Responsive Web Design
[HEWEBAR 2012] Adaptive Images in Responsive Web DesignChristopher Schmitt
 

Similaire à Performance as User Experience [AEA SEA 2018] (20)

Ajax to the Moon
Ajax to the MoonAjax to the Moon
Ajax to the Moon
 
[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web Design[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web Design
 
It's a Mod World - A Practical Guide to Rocking Modernizr
It's a Mod World - A Practical Guide to Rocking ModernizrIt's a Mod World - A Practical Guide to Rocking Modernizr
It's a Mod World - A Practical Guide to Rocking Modernizr
 
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
 
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012 Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
 
Socket applications
Socket applicationsSocket applications
Socket applications
 
3 Tips to Deliver Fast Performance Across Mobile Web
3 Tips to Deliver Fast Performance Across Mobile Web3 Tips to Deliver Fast Performance Across Mobile Web
3 Tips to Deliver Fast Performance Across Mobile Web
 
Faster web pages
Faster web pagesFaster web pages
Faster web pages
 
SPA, isomorphic and back to the server: our journey with JavaScript @ JsDay 2...
SPA, isomorphic and back to the server: our journey with JavaScript @ JsDay 2...SPA, isomorphic and back to the server: our journey with JavaScript @ JsDay 2...
SPA, isomorphic and back to the server: our journey with JavaScript @ JsDay 2...
 
jAPS 2 0 - Presentation Layer Comparison
jAPS 2 0 - Presentation Layer ComparisonjAPS 2 0 - Presentation Layer Comparison
jAPS 2 0 - Presentation Layer Comparison
 
Testable client side_mvc_apps_in_javascript
Testable client side_mvc_apps_in_javascriptTestable client side_mvc_apps_in_javascript
Testable client side_mvc_apps_in_javascript
 
[cssdevconf] Adaptive Images in Responsive Web Design
[cssdevconf] Adaptive Images in Responsive Web Design[cssdevconf] Adaptive Images in Responsive Web Design
[cssdevconf] Adaptive Images in Responsive Web Design
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
Introduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint WorkshopIntroduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint Workshop
 
Oscon 20080724
Oscon 20080724Oscon 20080724
Oscon 20080724
 
Developing High Performance Web Apps
Developing High Performance Web AppsDeveloping High Performance Web Apps
Developing High Performance Web Apps
 
Microformats
MicroformatsMicroformats
Microformats
 
Web Performance, Scalability, and Testing Techniques - Boston PHP Meetup
Web Performance, Scalability, and Testing Techniques - Boston PHP MeetupWeb Performance, Scalability, and Testing Techniques - Boston PHP Meetup
Web Performance, Scalability, and Testing Techniques - Boston PHP Meetup
 
[refreshaustin] Adaptive Images in Responsive Web Design
[refreshaustin] Adaptive Images in Responsive Web Design[refreshaustin] Adaptive Images in Responsive Web Design
[refreshaustin] Adaptive Images in Responsive Web Design
 
[HEWEBAR 2012] Adaptive Images in Responsive Web Design
[HEWEBAR 2012] Adaptive Images in Responsive Web Design[HEWEBAR 2012] Adaptive Images in Responsive Web Design
[HEWEBAR 2012] Adaptive Images in Responsive Web Design
 

Plus de Aaron Gustafson

Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]Aaron Gustafson
 
Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]Aaron Gustafson
 
Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]Aaron Gustafson
 
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]Aaron Gustafson
 
Progressive Web Apps: Where Do I Begin?
Progressive Web Apps: Where Do I Begin?Progressive Web Apps: Where Do I Begin?
Progressive Web Apps: Where Do I Begin?Aaron Gustafson
 
Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]Aaron Gustafson
 
Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]Aaron Gustafson
 
Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]Aaron Gustafson
 
PWA: Where Do I Begin? [Microsoft Ignite 2018]
PWA: Where Do I Begin? [Microsoft Ignite 2018]PWA: Where Do I Begin? [Microsoft Ignite 2018]
PWA: Where Do I Begin? [Microsoft Ignite 2018]Aaron Gustafson
 
Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]Aaron Gustafson
 
Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]Aaron Gustafson
 
The Web Should Just Work for Everyone
The Web Should Just Work for EveryoneThe Web Should Just Work for Everyone
The Web Should Just Work for EveryoneAaron Gustafson
 
Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]Aaron Gustafson
 
Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2Aaron Gustafson
 
Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1Aaron Gustafson
 
Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]Aaron Gustafson
 
Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]Aaron Gustafson
 
Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]Aaron Gustafson
 
Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]Aaron Gustafson
 
Designing the Conversation [SmashingConf 2016]
Designing the Conversation [SmashingConf 2016]Designing the Conversation [SmashingConf 2016]
Designing the Conversation [SmashingConf 2016]Aaron Gustafson
 

Plus de Aaron Gustafson (20)

Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]
 
Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]
 
Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]
 
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
 
Progressive Web Apps: Where Do I Begin?
Progressive Web Apps: Where Do I Begin?Progressive Web Apps: Where Do I Begin?
Progressive Web Apps: Where Do I Begin?
 
Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]
 
Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]
 
Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]
 
PWA: Where Do I Begin? [Microsoft Ignite 2018]
PWA: Where Do I Begin? [Microsoft Ignite 2018]PWA: Where Do I Begin? [Microsoft Ignite 2018]
PWA: Where Do I Begin? [Microsoft Ignite 2018]
 
Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]
 
Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]
 
The Web Should Just Work for Everyone
The Web Should Just Work for EveryoneThe Web Should Just Work for Everyone
The Web Should Just Work for Everyone
 
Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]
 
Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2
 
Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1
 
Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]
 
Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]
 
Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]
 
Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]
 
Designing the Conversation [SmashingConf 2016]
Designing the Conversation [SmashingConf 2016]Designing the Conversation [SmashingConf 2016]
Designing the Conversation [SmashingConf 2016]
 

Dernier

DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditSkynet Technologies
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 

Dernier (20)

DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance Audit
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 

Performance as User Experience [AEA SEA 2018]

  • 1. Performance
 as User Experience Aaron Gustafson @AaronGustafson slideshare.net/AaronGustafson
  • 3. JEFF VEEN “I’ve been amazed at how often those outside the discipline of design assume that what designers do is decoration— likely because so much bad design
 simply is decoration. Good design isn’t.
 Good design is problem solving.”
  • 5. PERFORMANCE AS USER EXPERIENCE Hallmarks of Good UX ๏ Streamlined flow ๏ Clear, concise copy ๏ Low cognitive load ๏ Fast performance 5
  • 6.
  • 9. A 1s delay in page
 load can reduce
 conversions by 7% Source: Kissmetrics
  • 10. For an online shop earning $100k/day, that’s about $2.5m in lost sales Source: Kissmetrics
  • 11. For Amazon, 1s is worth
 about $1.6b in sales Source: HubSpot
  • 13. 53% abandon
 websites that take
 more than 3s to load Source: Google
  • 14. By shaving 7s off load, Edmunds increased
 page views by 17%
 & ad revenue by 3% Source: HubSpot
  • 15. Mozilla reduced page load by 2.2s and saw a 15.4% increase in downloads Source: HubSpot
  • 17.
  • 18. PERFORMANCE AS USER EXPERIENCE What we were looking for ๏ Usable pages are delivered in 10kB or less ๏ Pages are accessible via screen readers, the keyboard, etc. ๏ Entries follow the philosophy of progressive enhancement ๏ Users can do what they need to without JavaScript 18
  • 21. time Your Device The Web Where can I find a-k-apart.com? DNS Lookup  Icons by Mahmure Alp
  • 22. time Your Device The Web Where can I find a-k-apart.com? It’s at 40.77.56.174 DNS Lookup  Icons by Mahmure Alp
  • 23. time Your Device The Web Where can I find a-k-apart.com? It’s at 40.77.56.174 TCP Handshake Hello 40.77.56.174  Icons by Mahmure Alp
  • 24. time Your Device The Web Where can I find a-k-apart.com? It’s at 40.77.56.174 TCP Handshake Hello 40.77.56.174 Howdy!  Icons by Mahmure Alp
  • 25. time Your Device The Web Where can I find a-k-apart.com? It’s at 40.77.56.174 Request Hello 40.77.56.174 Howdy! I’d like /index.html  Icons by Mahmure Alp
  • 26. time Your Device The Web Where can I find a-k-apart.com? It’s at 40.77.56.174 Server Processing Hello 40.77.56.174 Howdy! I’d like /index.html  Icons by Mahmure Alp
  • 27. time Your Device The Web Where can I find a-k-apart.com? It’s at 40.77.56.174 Response Hello 40.77.56.174 Howdy! I’d like /index.html Ok, here it is.  Icons by Mahmure Alp
  • 29.  Icons by Mahmure Alp Response Load Paint Layout RenderTree CSS DOM
  • 30.  Icons by Mahmure Alp Response Load Paint Layout RenderTree CSS DOM CSS & JavaScript can delay rendering or cause these to be run again
  • 31. PERFORMANCE AS USER EXPERIENCE DOM Parsing <html> <head> <title>Silly example</title> <script src="head.js"></script> <link rel="stylesheet" href="main.css"> <style>h2 { font-wight: bold; }</style> <script>console.log('hi');</script> </head> <body> <img src="my.png" alt=""> <script src="body.js"></script> </body> </html> wait while the browser
 fetches & parses the script
  • 32. PERFORMANCE AS USER EXPERIENCE DOM Parsing <html> <head> <title>Silly example</title> <script src="head.js"></script> <link rel="stylesheet" href="main.css"> <style>h2 { font-wight: bold; }</style> <script>console.log('hi');</script> </head> <body> <img src="my.png" alt=""> <script src="body.js"></script> </body> </html> wait while the browser
 fetches & parses the CSS
  • 33. PERFORMANCE AS USER EXPERIENCE DOM Parsing <html> <head> <title>Silly example</title> <script src="head.js"></script> <link rel="stylesheet" href="main.css"> <style>h2 { font-wight: bold; }</style> <script>console.log('hi');</script> </head> <body> <img src="my.png" alt=""> <script src="body.js"></script> </body> </html> kicks off downloading
 the image
  • 34. PERFORMANCE AS USER EXPERIENCE DOM Parsing <html> <head> <title>Silly example</title> <script src="head.js"></script> <link rel="stylesheet" href="main.css"> <style>h2 { font-wight: bold; }</style> <script>console.log('hi');</script> </head> <body> <img src="my.png" alt=""> <script src="body.js"></script> </body> </html> wait while the browser
 fetches & parses the script
  • 35. PERFORMANCE AS USER EXPERIENCE Steps for better performance 1. Use native features whenever possible 2. Only include assets you actually need 3. Optimize everything 4. Think about when you load assets 5. Consider how you load assets 6. Only load assets when they add value 43
  • 36. Step 1:
 Use native features
 whenever possible
  • 38. PERFORMANCE AS USER EXPERIENCE Por exemplo <header> Header content… </header> not only shorter than
 <div id=“header">, but
 semantic too depending on its location
in the document, could also
provide a landmark
for navigation
  • 39. PERFORMANCE AS USER EXPERIENCE Por exemplo <input id="n" name="n" required aria-required="true" autocorrect="off"
 autocapitalize="words" placeholder="Sir Tim Berners Lee" autocomplete="name" > modern browsers require
 users to enter content browser can inform
 assistive tech that
 the field is required don’t let the browser
try to correct
someone’s name auto-disappearing suggestion
without JavaScript if the browser already
 knows the user’s name,
 by all means, let it fill it in
  • 40. PERFORMANCE AS USER EXPERIENCE Por exemplo <input type="email"
 id="e" name="e"
 required aria-required="true"
 autocorrect="off"
 autocapitalize="off"
 autocomplete="email"
 placeholder="you@yourdomain.tld"
 > modern browsers validate
 the email address
 and may supply a
 custom keyboard layout let the browser suggest
 an email address if it has one
  • 41. PERFORMANCE AS USER EXPERIENCE Por exemplo @media (min-width:600px) {
 .layout-container { display: flex; } .primary {
 width: 68%;
 }
 .secondary {
 width: 32%;
 }
 } So much better than floats
  • 42. PERFORMANCE AS USER EXPERIENCE Por exemplo var $radios = document.querySelectorAll( 'input[type=radio]' ); CSS selector-based
 DOM traversal
 without a JS library
  • 43. PERFORMANCE AS USER EXPERIENCE Por exemplo font-family: Georgia, Times,
 "Times New Roman", serif font-family: "Segoe UI", Frutiger,
 "Frutiger Linotype",
 "Dejavu Sans", "Helvetica Neue",
 Arial, sans-serif; Serif Sans Serif
  • 44.
  • 45. If you need
 a custom font:
 subset, subset, subset
  • 46. PERFORMANCE AS USER EXPERIENCE Proceed with caution Source: Bran Stein
  • 47. Step 2:
 Only include assets
 you actually need
  • 49. PERFORMANCE AS USER EXPERIENCE Every tool has a cost Framework Size (Compressed) Bootstrap 2 149 kB Bootstrap 3 103 kB Angular 1.4 51 kB Ember 2.2.0 111 kB Foundation 4 266 kB jQuery 32 kB UI Kit 86 kB React 16 + React DOM 35 kB Vue 2.4.2 20 kB
  • 50. Chances are, your
 library of choice
 is on a CDN
  • 51. time Your Device The Web Where can I find cdn.foo.com? It’s at 123.45.67.89 Hello 123.45.67.89 Howdy! I’d like /jquery.min.js Ok, here it is.  Icons by Mahmure Alp
  • 52. time Your Device The Web Where can I find cdn.foo.com? It’s at 123.45.67.89  Icons by Mahmure Alp You can optimize this
  • 53. PERFORMANCE AS USER EXPERIENCE Find the server early <link rel="dns-prefetch"
 href="https://cdn.foo.com"> Drop this in the
 head of your pages
  • 54. time Your Device The Web Where can I find cdn.foo.com? It’s at 123.45.67.89 Hello 123.45.67.89 Howdy!  Icons by Mahmure Alp You can optimize this
  • 55. PERFORMANCE AS USER EXPERIENCE Go for the handshake <link rel="preconnect"
 href="https://cdn.foo.com">
  • 56. time Your Device The Web I’d like /jquery.min.js Ok, here it is.  Icons by Mahmure Alp You can even optimize this
  • 57. PERFORMANCE AS USER EXPERIENCE Grab that resource <link rel="preload"
 href="https://cdn.foo.com/jquery.min.js"
 as="script"> Helps optimize the process
  • 58. PERFORMANCE AS USER EXPERIENCE Download isn’t everything Source: The Filament Group
  • 59. PERFORMANCE AS USER EXPERIENCE Download isn’t everything Framework Method/function operations/s Vanilla JS document.getElementById() 12,137,211 Dojo dojo.byId(); 5,443,343 Prototype $() 2,940,734 Ext JS Ext.get() 997,562 jQuery $() 350,557 YUI YAHOO.util.Dom.get() 326,534 MooTools document.id() 78,802 Source: VanillaJS
  • 61. PERFORMANCE AS USER EXPERIENCE We used some hints though <link rel="preconnect"
 href="//10kapart.blob.core.windows.net"> <link rel="preconnect"
 href="//cdnjs.cloudflare.com"> <link rel="preconnect"
 href="//www.google-analytics.com">
  • 63. PERFORMANCE AS USER EXPERIENCE Our approach to CSS (Gulp) 1. Write modular CSS in Sass (+ Breakup for MQ management) 2. Compile CSS with a precision of 4 decimal places (gulp-sass) 3. Fallbacks for the last 2 browser versions (gulp-autoprefixer) 4. CSS shorthand declarations if possible (gulp-shorthand) 5. Remove any unused declarations/rule sets (gulp-uncss) 6. Optimize the files (gulp-csso) 7. Minify (gulp-clean-css) 8. Gzip (gulp-zopfli) 9. Brotli (gulp-brotli) 71
  • 64. PERFORMANCE AS USER EXPERIENCE Before
  • 65. PERFORMANCE AS USER EXPERIENCE After
  • 66. PERFORMANCE AS USER EXPERIENCE After everyone else
 8 kB browsers that support
 brotli compression
 2 kB browsers that support
gzip compression
3 kB
  • 67. PERFORMANCE AS USER EXPERIENCE Our approach to JS (Gulp) 1. Write modular JavaScript, grouped as appropriate 2. Combine files based on folder structure (gulp-folders, gulp-concat) 3. Create an wrapping closure to isolate from other JS (gulp-insert) 4. Minify (gulp-uglify) 5. Gzip (gulp-zopfli) 6. Brotli (gulp-brotli) 74
  • 68. PERFORMANCE AS USER EXPERIENCE Results about 8 kB all-up 4 kB 1 kB 2 kB
  • 69. PERFORMANCE AS USER EXPERIENCE Interesting side note indexes last indexes first
  • 70. We also minified
 & pre-compressed
 our HTML
  • 71. Step 4:
 Think about when
 you load assets
  • 72. PERFORMANCE AS USER EXPERIENCE We had 10 JS files ๏ Global ‣ main.js - the site’s library ‣ serviceworker.js - The site’s service worker ๏ Browser-specific ‣ html5shiv.js - local copy of the HTML5 Shiv for < IE9 79
  • 73. PERFORMANCE AS USER EXPERIENCE We had 10 JS files ๏ Page-specific ‣ enter.js - Entry form-related code ‣ form-saver.js - Used to save form entries locally until submitted ‣ hero.js - Runs the SVG animation on the homepage ‣ home.js - Handles homepage-specific tasks ‣ project.js - Used on project pages during voting ‣ update.js - Handles the winner update form 80
  • 74. PERFORMANCE AS USER EXPERIENCE Per the common wisdom <script src="/j/main.min.js"></script>
 </body>
 </html>
  • 75. PERFORMANCE AS USER EXPERIENCE No need to run immediately <script src="/j/main.min.js"></script>
 <script src="/j/home.min.js"
 defer
 ></script>
 </body>
 </html> run after the DOM is loaded
  • 76. PERFORMANCE AS USER EXPERIENCE Run whenever you can <script src="/j/main.min.js"></script>
 <script src="/j/home.min.js"
 async
 ></script>
 </body>
 </html> run whenever it becomes
 available, but don’t
 delay page load
  • 77. PERFORMANCE AS USER EXPERIENCE Consider dependencies <script src="/j/main.min.js"></script>
 <script src="/j/home.min.js" async></script>
  • 78. PERFORMANCE AS USER EXPERIENCE Consider dependencies <script src="/j/main.min.js" async></script>
 <script src="/j/home.min.js" async></script> what if this calls a function
 in main.min.js?
  • 80. PERFORMANCE AS USER EXPERIENCE Avoid race conditions <script src="/j/main.min.js"></script>
 <script src="/j/home.min.js" async></script>
  • 82. PERFORMANCE AS USER EXPERIENCE Connections in HTTP/1.1 Browser Per host Overall IE 9 6 35 IE 10 8 17 IE 11 13 17 Firefox 4+ 6 17 Opera 11+ 6 user defined Chrome 4+ 6 10 Safari 7+ 6 17
  • 83. time Your Device The Web HTTP/1.1  Icons by Mahmure Alp I’d like /c/main.css I’d like /j/main.min.js I’d like /i/o.svg I’d like /j/home.min.js I’d like /i/edge.svg I’d like /i/aea.svg
  • 84. HTTP/2 creates
 a single connection and contents stream in
  • 85. time Your Device The Web HTTP/2  Icons by Mahmure Alp I’d like /c/main.css I’d like /i/o.svg I’d like /i/edge.svg
  • 86. Source: A List Apart
  • 87. Source: A List Apart
  • 89. PERFORMANCE AS USER EXPERIENCE Start simple <link rel="stylesheet" href="/c/d.min.css"> <link rel="stylesheet" href="/c/a.min.css"
 media="only screen"> default styles
(all browsers) advanced styles
 (modern browsers)
  • 90. PERFORMANCE AS USER EXPERIENCE Fault tolerance FTW! <link rel="stylesheet" href="/c/d.min.css"> <link rel="stylesheet" href="/c/a.min.css"
 media="only screen"> browsers that don’t grok
 media queries ignore this file
  • 91. PERFORMANCE AS USER EXPERIENCE Conditional scripting <!--[if lt IE 9]> <script src="/j/html5shiv.min.js"></script> <![endif]--> delivers this script
 to <= IE 8
  • 92. PERFORMANCE AS USER EXPERIENCE Conditional scripting <!--[if gt IE 8]><!-->
 <script src="/j/main.min.js"></script>
 <script src="/j/home.min.js" async
 ></script>
 <!--<![endif]-->
 </body>
 </html> hides scripts from <= IE8
(no need to test!)
  • 93. PERFORMANCE AS USER EXPERIENCE Conditional imagery
  • 94. PERFORMANCE AS USER EXPERIENCE Conditional images @media (min-width: 36.375em) { .presented-by [href*=microsoft]::before { background-image: url(/i/c/edge.png); background-image: url(/i/c/edge.svg),
 none;
 … } }
  • 95. PERFORMANCE AS USER EXPERIENCE Conditional images @media (min-width: 36.375em) { .presented-by [href*=microsoft]::before { background-image: url(/i/c/edge.png); background-image: url(/i/c/edge.svg),
 none;
 … } }
  • 96. PERFORMANCE AS USER EXPERIENCE Conditional images @media (min-width: 36.375em) { .presented-by [href*=microsoft]::before { background-image: url(/i/c/edge.png); background-image: url(/i/c/edge.svg),
 none;
 … } } browsers that support
multiple backgrounds
also support SVG
  • 97. PERFORMANCE AS USER EXPERIENCE Conditional animation
  • 98. PERFORMANCE AS USER EXPERIENCE How do we get there? JS? No No imageLoad Yes <> SVG support? Yes SVG Ajax request SVG
 Yank out script & add to document No picture Save the markup for
 next page load NoYes Verify browser width condition
  • 99. Step 6:
 Only load assets when they add value
  • 100.
  • 101.
  • 102. PERFORMANCE AS USER EXPERIENCE Evaluate images case-by-case ๏ Does the image reiterate information found in the surrounding text? ๏ Is the image necessary to understand the surrounding content? ๏ Does the image contain text? ๏ Is the image a graph, chart, or table? ๏ Could the content of the image be presented in a different format that would not require an image? ๏ Is the image purely presentational? 111
  • 103. PERFORMANCE AS USER EXPERIENCE 53% of the average web page Source: Internet Archive
  • 104. PERFORMANCE AS USER EXPERIENCE And they don’t always fit
  • 106. If you can avoid
 using an image, do it
  • 107. If you need an image, choose the best format
  • 108. PERFORMANCE AS USER EXPERIENCE Quick format recap ๏ GIF ‣ for images with large swaths of solid colors ‣ Binary transparency ๏ JPG ‣ For photographs and images with gradations of color ‣ Can be compressed (introduces artifacts) 117
  • 109. PERFORMANCE AS USER EXPERIENCE Quick format recap ๏ PNG (8-Bit) ‣ Alternative to GIF ‣ Can support alpha transparency (with the right creation software) ๏ PNG (24-bit) ‣ Alternative to JPG ‣ Usually larger than JPGs ‣ Supports alpha tranparency 118
  • 110. PERFORMANCE AS USER EXPERIENCE Quick format recap ๏ WebP ‣ Newer format, not universally supported ‣ Smaller than JPGs and 24-bit PNGs ‣ Support alpha transparency ‣ and so much more… 119
  • 112. that’s 29 kB of images
  • 113.
  • 114. PERFORMANCE AS USER EXPERIENCE How it works <li class="gallery__item h-card"
 data-img="/i/j/r.jpg||y"
 > <a href="https://twitter.com/rachelandrew">
 <b>Rachel Andrew</b>
 </a> </li>
  • 115. PERFORMANCE AS USER EXPERIENCE How it works <li class="gallery__item h-card"
 data-img="/i/j/r.jpg||y"
 > <a href="https://twitter.com/rachelandrew">
 <b>Rachel Andrew</b>
 </a> </li> image path no alt necessary prepend to
 this list item
  • 116. PERFORMANCE AS USER EXPERIENCE Getting CSS & JS in sync var $watcher = document.createElement('div'), re = /['"]/g; $watcher.setAttribute( 'id', 'getActiveMQ-watcher' ); $watcher.style.display = 'none'; document.body.appendChild( $watcher ); window.getActiveMQ = function() { return window.getComputedStyle( $watcher, null ) .getPropertyValue( 'font-family' ) .replace( re, '' ); };
  • 117. PERFORMANCE AS USER EXPERIENCE Getting CSS & JS in sync #getActiveMQ-watcher { font-family: global; } @media (min-width: 15em) { #getActiveMQ-watcher { font-family: tiny; } } @media (min-width: 20em) { #getActiveMQ-watcher { font-family: small; } } @media (min-width: 30em) { #getActiveMQ-watcher { font-family: medium; } } @media (min-width: 40em) { #getActiveMQ-watcher { font-family: large; } } @media (min-width: 48.75em) { #getActiveMQ-watcher { font-family: larger; } } @media (min-width: 60em) { #getActiveMQ-watcher { font-family: full; } }
  • 118. PERFORMANCE AS USER EXPERIENCE Getting CSS & JS in sync #getActiveMQ-watcher { font-family: global; } @media (min-width: 15em) { #getActiveMQ-watcher { font-family: tiny; } } @media (min-width: 20em) { #getActiveMQ-watcher { font-family: small; } } @media (min-width: 30em) { #getActiveMQ-watcher { font-family: medium; } } @media (min-width: 40em) { #getActiveMQ-watcher { font-family: large; } } @media (min-width: 48.75em) { #getActiveMQ-watcher { font-family: larger; } } @media (min-width: 60em) { #getActiveMQ-watcher { font-family: full; } }
  • 119. PERFORMANCE AS USER EXPERIENCE Getting CSS & JS in sync var $watcher = document.createElement('div'), re = /['"]/g; $watcher.setAttribute( 'id', 'getActiveMQ-watcher' ); $watcher.style.display = 'none'; document.body.appendChild( $watcher ); window.getActiveMQ = function() { return window.getComputedStyle( $watcher, null ) .getPropertyValue( 'font-family' ) .replace( re, '' ); };
  • 120. PERFORMANCE AS USER EXPERIENCE Getting CSS & JS in sync var MQ = getActiveMQ(); if ( MQ == 'larger' || MQ == 'full' ) { lazyLoadImages(); }
  • 121. PERFORMANCE AS USER EXPERIENCE How it works <li class="gallery__item h-card"
 data-img="/i/j/r.jpg||y"
 > <a href="https://twitter.com/rachelandrew">
 <b>Rachel Andrew</b>
 </a> </li>
  • 122. PERFORMANCE AS USER EXPERIENCE Indicating alternate formats <li class="gallery__item h-card"
 data-img="/i/j/r.jpg||y"
 data-imaged="true"
 >
 <img src="/i/j/r.jpg" alt="">
 <a href="https://twitter.com/rachelandrew">
 <b>Rachel Andrew</b>
 </a> </li>
  • 124.
  • 125.
  • 127. B&W: 35 kB JPG (-7%)
  • 128. Crop & Resize: 12 kB JPG (-68%)
  • 129. Blur & optimize: 9 kB JPG (-76%)
  • 131. WebP: 4 kB (-89%)JPG: 9 kB (-76%)
  • 133. PERFORMANCE AS USER EXPERIENCE Indicating alternate formats <picture> <source type="image/webp" srcset="my.webp">
 <img src="my.jpg" alt="Alt text goes here"> </picture> first choice if
WebP is supported fallback image
 if it isn’t
  • 134. PERFORMANCE AS USER EXPERIENCE Indicating alternate formats <picture> <source type="image/svg+xml"
 srcset="my.svg"> <source type="image/webp" srcset="my.webp">
 <img src="my.jpg" alt="Alt text goes here"> </picture>
  • 135. PERFORMANCE AS USER EXPERIENCE Indicating alternate formats <li class="gallery__item h-card"
 data-img="/i/j/r.jpg||y"
 data-imaged="true"
 >
 <img src="/i/j/r.jpg" alt="">
 <a href="https://twitter.com/rachelandrew">
 <b>Rachel Andrew</b>
 </a> </li>
  • 136. PERFORMANCE AS USER EXPERIENCE Indicating alternate formats <li class="gallery__item h-card"
 data-img="/i/j/r.jpg||y"
 data-imaged="true"
 >
 <picture>
 <source type="image/webp"
 srcset="/i/j/r.webp">
 <img src="/i/j/r.jpg" alt="">
 </picture> <a href="https://twitter.com/rachelandrew">
 <b>Rachel Andrew</b>
 </a> </li>
  • 137. PERFORMANCE AS USER EXPERIENCE Steps for better performance 1. Use native features whenever possible 2. Only include assets you actually need 3. Optimize everything 4. Think about when you load assets 5. Consider how you load assets 6. Only load assets when they add value 146
  • 138. Every choice we
 make affects our
 users’ experiences
  • 139. Let’s spend our time to
 save it for our users
  • 140. Speedy performance is
 a great user experience