Game of Performance

Alex Moldovan

@alexnmoldovan

Engineering Manager @ Fortech

Co-Founder @ Cluj JavaScripters

medium.com/@alexnm

"WHEN YOU PLAY THE

GAME OF PERFORMANCE

YOU WIN OR YOU DIE"

1.92s

3s - 7s

10s - 25s

420 Kb

httparchive.org

A brief history of web applications

( JavaScript vs Network )

1995

2008

2014

2018

Network

JavaScript

Ajax

SPA

SSR + SPA

SSR

UNIVERSAL APPS

Alice

game of performance

Browser

App Size

JavaScript

Alice

Round 1

VS

Browser

GET example.com

index.html

Time to first byte

Parse HTML

GET .css / .woff2

Dom Ready

Paint CSS

First meaningful paint

GET .js / .json

Page Interactive

Full Load

optimize critical path

SERVER RENDER YOUR APP

defer javascript Loading & execution

RENDER above the folD

High Priority

Low Priority

link preload


<link rel="preload" href="main.css" as="style">

<link rel="preload" href="webfont.woff2" as="font" type="font/woff2" crossorigin>

<link rel="preload" href="bg-image-narrow.png" as="image" media="(max-width: 600px)">
<link rel="preload" href="bg-image-wide.png" as="image" media="(min-width: 601px)">

Use HTTP/2

Alice

Round 2

VS

App Size

Size matters

minify + gzip

app.js

lib.js

minified

app.js

lib.js

minified + gzipped

679 kB

484 kB

137 kB

127 kB

app.css

156 kB

24 kB

app.css

Optimize imaGEs

1080px

360px

load images based on media queries

defer loading images below the fold

compress images (webp)

code spliting

app.bundle.js

300 kB

app.bundle.js

150 kB

account.bundle.js

100 kB

checkout.bundle.js

100 kB

import("../pages/myAccount")
import("../pages/checkout")

tree shaking

manage dependencies

MANAGE DEPENDENCIES

Careful with dependencies like moment.js and lodash

Invest time in your custom components if needed

Understand your browser usage, don't ship polyfills blindly

react-slick (12.2 kB) -> 3.41 kB

react-date-picker (25.4 kB) -> 3.22 kB

react-tooltip (9.7 kB) -> 1.42 kB

lightweight alternatives

Inferno

measure coverage

Alice

Round 3

VS

JavaScript

Write clean and efficient code

Limit dom interaction

jQuery

Angular.js

Backbone

React

Angular

Vue

Knockout

Vanilla *

pure components

View = F ( state )

avoid forced reflows

use profiling tools

passive event listeners

addEventListener('touchstart', onTouchStart, {passive: true});

Alice

bonus round

VS

Future

web app manifest

Alice

Service Workers

Web assembly

Tools

Lighthouse

Chrome dev tools

GTMetrix

calibre app

when do I have time?

Write Code

Write Tests

Performance

Security

The ladder of software quality

UX

Thank you! Questions?

Alex Moldovan

@alexnmoldovan

JavaScript Ninja @ Fortech

Co-Founder @ Cluj JavaScripters

medium.com/@alexnm

Game of Performance - Codecamp 2017

By Alex Moldovan

Game of Performance - Codecamp 2017

  • 1,555