Unobtrusive JavaScript: <script> at the top or the bottom of the HTML code?

JavascriptPerformanceOptimizationCoding Style

Javascript Problem Overview


I've recently read the Yahoo manifesto Best Practices for Speeding Up Your Web Site. They recommend to put the JavaScript inclusion at the bottom of the HTML code when we can.

But where exactly and when?

Should we put it before closing </html> or after ? And above all, when should we still put it in the <head> section?

Javascript Solutions


Solution 1 - Javascript

There are two possibilities for truly unobtrusive scripts:

  • including an external script file via a script tag in the head section
  • including an external script file via a script tag at the bottom of the body (before </body></html>)

The second one can be faster as the original Yahoo research showed some browsers try to load script files when they hit the script tag and therefore don't load the rest of the page until they have finished. However, if your script has a 'ready' portion which must execute as soon as the DOM is ready you may need to have it in the head. Another issue is layout - if your script is going to change the page layout you want it loaded as early as possible so your page does not spend a long time redrawing itself in front of your users.

If the external script site is on another domain (like external widgets) it may be worth putting it at the bottom to avoid it delaying loading of the page.

And for any performance issues do your own benchmarks - what may be true at one time when a study is done might change with your own local setup or changes in browsers.

Solution 2 - Javascript

It's never so cut and dry - Yahoo recommends putting the scripts just before the closing </body> tag, which will create the illusion that the page loads faster on an empty cache (since the scripts won't block downloading the rest of the document). However, if you have some code you want to run on page load, it will only start executing after the entire page has loaded. If you put the scripts in the <head> tag, they would start executing before - so on a primed cache the page would actually appear to load faster.

Also, the privilege of putting scripts at the bottom of the page is not always available. If you need to include inline scripts in your views that depend on a library or some other JavaScript code being loaded before, you must load those dependencies in the <head> tag.

All in all Yahoo's recommendations are interesting but not always applicable and should be considered on a case-by-case basis.

Solution 3 - Javascript

As others have said, place it before the closing body html tags.

The other day we had numerous calls from clients complaining their sites were extremely slow. We visited them locally and found they took 20-30 seconds to load a single page. Thinking it was the servers performing badly, we logged on - but both web and sql servers were ~0% activity.

After a few minutes, we realised an external site was down, which we were linking to for Javascript tracking tags. This meant browsers were hitting the script tag in the head section of the site and waiting to download the script file.

So, for 3rd party/external scripts at least, I'd recommend putting them as the last thing on the page. Then if they were unavailable, the browser would at least load the page up until that point - and the user would be oblivious to it.

Solution 4 - Javascript

To summarize, based on the suggestions above:

  1. For external scripts (Google analytics, 3rd party marketing trackers, etc.) place them before the </body> tag.
  2. For scripts that affect page layout, place in head.
  3. For scripts that rely on 'dom ready' (like jquery), consider placing before </body> unless you have an edge-case reason to place scripts in head.
  4. If there are inline scripts with dependencies, place the required scripts in head.

Solution 5 - Javascript

If you want to tinker with the position of your scripts, YSlow is a great tool for giving you a flavour if it's going to improve or hurt performance. Putting javascript in certain document positions can really kill page load times.

http://developer.yahoo.com/yslow/

Solution 6 - Javascript

No it should not be after the </html> as that would be invalid. The best place to put scripts is right before the </body>

This is basically because most browsers stop rendering the page while they eval the script that you provide. So its OK to put non-blocking code anywhere in the page (I'm mainly thinking of things that attach functions to the onLoad event, since event binding is so fast as to effectively be free). A big killer here is at the beginning of the page putting in some ad server script, which can prevent any of the page loading before the ads have totally downloaded, making your page load times balloon

Solution 7 - Javascript

If you put it at the bottom, it loads last, hence speeding up the speed that the user can see the page. It does need to be before the final </html> though otherwise it won't be part of the DOM.

If the code is needed instantly though, then put it in the head.

It's best to put things like blog widgets at the bottom so that if they don't load, it doesn't affect the usability of the page.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questione-satisView Question on Stackoverflow
Solution 1 - JavascriptdomgblackwellView Answer on Stackoverflow
Solution 2 - JavascriptEran GalperinView Answer on Stackoverflow
Solution 3 - JavascriptLazlowView Answer on Stackoverflow
Solution 4 - JavascriptLuke WView Answer on Stackoverflow
Solution 5 - JavascriptskaffmanView Answer on Stackoverflow
Solution 6 - JavascriptLaurie YoungView Answer on Stackoverflow
Solution 7 - JavascriptRich BradshawView Answer on Stackoverflow