前端模块系统的发展史

本贴最后更新于 2170 天前,其中的信息可能已经水流花落

前端模块系统

script 标签

模块系统在 JavaScript 出来的时候就已经存在了,之前的前端加载 JavaScript 的方式就是使用 <script> 标签,例如:

<script src="module1.js"></script>
<script src="module2.js"></script>
<script src="module3.js"></script>
...

每一个文件都被看成一个模块,通常这些模块都是暴露在全局作用域下,也就是定义在 window 对象中,当然你也可以使用命名空间来组织这些模块。这样做必须要考虑 js 模块的加载顺序,而且容易造成变量冲突,版本控制也是一个问题。

CommonJS 规范

现在我么使用的 Node.js 就是遵循的 CommonJS 规范(它的 package.js 就是一个最好的例子),该规范允许 require 方法同步加载所要依赖的其它模块,然后通过 exports 导出。这种方式在服务端可以,但是在浏览器环境中,是会阻塞加载的,浏览器资源是异步加载的。

require('../io.js');
export.myFunction=function() {};
moulde.exports=someVal;

AMD (Asynchronous Module Definition)规范

它是通过 define(id?,dependencides?,factory)这个主要接口,在声明模块的时候指定所有的依赖 dependencides,并将形参传到 factory 中,对于依赖的模块提前执行,依赖前置。

define("module",["dep1","dep2"],function(d1,d2){
  return someExportedVal;
});
require(["module","../io"],function(module,io){....});

它适合在浏览器中异步加载模块,可以并行加载多个模块

CMD (Common Module Definition)规范

CMD 和 AMD 很相似,他通过 SPM 打包,可以很容易在 Node.js 中运行,依赖就近,延迟执行,但是模块的加载逻辑偏重。

define(function(require, exports,module){
  var $=require('jquery');
  var Spinning = require('spinning');
  export.something = ...
  
});

UMD (Universal Module Definition)规范

类似于 CommonJS 和 AMD 的语法糖,是模块定义的跨平台解决方案。

ES6 模块

ECMAScript6 标准,它偏静态化的,在编译时能够确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 都实在运行时确定这些东西的。但现在的浏览器端还没有实现该标准。

Webpack 眼中的模块

Webpack 会对所有的静态资源进行分析,所以在 Webpack 看来,不光是 Javascript 是模块,图片、CSS、字体、SVG、HTML 模板都是模块,我会在后面的文章中专门来分析 Webpack。当然,不光是 Webpack,Node.JS 也可以通过 require 的来加载这些模块。下面官方的这张截图就能说明 webpack 对模块的认识。
Webpack

  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 147 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 291 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    713 引用 • 1174 回帖 • 120 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...