Node.js包中的模块的解析规则

当我们开发的应用在浏览器环境中运行时,必须使用 ES 模块规范。

当我们开发的应用在服务器环境中运行时,既可以使用 ES 模块规范,又可以使用 Node.js 风格的 CommonJS 模块规范,本文介绍 Node.js 包中的模块的解析规则。

1.包入口点

在一个包的 package.json 文件里,"main""exports" 这两个字段都可以定义包的入口点。

"main""exports" 这两个字段都不存在时,则 Node.js 会在包的根目录下依次查找 index.jsindex.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 选项modulecommonjs
node 命令的 --experimental-default-type 选项modulecommonjs

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

(0)
huoxiaoqiang的头像huoxiaoqiang
上一篇 2024年1月25日 02:27
下一篇 2022年1月1日 13:34

相关推荐

  • npm exec和npx的区别

    从以上两者的使用方式上,我们很容易可以看出,npm exec 命令后面的内容与 npx 命令后面的内容相同,npx 就是 npm exec 的简写,但在解决包方面还是有一些区别的,如下所示: npm exec 可以使用双连字符(–)标志(flag)来抑制作为选项的包的解决,以达到与 npx 一样的功能。 npx

    JavaScript经验 2021年7月24日
    01.6K0
  • 使用CSS的三种方式

    1.内联(Inline)方式 内联(Inline)方式,又称为行内方式。往往用于单个元素。 2.内部(Internal)方式 往往用于单个网页。 3.外部(External)方式 往往用于所有网页。 4.优先级 当同时存在多种使用 CSS 的方式时,如果为相同的选择器(元素)定义了相同的 CSS 属性名,则优先级如下:…

    JavaScript经验 2023年10月10日
    03220

发表回复

登录后才能评论