If your website has a sufficient amount of static content, it might be a good
idea to load all the extra JavaScript files asynchronously. This
my old blog, for example, shows the static content as soon as
possible, allowing its visitors to read the main content (the article) while
the not-so-important content (like Facebook Like buttons, “Web 2.0” widgets and
all that crap) is on its way from the server.
I use the following snippet to load external JS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(function () {
// Asynchronous JS loader
var load = (function () {
// Private members
var create = function (url) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
};
// Public: export a Function object
return function (url) {
setTimeout(function () { create(url); }, 1);
};
})();
// Call the other script files from here
load('https://www.example.com/foo-script.js');
load('/media/js/some-local-js-file.js');
})();
I put all that stuff in a closure so nothing gets exported to to the global
namespace. Note that the setTimeout
trick is from here.
Note also that some JavaScript files will not work if you load them like this. These are ones that expect to be run before DOM readyness. Such an example is less.js.
Good candidates for asynchronous loading are the Facebook JavaScript SDK and Google Analytics.
Update
- You can load less.js too, just trigger a
less.refresh()
after it has been loaded. - Have a look at Richard Neil Ilagan’s implementation as well.