雨夜带刀's Blog

模块加载器的进化–并行加载

easy.js的模块加载器的详解(如果你没有阅读过,最好是先去阅读下,这样才能更好的理解这篇博文)中我详细的介绍过有关 easy.js 的加载器的实现。其加载和执行的顺序都要严格依赖队列一个一个的加载和执行,这种加载和执行方式就是串行。此文将介绍模块加载器并行加载的实现。

在讲解并行加载的实现原理之前,首先有必要对 JavaScript 文件的加载的执行有一个初步的了解。

JavaScript 在页面渲染时可能会对 DOM 元素进行修改,并且多个文件之间还会有依赖的关系,因此必须严格按照顺序依次执行,正是由于此种特性就势必对之后的页面资源的加载造成阻塞。但是请注意,这里说到的是按顺序执行

由于 JavaScript 阻塞的特性,也影响到浏览器对 JavaScript 文件的加载,在老版本浏览器中,加载完就执行,执行完再加载,这正是上面说到的串行加载。为了提升性能,在现代浏览器中,如新版本的 Firefox 和 Chrome,将加载改成了并行。并行加载允许一次性同时加载多个文件,在 HTTP1.1 中,多个文件并行加载只需要发起一个 TCP 连接数。试想下,一条流水线依次生产十个产品肯定要比十条流水线同时生产一个产品要慢得多。虽然在现代浏览器中可以实现并行加载 JavaScript,但是其执行顺序还是要按照顺序来执行的。

之前的 easy.js 的模块加载器的确是按照老版本浏览器串行加载和执行的思路来实现的,而最新版的模块加载器就是按照现代浏览器的并行加载,串行执行的思路来实现的。

easy.js的模块加载器的详解

模块加载器的实现方法应该比较多,主要还是看哪种实现起来更简单,更易扩展。对于遵循不同规范的模块加载器,实现原理又千差万别。不管是用哪种实现方法,最终都是要满足模块加载器的那些最基本的功能。那么模块加载器的最基本的功能基本就可以概括成下面这几点。

  • 定义模块
  • 处理依赖
  • 加载模块

定义模块

define( "hello", function(){
 return "hello world";
});
头像

雨夜带刀

前端开发工程师,技术宅,现居北京。

雨夜带刀的开源项目

easy.js
一个简洁的 JavaScript 类库,集成了模块加载器,同时也有包含了常见的的组件库,可访问项目网站
seed
符合 AMD 规范的 JavaScript 模块加载器。
ecope
从 easy.js 组件库中移值过来的基于 jQuery 的组件库,简单实用,API 风格统一。