CJS
CommonJS的缩写。
- 用于非web浏览器环境,常见nodeJs环境
- 浏览器不能直接执行commonJs的代码,需要通过编译转化(常用browserify)
- 识别方法:是否使用
require()
function和module.exports
来识别 - 导入lb的时候,其实是导入一个lib的副本在使用
特点
- 所有代码都运行在模块作用域中,不会污染全局变量
- 模块按照在代码中的顺序,依次同步加载
- 模块会在运行时加载且执行,执行得到对象A,后续通过require获取的都是对对象A的拷贝
ESM
ECMA组织发布的模块化标准(ES Module)。 现代大多数浏览器都支持。
特点
- 所有代码都运行在模块作用域中,不会污染全局变量
- 因为是静态module结构,支持打包工具去除无用代码
- 当你导入lib,实际上是一个引用
- 异步加载和简单语法
AMD
Asynchronous Module Definition的缩写。
- 用于web浏览器,javascript的解决办法,但基本没人在用了
- 识别:通过是否使用
define(id?, dependencies?, factory);
特点
- 所有代码都运行在模块作用域中,不会污染全局变量;
- 模块会被异步加载
- 依赖模块加载完成后,会立即执行回调函数
- 主模块会等所有依赖加载完成后,再调用其对应的回调函数(依赖前置)
CMD
Common Modules Definition的缩写。 和AMD很像。
特点
- 所有代码都运行在模块作用域中,不会污染全局变量;
- 模块会被异步加载
- 模块加载完成后,不会执行其回调函数,而是等到主函数运行且需要的执行依赖的时候才运行依赖函数(依赖后置、按需加载)
UMD
Universal Module Definition的缩写。 主要用于前后端备胎 一般可以把cjs转为UMD,用于浏览器运行时使用。在兼容 CommonJS 和 AMD 规范的同时,还兼容全局引用的方式。
(function (root, factory) {
if (typeof define === "function" && define.amd) {
define(["jquery", "underscore"], factory);
} else if (typeof exports === "object") {
module.exports = factory(require("jquery"), require("underscore"));
} else {
root.Requester = factory(root.$, root._);
}
}
(this, function ($, _) {
// this is where I defined my module implementation
var Requester = { // ... };
return Requester;
}));