搞懂JS模块各个写法

搞懂 Commonjs、AMD、CMD、UMD、ES Modules



先说Rollup是什么?

是一个打包的ES Module的工具;

Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序。Rollup 对代码模块使用新的标准化格式,这些标准都包含在 JavaScript 的 ES6 版本中,而不是以前的特殊解决方案,如 CommonJS 和 AMD。ES6 模块可以使你自由、无缝地使用你最喜爱的 library 中那些最有用独立函数,而你的项目不必携带其他未使用的代码。ES6 模块最终还是要由浏览器原生实现,但当前 Rollup 可以使你提前体验

Rollup并不支持CommonJS和AMD的打包方式


CommonJS

CommonJS主要用于服务端,一个单独的文件就是一个模块,node.js为主要实践者。

提供支持:

  • module
  • exports
  • require
  • global

require 命令用于输入其他模块提供的功能

module.exports命令用于规范模块的对外接口,输出的是一个值的拷贝,输出之后就不能改变了,会缓存起来。

CommonJS 采用同步加载模块,而加载的文件资源大多数在本地服务器,所以执行速度或时间没问题。但是在浏览器端,限于网络原因,更合理的方案是使用异步加载。


AMD

采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。其中 RequireJS 是最佳实践者。

异步加载模块


CMD

CMD(Common Module Definition - 通用模块定义)规范主要是Sea.js推广中形成的,一个文件就是一个模块,可以像Node.js一般书写模块代码。主要在浏览器中运行,当然也可以在Node.js中运行。

  • TS:sea,js是什么?SeaJS是一个遵循CMD规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制。

它与AMD很类似,不同点在于:AMD 推崇依赖前置、提前执行,CMD推崇依赖就近、延迟执行


UMD

UMD 叫做通用模块定义规范(Universal Module Definition)。也是随着大前端的趋势所诞生,它可以通过运行时或者编译时让同一个代码模块在使用 CommonJs、CMD 甚至是 AMD 的项目中运行。未来同一个 JavaScript 包运行在浏览器端、服务区端甚至是 APP 端都只需要遵守同一个写法就行了。

它没有自己专有的规范,是集结了 CommonJs、CMD、AMD 的规范于一身,我们看看它的具


ES Modules

简称ESM,是 JavaScript 官方的标准化模块系统。

  • 它因为是标准,所以未来很多浏览器会支持,可以很方便的在浏览器中使用。(浏览器默认加载不能省略.js)
  • 它同时兼容在node环境下运行。
  • 模块的导入导出,通过import和export来确定。
  • 可以和Commonjs模块混合使用。
  • ES modules 输出的数值的引用,输出接口动态绑定,而 CommonJS 输出的是值的拷贝
  • ES modules 模块编译时执行,而 CommonJS 模块总是在运行时加载
import { name, github } from './demo.js';

console.log(name(), github());

document.body.innerHTML = `

${name()} ${github()}

`

总结

CommonJS 同步加载, AMD 异步加载, UMD = CommonJS + AMD , ES Module 是标准规范, 取代 UMD,是大势所趋。 Tree-shaking 牢记副作用。