package.json的“type”字段

如果最近的package.json文件包含一个顶级字段“type”,其值为“module”,则以.js结尾或没有任何扩展名的文件将作为ES模块进行加载。

最近的package.json被定义为第一个在当前文件夹、该文件夹的父文件夹等中搜索时发现的package.json,直到到达卷的根目录。

// package.json
{
  "type": "module"
}

在上述package.json所在的文件夹
node --experimental-modules my-app.js #my-app.js将作为ES模块运行

如果最近的package.json缺少“type”字段,或者包含“type”:“commonjs”,则无扩展名的文件和.js结尾文件将被视为commonjs。如果一直到卷根,还是没找到package.json, Node.js则按默认规则运行,就像package.json中没有“type”字段。“无扩展”指的是不包含扩展名的文件路径,而不是在说明符中选择性地删除文件扩展名。

如果最近的父package.json包含“type”:“module”,则.js结尾的文件和和无扩展文件的导入语句将被视为ES模块。

// my-app.js, part of the same example as above
import './startup.js'; // Loaded as ES module because of package.json

包的作者应该在package.json中指明“type”字段,即使在所有源都是CommonJS的包中也是如此。如果Node.js的默认类型发生了变化,那么明确包的类型将使包在将来不会受到影响,而且它还使构建工具和加载程序更容易确定包中的文件应该如何解释。

不管“type”字段的值是多少,.mjs文件总是被当作ES模块,而.cjs文件总是被当作CommonJS。

总结

总的来说,关于type,知道下面4点就行了:

  1. type字段的产生用于定义package.json文件和该文件所在目录根目录中.js文件和无拓展名文件的处理方式。值为'moduel'则当作es模块处理;值为'commonjs'则被当作commonJs模块处理
  2. 目前node默认的是如果pacakage.json没有定义type字段,则按照commonJs规范处理
  3. node官方建议包的开发者明确指定package.jsontype字段的值
  4. 无论package.json中的type字段为何值,.mjs的文件都按照es模块来处理,.cjs的文件都按照commonJs模块来处理
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