Slide 1

Slide 1 text

twitter.com/mgechev Predictive Prefetching twitter.com/mgechev github.com/mgechev blog.mgechev.com

Slide 2

Slide 2 text

twitter.com/mgechev twitter.com/mgechev github.com/mgechev

Slide 3

Slide 3 text

twitter.com/mgechev Evolution of the web UI Code-splitting Prefetching Guess.js Agenda

Slide 4

Slide 4 text

twitter.com/mgechev

Slide 5

Slide 5 text

twitter.com/mgechev

Slide 6

Slide 6 text

twitter.com/mgechev

Slide 7

Slide 7 text

twitter.com/mgechev https://medium.com/dev-channel/the-cost-of-javascript-84009f51e99e

Slide 8

Slide 8 text

twitter.com/mgechev lazy-loading

Slide 9

Slide 9 text

twitter.com/mgechev - Route-based - Component-based Lazy-loading strategies

Slide 10

Slide 10 text

twitter.com/mgechev Step 1: Open https://example.com/ Step 2: Determine JavaScript which is likely to be required Step 3: Download the chunks Step 4: Store chunks in browser cache Pre-fetching

Slide 11

Slide 11 text

twitter.com/mgechev How do we pick the priorities of the bundles to pre-fetch?

Slide 12

Slide 12 text

twitter.com/mgechev

Slide 13

Slide 13 text

twitter.com/mgechev Lazy-load everything!

Slide 14

Slide 14 text

twitter.com/mgechev Lazy-load everything! …and let tooling take care of the rest

Slide 15

Slide 15 text

twitter.com/mgechev

Slide 16

Slide 16 text

twitter.com/mgechev

Slide 17

Slide 17 text

twitter.com/mgechev Route-based splitting

Slide 18

Slide 18 text

twitter.com/mgechev $ npm run build # For Angular CLI $ serve -s dist

Slide 19

Slide 19 text

twitter.com/mgechev Let’s emulate *really* bad conditions

Slide 20

Slide 20 text

twitter.com/mgechev

Slide 21

Slide 21 text

twitter.com/mgechev

Slide 22

Slide 22 text

twitter.com/mgechev Let’s take a look at the GA graph

Slide 23

Slide 23 text

twitter.com/mgechev

Slide 24

Slide 24 text

twitter.com/mgechev

Slide 25

Slide 25 text

twitter.com/mgechev - Main & Settings in same chunk ‣ Update of the source code - Pre-fetch FAQ when the user is at Home Possible optimizations

Slide 26

Slide 26 text

twitter.com/mgechev

Slide 27

Slide 27 text

twitter.com/mgechev early preview

Slide 28

Slide 28 text

twitter.com/mgechev $ vim webpack.config.js

Slide 29

Slide 29 text

twitter.com/mgechev const { GuessPlugin } = require('guess-webpack'); // ... plugins: [ // ... new GuessPlugin({ GA: 'XXXXXX' }) ] // ...

Slide 30

Slide 30 text

twitter.com/mgechev

Slide 31

Slide 31 text

twitter.com/mgechev

Slide 32

Slide 32 text

twitter.com/mgechev How it works…

Slide 33

Slide 33 text

twitter.com/mgechev - guess-ga - guess-parser - guess-webpack Packages

Slide 34

Slide 34 text

twitter.com/mgechev guess-ga Fetching structured data from Google Analytics

Slide 35

Slide 35 text

twitter.com/mgechev guess-parser Gets metadata by statically analyzing our app

Slide 36

Slide 36 text

twitter.com/mgechev guess-webpack Set of webpack plugins which automate the build

Slide 37

Slide 37 text

twitter.com/mgechev /a /a/a /a/b /b /b/a /

Slide 38

Slide 38 text

twitter.com/mgechev Markov Chain / /a /a/:id /b /b/a / 0 0.3 0 0.7 0 /a 0 0 0.9 0.1 0 /a/:id 0 1 0 0 0 /b 0 0 0 0 1 /b/a 0 1 0 0 0 /a /a/a /a/b /b /b/a /

Slide 39

Slide 39 text

