的“type”字段
如果最近的文件包含一个*字段“type”,其值为“module”,则以.js结尾或没有任何扩展名的文件将作为ES模块进行加载。
最近的被定义为第一个在当前文件夹、该文件夹的父文件夹等中搜索时发现的,直到到达卷的根目录。
//
{
"type": "module"
}
在上述所在的文件夹
node --experimental-modules #将作为ES模块运行
如果最近的缺少“type”字段,或者包含“type”:“commonjs”,则无扩展名的文件和.js结尾文件将被视为commonjs。如果一直到卷根,还是没找到, 则按默认规则运行,就像中没有“type”字段。“无扩展”指的是不包含扩展名的文件路径,而不是在说明符中选择性地删除文件扩展名。
如果最近的父包含“type”:“module”,则.js结尾的文件和和无扩展文件的导入语句将被视为ES模块。
// , part of the same example as above
import './'; // Loaded as ES module because of
包的作者应该在中指明“type”字段,即使在所有源都是CommonJS的包中也是如此。如果的默认类型发生了变化,那么明确包的类型将使包在将来不会受到影响,而且它还使构建工具和加载程序更容易确定包中的文件应该如何解释。
不管“type”字段的值是多少,.mjs文件总是被当作ES模块,而.cjs文件总是被当作CommonJS。
总结
总的来说,关于type,知道下面4点就行了:
-
type
字段的产生用于定义文件和该文件所在目录根目录中
.js
文件和无拓展名文件的处理方式。值为'moduel'
则当作es模块处理;值为'commonjs'
则被当作commonJs模块处理 - 目前node默认的是如果
没有定义
type
字段,则按照commonJs规范处理 - node官方建议包的开发者明确指定
中
type
字段的值 - 无论
中的
type
字段为何值,.mjs
的文件都按照es模块来处理,.cjs
的文件都按照commonJs模块来处理