Роман Лютиков "web apps performance & javascript compilers"

37
Web Apps performance & JavaScript compilers Roman Liutikov Attendify

Upload: fwdays

Post on 14-Jan-2017

119 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Web Apps performance & JavaScript compilersRoman LiutikovAttendify

Page 2: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Web Apps nowadays

5 MB of awesome web technologies is loading...

Page 3: Роман Лютиков "Web Apps Performance & JavaScript Compilers"
Page 4: Роман Лютиков "Web Apps Performance & JavaScript Compilers"
Page 5: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

This is NOT good

● Makes people wait● Eats their traffic and money● Everyone hates you

● You loose money

Page 6: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

WTMHLM

performanceanti-pattern

Page 7: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

the goal is toReduceTime To Interaction

Page 8: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

The right way _______

index.htmlroute-1.js

common-1.js

I can see it I can use it

route-2.js Pre-cachingServ

er R

ende

ring

(JS

& CS

S)

Page 9: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Code Splitting

Page 10: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Code splittingDivide JS bundle into chunks

route-1.js route-2.js route-3.js route-4.js ...common-1.js common-2.js

WebpackCommonsChunkPlugin

Page 11: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Initial loadLoad initial route and its common chunk

route-1.js

common-1.js

Page 12: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

The compiler is to blame for everything

Page 13: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Smarter compilermeans smalleroutput size & eval time

Page 14: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Compileroptimizations

Page 15: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Dead code eliminationRemove code that can never be executed

const dec = (x) => x - 1;const inc = (x) => x + 1;

const x = 0;const y = 1;

inc(x);

inc

dec y

x

UglifyJSRollupBabiliClosure Compiler

Dependency graph

Page 16: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Tree-shaking (A special case of DCE)

Do not include unused exports

// math.jsexport const dec = (x) => x - 1;export const inc = (x) => x + 1;

// main.jsimport { inc } from 'math';

const x = 0;const y = 1;

inc(x);

Webpack 2RollupClosure Compiler

Page 17: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Function call inliningReplace a function call with its body

const person = { fname: 'John', lname: 'Doe'};

function fullName(p) { return p.fname + ' ' + p.lname;}

console.log(fullName(person));

Closure Compiler

const person = { fname: 'John', lname: 'Doe'};

console.log( person.fname + ' ' + person.lname);

Page 18: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Property flattening (collapsing)Collapse object properties into separate variables

const person = { fname: 'John', lname: 'Doe'};

console.log( person.fname + ' ' + person.lname);

Closure Compiler

const person$fname = 'John';const person$lname = 'Doe';

console.log( person$fname + ' ' + person$lname);

Page 19: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Constant foldingEvaluate constant expressions at compile time

UglifyJSBabiliClosure Compiler

const person$fname = 'John';const person$lname = 'Doe';

console.log('John Doe');

const person$fname = 'John';const person$lname = 'Doe';

console.log( person$fname + ' ' + person$lname);

Page 20: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Known methods foldingEvaluate known methods at compile time

Closure Compiler

'012345'

'World!'

99

[0, 1, 2, 3, 4, 5].join('');

'Hello, world!'.substr(7, 11);

parseInt('99 UAH');

Page 21: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Code splitting in WebpackModule level splitting

a b c d a b c

a b

a c

input output

Page 22: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Code splitting in Closure CompilerFunction/method & variable level splitting

a b c d a

a b

a c

input output b

c

Page 23: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Precache & Lazy load

Page 24: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Precache

route-1.js

common-1.js

Load and/or cache chunks in background

UI is ready

Load in bg

Page 25: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Lazy load

route-1.js

common-1.js

Load chunks on demand

Navigation

Load chunk route-2.js

...

Page 26: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Code splitting & Lazy loadingin Webpack 2Per route chunks with React Router

<Route path="user/:id" getComponent={(loc, cb) => { System.import("pages/User") .then((module) => cb(null, module)); }}>

Page 27: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Preload chunks* Chrome, Opera & Chrome for Android

<head> <link rel="preload" as="script" href="chunk-1.js"> <link rel="preload" as="script" href="chunk-2.js"> ...</head>

Page 28: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Precache with Service Worker (sw-precache)

Preload + Offline support

plugins: [ new SWPrecacheWebpackPlugin({ cacheId: "app", filename: "app-sw.js", staticFileGlobs: [ "app/js/**.js" ]})]

Page 29: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

What aboutframework size?

Page 30: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Ahead-of-time compilationReduce runtime overhead

Templates AOT compilation inAngular 2 & Vue.js 2

Page 31: Роман Лютиков "Web Apps Performance & JavaScript Compilers"
Page 32: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Preact Vue.js Riot.js

Lightweight alternatives

Page 33: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Out of the box code splitting is coming to

Page 34: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Should I usecode splitting? Yes

Page 35: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Should I useserver-side rendering?

Maybe

Page 36: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

Should I careabout compiler? NO

Page 37: Роман Лютиков "Web Apps Performance & JavaScript Compilers"

@roman01la

Thank You!