twitter.com/mgechev /a /a/a /a/b /b /b/a / Activity: / /a /a/:id /b /b/a / 0 0.3 0 0.7 0 /a 0 0 0.9 0.1 0 /a/:id 0 1 0 0 0 /b 0 0 0 0 1 /b/a 0 1 0 0 0 Probability threshold: 0.5

Slide 40

Slide 40 text

twitter.com/mgechev /a /a/a /a/b /b /b/a / Activity: / /a /a/:id /b /b/a / 0 0.3 0 0.7 0 /a 0 0 0.9 0.1 0 /a/:id 0 1 0 0 0 /b 0 0 0 0 1 /b/a 0 1 0 0 0 Probability threshold: 0.5

Slide 41

Slide 41 text

twitter.com/mgechev /a /a/a /a/b /b /b/a / Activity: / /a /a/:id /b /b/a / 0 0.3 0 0.7 0 /a 0 0 0.9 0.1 0 /a/:id 0 1 0 0 0 /b 0 0 0 0 1 /b/a 0 1 0 0 0 Probability threshold: 0.5

Slide 42

Slide 42 text

twitter.com/mgechev / /a /a/:id /b /b/a / 0 0.3 0 0.7 0 /a 0 0 0.9 0.1 0 /a/:id 0 1 0 0 0 /b 0 0 0 0 1 /b/a 0 1 0 0 0 /a /a/a /a/b /b /b/a / Activity: - Download b.bundle.js Probability threshold: 0.5

Slide 43

Slide 43 text

twitter.com/mgechev /a /a/a /a/b /b /b/a / Activity: - Download b.bundle.js / /a /a/:id /b /b/a / 0 0.3 0 0.7 0 /a 0 0 0.9 0.1 0 /a/:id 0 1 0 0 0 /b 0 0 0 0 1 /b/a 0 1 0 0 0 Probability threshold: 0.5

Slide 44

Slide 44 text

twitter.com/mgechev /a /a/a /a/b /b /b/a / Activity: - Download b.bundle.js / /a /a/:id /b /b/a / 0 0.3 0 0.7 0 /a 0 0 0.9 0.1 0 /a/:id 0 1 0 0 0 /b 0 0 0 0 1 /b/a 0 1 0 0 0 Probability threshold: 0.5

Slide 45

Slide 45 text

twitter.com/mgechev /a /a/a /a/b /b /b/a / / /a /a/:id /b /b/a / 0 0.3 0 0.7 0 /a 0 0 0.9 0.1 0 /a/:id 0 1 0 0 0 /b 0 0 0 0 1 /b/a 0 1 0 0 0 Activity: - Download b.bundle.js - No action Probability threshold: 0.5

Slide 46

Slide 46 text

twitter.com/mgechev /a /a/a /a/b /b /b/a / / /a /a/:id /b /b/a / 0 0.3 0 0.7 0 /a 0 0 0.9 0.1 0 /a/:id 0 1 0 0 0 /b 0 0 0 0 1 /b/a 0 1 0 0 0 Activity: - Download b.bundle.js - No action Probability threshold: 0.5

Slide 47

Slide 47 text

twitter.com/mgechev /a /a/a /a/b /b /b/a / / /a /a/:id /b /b/a / 0 0.3 0 0.7 0 /a 0 0 0.9 0.1 0 /a/:id 0 1 0 0 0 /b 0 0 0 0 1 /b/a 0 1 0 0 0 Activity: - Download b.bundle.js - No action Probability threshold: 0.5

Slide 48

Slide 48 text

twitter.com/mgechev /a /a/a /a/b /b /b/a / / /a /a/:id /b /b/a / 0 0.3 0 0.7 0 /a 0 0 0.9 0.1 0 /a/:id 0 1 0 0 0 /b 0 0 0 0 1 /b/a 0 1 0 0 0 Activity: - Download b.bundle.js - No action - Download a.bundle.js Probability threshold: 0.5

Slide 49

Slide 49 text

twitter.com/mgechev - https://mgv.io/dd-bundling - https://mgv.io/cost-of-js - https://mgv.io/predictive-fetching - https://mgv.io/guess References

Slide 50

Slide 50 text

Thank you! twitter.com/mgechev github.com/mgechev blog.mgechev.com