Skip to content

说说你对模块化方案的理解,比如 CommonJS、AMD、CMD、ES Module 分别是什么?

Posted on:2024年8月10日 at 17:07

时间轴:CommonJS --> AMD --> CMD --> ES Module

CommonJS

// 1. 导出:通过module.exports或exports来暴露模块
module.exports = {
  attr1,
  attr2,
};
exports.attr = xx;

注意
不可以exports = xxx,这样写会无效,因为更改了exports的地址,而 exportsmodule.exports 的引用指向的是同一个内存,模块最后导出的是 module.exports

// 2. 引用:require('x')
const xx = require("xx"); // 整体重命名
const { attr } = require("xx"); // 解构某一个导出

AMD

// 1. 导出:通过define来定义模块
// 如果该模块还依赖其他模块,则将模块的路径填入第一个参数的数组中
define(["x"], function (x) {
  function foo() {
    return x.fn() + 1;
  }
  return {
    foo: foo,
  };
});
// 2. 引用
require(["a"], function (a) {
  a.foo();
});

CMD

// 1. 导出:通过define来定义模块
// 如果该模块还依赖其他模块,在用到的地方引用即可
define(function () {
  function foo() {
    var x = require("x");
    return x.fn() + 1;
  }
  return {
    foo: foo,
  };
});
// 2. 引用
var x = require("a");
a.foo();

ES module

// 1. 导出:通过export 或 export default 输出模块
// 写法1: 边声明,边导出
export var m = 1;
export function m() {}
export class M {}

// 写法2:导出一个接口 export {},形似导出对象但不是, 本质上是引用集合,最常用的导出方法

export { attr1, attr2 };

// 写法3:默认导出

export default fn;

// 2. 引用
import { x } from "test.js"; // 导出模块中对应的值,必须知道值在模块中导出时的名字
import { x as myx } from "test.js"; // 改名字
import x from "test.js"; // 默认导出的引用方式

注意

  1. export default在同一个文件中只可存在一个(一个模块只能有一个默认输出)
  2. 一个模块中可以同时使用export default 和 export
// 模块 test.js
var info = {
  name: "name",
  age: 18,
};
export default info;
export var name = "海洋饼干";
export var age = 18;

// 引用
import person, { name, age as myAge } from "test.js";
console.log(person); // { name: 'name', age: 18 }
console.log(name + "=" + myAge); // 海洋饼干=18
原文转自:https://fe.ecool.fun/topic/f5f2f81e-c0c8-409e-ba00-3f3428ae535b