js模块化规范进化史,CommonJS、AMD、CMD、UMD、ES module

1、CommonJS

require("module");
require("../file.js");
exports.doStuff = function() {};
module.exports = someValue;

优点:Node.js采用了这个规范,npm中模块数量多

缺点:同步加载模块,只有加载完成后才能执行后面的操作

2、AMD

异步模块定义规范(AMD)制定了定义模块的规则,这样模块和模块的依赖可以被异步加载。

define(id?, dependencies?, factory);

第一个参数,id,是个字符串。它指的是定义中模块的名字

第二个参数,dependencies,是个定义中模块所依赖模块的数组。

第三个参数,factory,为模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值。

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

优点:依赖前置,在浏览器环境中异步加载模块,可以并行加载多个模块

缺点:开发成本高,代码的阅读和书写比较困难,模块定义方式的语义不顺畅

3、CMD

Common Module Definition 规范和 AMD 很相似,尽量保持简单,并与 CommonJS 和 Node.js 的 Modules 规范保持了很大的兼容性。

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

优点:依赖就近,延迟执行 可以很容易在 Node.js 中运行;

缺点:依赖 spm(static package manager) 打包,模块的加载逻辑偏重;

4、UMD

UMD规范是 AMD + CommonJS + Global Variable的风格组合产物。

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define(factory) :
  (global = global || self, global.Vue = factory());
}(this, function () { 'use strict' })

本质是一个立即执行函数

// rename function () { 'use strict' ...
function Vue () { 'use strict';
    /* */
}

// rename function (global, factory) ...
function UMD (global, factory) {
    /* deleted for clarity */
}

UMD(this, Vue);

5、ES module

export const name = 'bababa'
export default constant

import { ep1, ep2, ep3 } from './ep'
import ep from './ep'

了解更多 es module 看这篇文章 https://www.cnblogs.com/yujiaming890321/p/15745495.html

posted @ 2021-12-29 16:27  远方的少年🐬  阅读(196)  评论(0编辑  收藏  举报