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點就行了:
type
字段的產生用於定義package.json
文件和該文件所在目錄根目錄中.js
文件和無拓展名文件的處理方式。值爲'moduel'
則當作es模塊處理;值爲'commonjs'
則被當作commonJs模塊處理- 目前node默認的是如果
pacakage.json
沒有定義type
字段,則按照commonJs規範處理 - node官方建議包的開發者明確指定
package.json
中type
字段的值 - 無論
package.json
中的type
字段爲何值,.mjs
的文件都按照es模塊來處理,.cjs
的文件都按照commonJs模塊來處理