Skip to content

高性能网站优化-确保异步加载脚本时保持执行顺序

Posted on:2014-04-10 19:40

《高性能网站建设进阶指南》

脚本如果按照常规方式加载,不仅会阻塞页面中其他内容的下载,还会阻塞脚本后面所有元素的渲染。异步加载脚本可以避免这种阻塞现象,从而提高页面加载速度。但是性能的提升是要付出代价的。代码的异步执行可能会出现竞争状态。简单地说就是页面内部的脚本需要的标示符如果是在外部文件中定义的,而当外部文件异步加载的时候,如果没有保证外部文件和内部脚本执行顺序,很有可能会出现未定义标示符的错误

当异步加载的外部脚本与行内脚本之间存在代码依赖时,就需要通过一种保证执行顺序的方法来整合这两个脚本。

如何保证执行顺序

当外部脚本按常规方式加载时,他会阻塞行内代码的执行,不会出现因为竞争状态而导致的未定义标示符错误。有几个技术可以帮助我们保证执行顺序。

方法1:硬编码回调 (Hardcoded Callback)

让外部的脚本调用内部脚本的函数,以确保代码的顺序执行。例如link

//行内代码
function init() {
  createMenu('examples');
}
var domscript = document.createElement('script');
domscript.src = "menu-with-init.js";
document.getElementsByTagName('head')[0].appendChild(domscript);

//外部文件
function createMenu(id) {
  [...]
}
// callback to the main page
init();
`</pre>

如果开发人员可以同时控制主页面和外部脚本,这种技术是可行的的。但是我们常常会调用第三方的 JavaScript ,比如: jQuery ,我们不可能降回调添加在 jQuery 的文件中。而且这种方法也不太灵活,一旦改变了回调函数需要同时修改外部脚本。  

### 方法2: Window Onload

通过监听 Window 的 onload 事件来触发行内代码的执行。这使得只要确保外部脚本在 window.onload 之前下载执行就能保证执行顺序。有些异步加载技术确保在 window.onload  触发之前加载外部脚步:

Script Onload 是整合异步加载外部脚本和行内脚本的首选。不引用任何外部的标示符,所以维护简单。行内脚本可以在外部脚本加载之后立即执行。同时事件处理也很简单

……未完待续……