Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Web Apps performance & JavaScript compilers
Search
Roman Liutikov
December 04, 2016
Programming
140
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Web Apps performance & JavaScript compilers
MostJS Frameworks Day @ Dec 4 2016
Roman Liutikov
December 04, 2016
More Decks by Roman Liutikov
See All by Roman Liutikov
ClojureScript × Type Inference
roman01la
0
48
React Kyiv – Dec 19, 2017
roman01la
1
230
React & ClojureScript in production at Attendify
roman01la
0
200
Introduction to React.js
roman01la
0
94
React Native: Native Mobile Development in JavaScript @ LvivJS 2016
roman01la
0
160
React Native: Are we there yet? (Pokémon edition) @ VinnytsiaJS '16
roman01la
0
420
React Native: Native mobile development with JavaScript
roman01la
0
200
ClojureScript, что ты такое?
roman01la
1
220
ClojureScript: what are you?
roman01la
2
140
Other Decks in Programming
See All in Programming
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
110
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
220
今さら聞けない .NET CLI
htkym
0
180
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.5k
Foundation Models frameworkで画像分析
ryodeveloper
1
600
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
670
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
130
仕様駆動開発の消費期限
watany
14
6.7k
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
460
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
240
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
110
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
200
Featured
See All Featured
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
380
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Designing for Performance
lara
611
70k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
410
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
460
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
A Soul's Torment
seathinner
6
3.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Agile that works and the tools we love
rasmusluckow
331
22k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
Transcript
Web Apps performance & JavaScript compilers Roman Liutikov Attendify
Web Apps nowadays 5 MB of awesome web technologies is
loading...
None
None
This is NOT good • Makes people wait • Eats
their traffic and money • Everyone hates you • You loose money
WTMHLM performance anti-pattern
the goal is to Reduce Time To Interaction
The right way _______ index.html route-1.js common-1.js I can see
it I can use it route-2.js Pre-caching Server Rendering (JS & CSS)
Code Splitting
Code splitting Divide JS bundle into chunks route-1.js route-2.js route-3.js
route-4.js ... common-1.js common-2.js Webpack CommonsChunkPlugin
Initial load Load initial route and its common chunk route-1.js
common-1.js
The compiler is to blame for everything
Smarter compiler means smaller output size & eval time
Compiler optimizations
Dead code elimination Remove 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 UglifyJS Rollup Babili Closure Compiler Dependency graph
Tree-shaking (A special case of DCE) Do not include unused
exports // math.js export const dec = (x) => x - 1; export const inc = (x) => x + 1; // main.js import { inc } from 'math'; const x = 0; const y = 1; inc(x); Webpack 2 Rollup Closure Compiler
Function call inlining Replace 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);
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);
Constant folding Evaluate constant expressions at compile time UglifyJS Babili
Closure 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);
Known methods folding Evaluate 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');
Code splitting in Webpack Module level splitting a b c
d a b c a b a c input output
Code splitting in Closure Compiler Function/method & variable level splitting
a b c d a a b a c input output b c
Precache & Lazy load
Precache route-1.js common-1.js Load and/or cache chunks in background UI
is ready Load in bg
Lazy load route-1.js common-1.js Load chunks on demand Navigation Load
chunk route-2.js ...
Code splitting & Lazy loading in Webpack 2 Per route
chunks with React Router <Route path="user/:id" getComponent={(loc, cb) => { System.import("pages/User") .then((module) => cb(null, module)); }}>
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>
Precache with Service Worker (sw-precache) Preload + Offline support plugins:
[ new SWPrecacheWebpackPlugin({ cacheId: "app", filename: "app-sw.js", staticFileGlobs: [ "app/js/**.js" ] })]
What about framework size?
Ahead-of-time compilation Reduce runtime overhead Templates AOT compilation in Angular
2 & Vue.js 2
None
Preact Vue.js Riot.js Lightweight alternatives
Out of the box code splitting is coming to
Should I use code splitting? Yes
Should I use server-side rendering? Maybe
Should I care about compiler? NO
@roman01la Thank You!