
Show HN: LoadJS – A tiny async loader for modern browsers - andres
https://github.com/muicss/loadjs
======
brudgers
Curious as to how 84 bytes were shaved since the previous posting.
[https://news.ycombinator.com/item?id=9941182](https://news.ycombinator.com/item?id=9941182)

~~~
andres
Here are some of the changes:

    
    
      * Replaced for-loops with while-loops [1]
      * Removed un-necessary code in the script loading function [2][3]
      * Removed setTimeout wrapper [4][5]
    

[1]
[https://github.com/muicss/loadjs/blob/master/src/loadjs.js#L...](https://github.com/muicss/loadjs/blob/master/src/loadjs.js#L35)

[2]
[https://github.com/muicss/loadjs/blob/master/src/loadjs.js#L...](https://github.com/muicss/loadjs/blob/master/src/loadjs.js#L82-L95)

[3]
[https://github.com/muicss/loadjs/blob/8d380e1f6c2af431b08088...](https://github.com/muicss/loadjs/blob/8d380e1f6c2af431b08088889b4d26705f5bae83/src/loadjs.js#L79-L99)

[4]
[https://github.com/muicss/loadjs/blob/master/src/loadjs.js#L...](https://github.com/muicss/loadjs/blob/master/src/loadjs.js#L149-L15)

[5]
[https://github.com/muicss/loadjs/blob/8d380e1f6c2af431b08088...](https://github.com/muicss/loadjs/blob/8d380e1f6c2af431b08088889b4d26705f5bae83/src/loadjs.js#L157-L165)

------
andres
I just shaved off another 3 bytes so LoadJS is now 503 bytes (minified +
gzipped). HN - If you see a way to get below 500 bytes please let me know!

[https://github.com/muicss/loadjs/blob/master/src/loadjs.js](https://github.com/muicss/loadjs/blob/master/src/loadjs.js)

~~~
barsonme
Using ES5 features? Because arrow functions would make it smaller.

Also using an if/else instead of continue saves 4 bytes.

Using arrow functions shaves off another 2 bytes.

(Gzipped that's 489 bytes.)[0]

[0] - [https://closure-
compiler.appspot.com/code/jscde34e44897623a8...](https://closure-
compiler.appspot.com/code/jscde34e44897623a837f5b52935589a66f/default.js)

~~~
andres
That's a good suggestion but it looks like the minifier removes "continue"
automatically:
[https://raw.githubusercontent.com/muicss/loadjs/master/dist/...](https://raw.githubusercontent.com/muicss/loadjs/master/dist/loadjs.min.js)

Arrow functions would be great but then we'd have to drop support for browsers
that don't support ES6.

~~~
barsonme
It seems running your original code through the closure compiler shaves it
down to 488 max.

The closure compiler doesn't respect arrow functions, so I'm assuming that'd
have to be changed manually.

------
teknologist
For wider browser support I've always relied on LABjs. It's been around for
ages and has to be among the most stable JS libraries out there despite having
to deal with all those browser quirks.

[http://labjs.com/](http://labjs.com/)

------
sunrising
check out
[https://github.com/sun2rise/dysel](https://github.com/sun2rise/dysel) too

~~~
andres
How does dysel do sequential loading? Dynamically loaded script tags default
to async=true so I think this code loads/executes scripts asynchronously:

[https://github.com/sun2rise/dysel/blob/master/dist/dysel.js#...](https://github.com/sun2rise/dysel/blob/master/dist/dysel.js#L19-L21)

------
maxpert
Nice work would love to see it delivered via CDNjs

------
fbdjfhhcbd
For what purpose?

Just stop layering bloat.

~~~
King-Aaron
But what if you _want_ to load four hundred dependant scripts on each
pageload? :(

~~~
romanovcode
1\. If you need four hundred dependant scripts to load a page you're doing
something wrong.

2\. Why can't you just use <script async src="/js/script.js"></script> and be
done with it in the first place?

~~~
michaelmior
Because async doesn't do what you think it does.

[https://www.stevesouders.com/blog/2012/01/13/javascript-
perf...](https://www.stevesouders.com/blog/2012/01/13/javascript-
performance/#comment-3659)

