KEMBAR78
Asynchronous JavaScript loading | PDF
Async JS loading
   Kornel Lesiński
          <London JS 11.2011>
defer
        async
                DOM
            script loaders
MERGE
MINIFY
 GZIP
voluptate  velit  esse  cillum  dolore  eu  
fugiat  nulla  pariatur.  Excepteur  sint  
occaecat  cupidatat  non  proident,  sunt  in  
culpa  qui  officia  deserunt  mollit  anim  id  
est  laborum.
                </data>
            </section>
        </article>
        <script  src=all-­‐minified.js></script>
    </body>
</html>
document.write()
    onload
DOMContentReady
<script  defer>
<script  defer  src=//example.com/spam-­‐library.js>
<script  defer  src=/js/add-­‐spam-­‐button.js>

Lorem  ipsum  dolor  sit  amet,  consectetur  
adipisicing  elit,  sed  do  eiusmod  tempor  
incididunt  ut  labore  et  dolore  magna  aliqua.

<script  src=//example.com/spam-­‐library.js>
<script  src=/js/add-­‐spam-­‐button.js>

</body>
“The exact processing
     details for these
attributes are, for mostly
    historical reasons,
 somewhat non-trivial”
<script  async>
<script  async  src=//example.com/spam-­‐library.js>

Lorem  ipsum  dolor  sit  amet,  consectetur  
adipisicing  elit,  sed  do  eiusmod  tempor  
incididunt  ut  labore  et  dolore  magna  aliqua.




</body>
NOBODY
 EXPECTS
  ASYNC
EXECUTION
<script  async  src=//example.com/spam-­‐library.js>
<script  async  src=//example.com/spam-­‐library.js>

Lorem  ipsum  dolor  sit  amet,  consectetur  
adipisicing  elit,  sed  <script  async  src=//
example.com/spam-­‐library.js>  do  eiusmod  tempor  
incididunt  ut  labore  et  dolore  magna  aliqua.

<script  async  src=//example.com/spam-­‐library.js>  
</body>
<script  async  src=//example.com/spam-­‐library.js>
<script  async  src=//example.com/spam-­‐library.js>
<script  async  src=/js/add-­‐spam-­‐button.js>
<script  async  src=library+add-­‐spam-­‐button.js>
<script  async  src=//example.com/spam-­‐library.js  
    onload="one=true;  if  (one  &&  two)  do_spam()">
                                   
<script  async  src=/js/add-­‐spam-­‐button.js
    onload="two=true;  if  (one  &&  two)  do_spam()">
<script  async  src=//example.com/spam-­‐library.js  
    onload="one=true;  if  (one  &&  two)  do_spam()">
                                   
<script  async  src=/js/add-­‐spam-­‐button.js
    onload="two=true;  if  (one  &&  two)  do_spam()">
DOM
doc.createElement('script')
script.async  =  true
script.src  =  "ga.js"
<script>
ga  =  doc.createElement('script')  
ga.async  =  true
ga.src  =  'ga.js'
s  =  doc.getElementsByTagName('script')[0]
s.parentNode.insertBefore(ga,  s)
</script>
Script loaders
<nosrsly>
Progressive enhancement
<html  class="no-­‐js">
  <head>
  <script>
    document.documentElement.className      loading'
                                        ='
  </script>
  <style>
  .no-­‐js  .widget  {overflow:scroll}
  .loading  .widget  {visibility:hidden}
  </style>
defer
MERGE
                     ?
MINIFY   async   ?


 GZIP    DOM     ?
                     ?
pornel.net /asyncjs
   @pornelski

Asynchronous JavaScript loading