Maurizio Lupo (@sithmel)
<div>service 1 markup</div>
<script async src="service1.js"></script>
<div>service 2 markup</div>
<script async src="service2.js"></script>
It is inefficient:
<script src="common.js"></script>
<div>service 1 markup</div>
<script async src="service1.js"></script>
<div>service 2 markup</div>
<script async src="service2.js"></script>
It is not compatible with 2 requirements:
<script async src="common_ad.js"></script>
<div>service 1 markup</div>
<script async src="service1_ad.js"></script>
<script async src="common_ad.js"></script>
<div>service 2 markup</div>
<script async src="service2_ad.js"></script>
This restores the 2 requirements:
Most browsers load only once (Chrome IE10, Safari)
If only we had something to remove duplicated resources ...
hint: Compoxure does that
It is an AMD runner: it manage the execution order of AMD bundles
It can be added in the bundling step, no messing with the source code (plugins for browserify, webpack and rollup).
It adds 0.5 KB to a bundle
<link rel="preload" as="script" href="service1_ad.js" />
<link rel="preload" as="script" href="service2_ad.js" />
<script async src="common_ad.js"></script>
<div>service 1 markup</div>
... long markup with many images
<script async src="service1_ad.js"></script>
<script async src="common_ad.js"></script>
<div>service 2 markup</div>
... long markup with many images
<script async src="service2_ad.js"></script>
<link rel="stylesheet" href="service1.css" />
<div>service 1 markup</div>
<link rel="stylesheet" href="service2.css" />
<div>service 2 markup</div>
It is inefficient:
<link rel="stylesheet" href="main.css" />
<div>service 1 markup</div>
<div>service 2 markup</div>
It is not compatible with 2 requirements:
<link rel="stylesheet" href="base.css" />
<link rel="stylesheet" href="forms.css" />
<link rel="stylesheet" href="service1.css" />
<div>service 1 markup</div>
<link rel="stylesheet" href="base.css" />
<link rel="stylesheet" href="forms.css" />
<link rel="stylesheet" href="buttons.css" />
<link rel="stylesheet" href="icons.css" />
<link rel="stylesheet" href="service2.css" />
<div>service 2 markup</div>
It looks very verbose but, compoxure spits out this:
<link rel="stylesheet" href="base.css" />
<link rel="stylesheet" href="forms.css" />
<link rel="stylesheet" href="service1.css" />
<div>service 1 markup</div>
<link rel="stylesheet" href="buttons.css" />
<link rel="stylesheet" href="icons.css" />
<link rel="stylesheet" href="service2.css" />
<div>service 2 markup</div>
How browsers deal with CSS:*
It only blocks the rendering of the HTML under the CSS
*Chrome is currently being fixed
https://twitter.com/jaffathecake/status/829999531429392385
<link rel="preload" as="style" href="icons.css" />
<link rel="stylesheet" href="base.css" />
<link rel="stylesheet" href="forms.css" />
<link rel="stylesheet" href="service1.css" />
<div>service 1 markup</div>
<link rel="stylesheet" href="buttons.css" />
<link rel="stylesheet" href="icons.css" />
<link rel="stylesheet" href="service2.css" />
<div>service 2 markup</div>
<link rel="preload" href="icons.css" as="style" onload="this.rel='stylesheet'">
<link rel="stylesheet" href="base.css" />
<link rel="stylesheet" href="forms.css" />
<link rel="stylesheet" href="service1.css" />
<div>service 1 markup</div>
<link rel="stylesheet" href="buttons.css" />
<link rel="stylesheet" href="service2.css" />
<div>service 2 markup</div>
*Requires a polyfill
Link: </styles.css>; rel=preload; as=style
*Using HTTP2 CDN
In http header
<link rel="stylesheet" href="/style.css" />
Maurizio Lupo (@sithmel)