How does http2 change the game of module bundlers?
@yaprakaya
Who am I?
Yaprak Ayazoglu
Frontend developer
@yaprakaya
- Working @bol.com
- M.S. in Computer Science
- B.S. in Electrical and Electronics Engineering
- Involved in building 1 solar powered and 1 hydrogen powered car
- Mentoring @LoncaWorks
@yaprakaya
@yaprakaya
A bit of history...
- Tim Berners Lee and his team introduced HTTP protocol in 1989 at Cern
- HTTP only had "GET" request
- Reponse was only HTTP page with plain text
- HTTP1.1 standard was there and also implemented by most of the major browsers in 1996
- The protocol is not changed since 1997.
@yaprakaya
Examples websites from 1996
@yaprakaya
Example websites from 1996
@yaprakaya
How did it evolve?
- A single JS file, a tiny CSS, some images
- More images, we had image sprites: a bundle for the images
- With SPAs, more JS and CSS files, we needed to bundle them into 1 huge file, too.
@yaprakaya
Why bundles?
@yaprakaya
- Was it a must? What was the problem?
- We have more files..
- >20 images
- >5 JS files
- >5 CSS files
- Why can't we just download them one by one?
@yaprakaya
HTTP/1.1 is sequential
How do we solve it?
- First approach is bundling... But does bundling enough?
- Browsers allow 6 parallel connections / domain
- Domain sharding
- Image spriting which is also a sort of bundle for your CSS
@yaprakaya
Is bundling only for first load time?
- Not really...
- It is also for maintainability, structure, clean code..
@yaprakaya
Lets go back to 1997
- Not much of CSS, JS or images required.
- Just a couple of them would be enough.
- The recent developments in JS was pushing the boundaries of WEB and thus the HTTP protocol.
- Browsers were not supporting any native module structure.
- We created scopes, IFFE functions (Immediately invoked function expression)
@yaprakaya
RequireJS (AMD)
@yaprakaya
- Nice way to create components
- Asynchronous (not downloading but while running the code)
// define with module ID, dep. array and factory function
define('myModule', ['dep1', 'dep2'],
function (dep1, dep2) {
//Define the module value by returning a value.
return function () {};
});
@yaprakaya
Browserify, Webpack (CommonJS)
- Bundling modules in CommonJS format
- Creating 1 big JS file
// ***** lib.js *****
module.exports = function(n) { console.log(n); }
// ***** main.js *****
var myLib = require('./lib');
console.log(myLib(5)); // 5
@yaprakaya
Rollup, System JS, Webpack, you name it (ES6 Modules)
- Bundling modules in ES6
// ***** lib1.js *****
export default function() {
console.log(4);
};
// ***** someClass.js *****
export default class {
…
};
// ***** main.js *****
var myLib = require('./lib');
console.log(myLib(5)); // 5
// ***** main.js *****
import func from ‘./lib1’;
func();
import someClass = require(‘./someClass’);
let myClass = someClass();
@yaprakaya
Native Modules
<script type="module">
import {addTextToBody} from './utils.mjs';
addTextToBody('Modules are cool. <3');
</script>
// utils.mjs
export function addTextToBody(text) {
const div = document.createElement('div');
div.textContent = text;
document.body.appendChild(div);
}
Time to change
- More files
- It was not enough...
@yaprakaya
HTTP/2
- HTTP/1.1 is for web 2 decades ago
- HTTP2 come into play
- It supports response multiplexing
- 1 request has n responses
- No need to send headers for each request
- Server push
Now...
- HTTP/2 is supported for whole major browsers
- It is backward compatible
- HTTPS is a must
- (ES6) Native modules are supported by most of the major browsers (but IE11)
- Do we need the module bundlers at all?
@yaprakaya
It depends :D
- Legacy (several non-native modules)
- Backend systems should be updated
- Bad caching
- Good compression
- How to prioritize the assets?
- CDNs?
- Server push
- Physical location of servers & your users
@yaprakaya
Benchmark results
@yaprakaya
1000 files to 50 increases speed by an average of ~66%
Benchmark results
@yaprakaya
1000 files to 50 increases speed by an average of ~28%
Benchmark results
@yaprakaya
1000 files to 50 increases speed by an average of ~27%
Key findings
- This benchmark does not involve server push
- Even though bundling is NOT that big problem with HTTP/2, a certain level of concatenation is an improvement
- Important to define the requirements since the distance increases the latency
Wrap up...
- The best practices in HTTP/1.1 is now anti patterns (domain sharding, bundling)
- Still we need bundling
- More bundles might cause less compression
- HTTP/2 will trigger new changes: e.g. new breed of CDNs, push efficient module loading, etc.
Resources
@yaprakaya
Questions?
@yaprakaya
Thanks...
@yaprakaya
http2 and module bundlers
By Yaprak Ayazoglu
http2 and module bundlers
- 1,181