cjs 是 Node 的模块化规范,使用 require & exports 进行导入导出
cjs 可作用于 node 环境 & webpack 环境,但不可作用浏览器
如果前端项目在 webpack 中,也可以理解为浏览器和 Node 都支持
有些模块只支持 cjs,比如 ms,但并不影响它在前端项目中使用 ( 通过 webpack )
但是,如果通过 cdn 的方式直接在浏览器中引入,则会出问题
/* cjs1.js */
module.exports = 10; // 导出一个数值
console.log("cjs1.js");
/* cjs2.js */
const num = require("./cjs1"); // 导入数据
console.log("cjs1", num); // cjs1 10
require 数据require(`./${a}`);
详细介绍见:CommonJs
import & export 进行导入导出/* esm1.js */
export let age = 18;
console.log("esm1.js");
/* esm2.js */
import { age } from "./esm1.js";
console.log(age); // 18
import 数组// 报错
import { 'f' + 'oo' } from 'my_module'; // 不能使用 [表达式] 接收导入数据
// 报错
let module = 'my_module';
import { foo } from module; // 不能使用 [变量] 作为被导入文件的路径
// 报错:不能在语句内进行导入
if (true)
import { foo } from 'module1';
import("./module.js") 进行导入详细介绍见:ESModule
cjs 输出的是值的拷贝,esm 输出的是值的引用
∴ 数据源更新后,esm 导出的数据也会被更新
cjs 是运行时加载,esm 是编译时加载
∴ esm 的导入语句 import 会自动提升
cjs 是动态加载,esm 是静态加载
∴ esm 不可以通过变量导入数据