Skip to content

模块化

多人开发中

  • 命名空间冲突
  • 模块复用
  • 提高代码可维护性

CommonJS

  • Node.js 是基于 CommonJS 来实现的,同步导入文件,
  • 是值的导出,后面值发生变化需要重新导入
  • 运行时加载

ESModule 是引用的导出

  • 静态分析,进行 treeshaking,(没有真正引入的模块代码并移除的能力)
  • 编译时输出
  • export default 默认导出是一个值,export { a } 批量导出是一个地址
js
let x = 10;
let y = 20;
setTimeout(() => {
  x = 100;
  y = 200;
}, 10);

export { x };
export default y;

AMD

require(['',''], function(a,b){ a.add(); b.add() })

CMD

defined(function(require, exports, module){ var a = require('a'); })

export

js
//-------------a.js---------------------
export default "hello";

//-------------index.js---------------------
console.log(_); // hello 可以打印出来, 函数提升类似
import _ from "./a.js";
// if () {
// 		console.log(import _ from './a.js') // ❌ 只能放到最外层作用域
// }
console.log(_); /// hello;
_ = "word"; // ❌ 不能修改导出后的结果

异步导入

js
let btn = document.createElement("button");
btn.addEventListener("click", function () {
  import("./d.js").then((res) => {
    // import 返回是一个 promise,结果返回带 default
    console.log(res.default); // import * as res from './d.js'
  });
});
document.body.appendChild(btn);
  • AMD: 同步加载完之后执行,模块与模块之间是串行的加载的
  • CMD: 异步模块加载器:按需加载后执行,异步加载但是如果有依赖关系的还是串行的
  • SEA: 依赖加载优化,静态分析依赖关系,同步并行加载

在 MIT 许可下发布