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日
下一篇 2023年2月10日

相关推荐

  • JavaScript事件处理程序(又称为事件监听器)详解

    1.概念 负责处理或响应事件而调用的函数称为 事件处理程序(又称为 事件监听器)。 概念 示例 事件类型(又称为 事件名称) “click” 事件目标 <button> 事件处理程序属性名 onclick 事件处理程序(又称为 事件监听器) myFunction() 事件对象 event 2.HTML事件处…

    JavaScript经验 2023年5月11日
    03430
  • JavaScript对象简谱(JavaScript Object Notation,JSON)详解

    1.结构(structure) 1.1对象(object) 对象(object)是“键/值”对的无序集合。 一个对象以左花括号 { 开始,然后以右花括号 } 结束。键必须使用双引号字符串,每个键后跟一个冒号 :  ,“键/值”对之间使用逗号 , 分隔。 1.2数组(array) 数组(array)是值的有序集合。 一个…

    JavaScript经验 2023年3月2日
    03710
  • HTML文件路径

    绝对路径 描述 <img src=”https://www.example.com/picture.jpg”> 在 https://www.example.com/ 绝对路径下 相对路径 描述 <img src=”picture.jpg”> 在包含<img>元素的 HTML 文件的所在目录下 <…

    JavaScript经验 2023年10月11日
    02090

发表回复

登录后才能评论