当我们开发的应用在浏览器环境中运行时,必须使用 ES 模块规范。
当我们开发的应用在服务器环境中运行时,既可以使用 ES 模块规范,又可以使用 Node.js 风格的 CommonJS 模块规范,本文介绍 Node.js 包中的模块的解析规则。
1.包入口点
在一个包的 package.json
文件里,"main"
和 "exports"
这两个字段都可以定义包的入口点。
当 "main"
和 "exports"
这两个字段都不存在时,则 Node.js 会在包的根目录下依次查找 index.js
、index.node
文件。
当 "main"
和 "exports"
这两个字段都存在时,"exports"
字段的优先级高于 "main"
字段,所以推荐使用 "exports"
字段,而使用 "main"
字段仅仅用于向后兼容。
1.1"main"
字段
"main"
字段支持 Node.js 的所有版本,但只支持定义包的主入口点。
{
"main": "./index.js"
}
1.2"exports"
字段
"exports"
字段只支持 Node.js 12 (包括)以上的版本,除了支持定义包的主入口点,还支持子路径导出(Subpath exports)、条件导出(Conditional exports)等入口点。
注意:"exports"
中定义的所有路径必须是以 ./
开头。
1.2.1主入口点
//"."表示主入口点
{
"exports": {
".": "./index.js"
}
}
//当"."是唯一的导出时,则可以将上述代码简写。
{
"exports": "./index.js"
}
1.2.2子路径导出(Subpath exports)入口点
可以通过 "."
的子路径的方式定义子路径导出入口点。
{
"exports": {
".": "./index.js",
"./submodule.js": "./src/submodule.js"
}
}
//导入./node_modules/es-module-package/src/submodule.js
import submodule from 'es-module-package/submodule.js';
1.2.3条件导出(Conditional exports)入口点
条件导出(Conditional exports)提供了一种根据特定条件映射到不同路径的入口点的方式。
如果 "exports"
字段的值为对象,则对象的键顺序很重要。在条件匹配过程中,较早的条目的优先级高于较晚的条目。一般规则是条件应该按照对象的顺序从最具体到最不具体。
字段 | 描述 |
"node-addons" | 匹配任何 Node.js 环境。 |
"node" | 匹配任何 Node.js 环境。在大多数情况下,显式调用 Node.js 平台是不必要的。 |
"import" | 匹配当包通过 import 语句 或 import() 运算符,或 通过 ECMAScript 模块加载器的任何顶级导入或解析操作加载时。 |
"require" | 匹配当包通过 require() 函数加载时。 |
"default" | 总是匹配。此字段应该永远排在最后。 |
{
"exports": {
"import": "./index-module.js",
"require": "./index-require.cjs"
}
}
2.确定模块系统
当同时缺少以下两种模块系统的显式标记时,Node.js 将检查模块文件的源代码以查找 ES 模块语法,如果找到了 ES 模块语法,此模块文件会被认为是 ES 模块,否则会被认为是 CommonJS 模块。
注意:以下项只要满足任其一即可。
确定模块系统 | ES模块系统的显式标记 | CommonJS模块系统的显式标记 |
文件扩展名 | .mjs | .cjs |
package.json 文件的 "type" 顶级字段 | "module" | "commonjs" |
node 命令的 --input-type 选项 | module | commonjs |
node 命令的 --experimental-default-type 选项 | module | commonjs |
3.确定包管理工具
确定包管理工具 | 值 |
package.json 文件的 "packageManager" 顶级字段 | "<package manager name>@<version>" 示例: "yarn@3.2.0" 、"pnpm@8.15.1" 。 |
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/experience/javascriptexp/33953.html