在Node版本13.2.0(2019年)之前,我们一般使用CJS(CommonJS)模式在代码中引入包,它的加载是同步的,在整个模块加载完成后,才会执行后续代码。而ESM(ECMAScript Modules)最早在2015年就被使用在浏览器中,在script标签中增加type="module"这个属性,然后引入模块进行使用。
在Node 13.2版本后,Node也支持使用ESM进行导入模块的操作,那么在发布npm包时如何对其二者进行兼容?请接着往下看
想直接看解决方式的同学空降这里
上面提到的两种模式,需要简单介绍一下
CJS (CommonJS)是一种在 JavaScript 中实现模块系统的规范。CJS模块是单独的JavaScript文件,每个模块可以导出一个或多个值,其他模块可以使用require()函数导入这些值。CJS比较适合在服务端使用,因为它可以访问文件系统并直接加载模块,但是由于无法异步加载和编译的关系,使其不适合运行在浏览器中
以下是使用CJS模式导入,导出模块的示例
params.js
module.exports = {
a: 1,
b: 2,
};
index.js
const params = require("./params");
const fn = function (params) {
const { a, b } = params;
console.log(a + b);
};
fn(params);
此外,CJS还支持exports的方式导出
exports.params = {
a: 1,
b: 2,
};
说完了CJS,我们来看看ESM
ECMAScript(ES)模块是JavaScript的一种模块系统,是从ECMAScript6(ES6)开始引入的。与CJS不同,ES模块是异步加载的,CJS在运行时加载模块,而ESM是静态的,其在编译时就定义了模块
用法示例
export default {
a: 1,
b: 2,
};