CommonJS 规范
基于文件系统,不适用于浏览器
node 端
模块文件
// m1.js
const mod = {
a: 1,
b: 3,
fn() {
console.log("hello");
},
};
module.exports = {
mod,
};
引入模块
// m2.js
const { mod } = require("./m1.js");
mod.fn(); // hello
AMD 规范
requireJS 是 AMD 规范的一种实现,可用于浏览器
// 模块文件 a.js
define(function () {
let a = 1;
let b = 2;
return { a, b };
});
/*
// 或者这样写
define(function (require, exports, module) {
let a = 1;
let b = 2;
module.exports = {
a,
b,
};
});
*/
// 主文件 b.js
// 这里的第一个参数中,可以在数组里面引入多个模块,逗号分隔,第二个函数参数中每一个形参都跟引入的模块一一对应
define(["./a.js"], function (a) {
console.log(a);
});
/*
// 或者这样写
define(function (require, exports, module) {
let a = require("./a");
console.log(a);
});
*/
<!-- 浏览器中引入主模块 -->
<html>
<body>
<!-- 这里的 require.js 是 AMD 规范的实现 -->
<script src="./require.js" data-main="./b.js"></script>
</body>
</html>
ESM
ES6 的模块化方式
// a.js
let a = 1;
let b = 2;
function fn() {
console.log("a module :", a + b);
}
// 需要导出的数据列表
export { a, b, fn };
// b.js
import * as A from "./a.js";
console.log(A.a);
A.fn();
/*
// 当然也可以通过解构引入
import { a, b, fn } from "./a.js";
console.log(a);
fn();
*/
<html>
<body>
<!-- 浏览器中,type ='module' 是关键 -->
<script type="module" src="./b.js"></script>
</body>
</html>
动态导入模块
// a.js 模块
let a = 1;
let b = 2;
function fn() {
console.log("a module :", a + b);
}
export { a, b, fn };
// b.js 模块
document.onclick = function () {
// 这里 import 会返回一个 promise
import("./a.js").then((data) => {
data.fn();
});
// 当然也支持 async + await
// let m1 = await import("./a.js")
};
<!-- 当点击页面的时候才会加载 b.js -->
<html>
<body>
<script type="module" src="./b.js"></script>
</body>
</html>