Render blocking defer vs moving script at bottom

  1. Yes, the scripts loaded even at the bottom has to have defere attribute, if it's possible in your site design and requirements

  2. no, those tools looks for the completion of parsing

  3. depends on the version of IE that you want to support, they will have different recommendations

Now explaining simple script, defer and async a bit, to help you understand the reasons:

Script Simple <script> tag will stop the parsing at that point, until the script download and executes.

Async If you will use async, then the script will not stop parsing for download as it will continue downloading in parallel with the rest of the html content. However, the script will stop the parsing for execution and only then the parsing of html will continue or complete

Defer If you use defer, the script will not halt the parsing of html data for downloading or executing the script. So it's sort of best way to avoid any time addition to the loading time of the web page.

Please note, defer is good for reducing parsing time of html, however not always best or appropriate in every webdesign flow, so be careful when you use it.


Instead of async, maybe something like this (thanks @guest271314 for the idea)

<!DOCTYPE html>
<html>
<body>
<!-- whole block of  html -->

<!-- inline scripts can't have async -->
<script type='text/javascript'>
function addScript(url){
document.open();
document.write("<scrip" + "t src = \"" + url + "\"></scr" + "ipt>");//weird quotes to avoid confusing the HTML parser
document.close();
}
//add your app.js last to ensure all libraries are loaded
addScript("jquery.js");
addScript("lodash.js");
addScript("app.js");
</script>
</body>
</html>

Is this what you wanted? You can add the async or defer attributes on the document.write call if you want.