CJS / AMD / CMD / UMD / ESM

39 阅读2分钟

CJS

CommonJS的缩写。

  • 用于非web浏览器环境,常见nodeJs环境
  • 浏览器不能直接执行commonJs的代码,需要通过编译转化(常用browserify)
  • 识别方法:是否使用 require()function和module.exports来识别
  • 导入lb的时候,其实是导入一个lib的副本在使用

特点

  1. 所有代码都运行在模块作用域中,不会污染全局变量
  2. 模块按照在代码中的顺序,依次同步加载
  3. 模块会在运行时加载且执行,执行得到对象A,后续通过require获取的都是对对象A的拷贝

ESM

ECMA组织发布的模块化标准(ES Module)。 现代大多数浏览器都支持。

特点

  1. 所有代码都运行在模块作用域中,不会污染全局变量
  2. 因为是静态module结构,支持打包工具去除无用代码
  3. 当你导入lib,实际上是一个引用
  4. 异步加载和简单语法

image.png ES6模块与CommonJs模块之前的差异

AMD

Asynchronous Module Definition的缩写。

  • 用于web浏览器,javascript的解决办法,但基本没人在用了
  • 识别:通过是否使用 define(id?, dependencies?, factory);

特点

  1. 所有代码都运行在模块作用域中,不会污染全局变量;
  2. 模块会被异步加载
  3. 依赖模块加载完成后,会立即执行回调函数
  4. 主模块会等所有依赖加载完成后,再调用其对应的回调函数(依赖前置

CMD

Common Modules Definition的缩写。 和AMD很像。

特点

  1. 所有代码都运行在模块作用域中,不会污染全局变量;
  2. 模块会被异步加载
  3. 模块加载完成后,不会执行其回调函数,而是等到主函数运行且需要的执行依赖的时候才运行依赖函数(依赖后置、按需加载

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; 
  }));

参考文章:juejin.cn/post/695611…