Node新版本13.2.0正式支持ES Modules特性

在本月 21 日,即2019.11.21,Node.js 發佈了 13.2.0 版本,更新了一些特性。其中最使人興奮的莫過於正式取消了 --experimental-modules 啓動參數。這說明Node.js 正式支持 ES modules。咱們一塊兒來看看。前端

Stability Index說明

Stability Index,即 Api 的穩定指數說明。它包括3個值:node

  1. Stability: 0 ,不推薦使用。表示該Api官方不推薦使用,該功能可能會發出警告。不能保證向後兼容。
  2. Stability: 1,實驗性的。表示該Api已經支持使用性使用。可是在未來的任何發行版中均可能發生非向後兼容的更改或刪除。不建議在生產環境中使用該功能。
  • Stability: 2,穩定版。表示已經試驗完成,基本不會再發生改動,能夠再生產環境中使用。

Unflag --experimental-modules

在 13.2.0的版本中,node 默認狀況下會啓用對ECMAScript模塊的實驗支持,也就是不須要啓動參數了。那麼nodejs是如何區分 esm 和 commonjs 的呢?這裏翻譯一下官方文檔。git

Node.js會將把如下內容視爲ES模塊:github

  • 文件後綴爲.mjs
  • 當文件後綴爲.js,或者無文件後綴時,看其package.json文件,package.json 中 type 字段值爲 "module"
  • 啓動參數添加 —-input-type=module
  • 使用傳遞字符參數給--eval,如$ node --eval 'import("http");

其餘狀況下,都會被識別爲 commonjs。如今node已經支持esm和commonjs了,咱們在使用的時候,最好仍是指定一下模塊。json

舉個例子🌰

import './legacy-file.cjs';
// Loaded as CommonJS since .cjs is always loaded as CommonJS.

import 'commonjs-package/src/index.mjs';
// Loaded as ES module since .mjs is always loaded as ES module.
複製代碼

這種狀況,根據文件後綴按不一樣模塊處理。微信

// package.json
{
  "type": "module"
}
複製代碼

當前目錄下,或者上級目錄中的package.json含有"type": "module"時,該模塊會被看成ES Module。app

// my-app.js, in an ES module package scope because there is a package.json
// file in the same folder with "type": "module".

import './startup/init.js';
// Loaded as ES module since ./startup contains no package.json file,
// and therefore inherits the ES module package scope from one level up.

import 'commonjs-package';
// Loaded as CommonJS since ./node_modules/commonjs-package/package.json
// lacks a "type" field or contains "type": "commonjs".

import './node_modules/commonjs-package/index.js';
// Loaded as CommonJS since ./node_modules/commonjs-package/package.json
// lacks a "type" field or contains "type": "commonjs".
複製代碼

如上圖註釋所示,若是當前文件目錄不包含package.json,則會看其父級目錄的package.json文件,而後判斷type類型。學習

node --input-type=module --eval "import { sep } from 'path'; console.log(sep);"
echo "import { sep } from 'path'; console.log(sep);" | node --input-type=module
複製代碼

這裏就是使用傳遞字符參數給--eval,添加 --input-type啓動參數的狀況。ui

快速體驗

目前13.2.0版本的官方文檔對ES Module的標記是 Stability: 1,你已經能夠安裝新版原本試驗啦。相信在社區的共同努力下,很快就會進入 Stability: 2 正式穩定版了。spa

本地開發的時候,常常須要快速更新或切換不一樣的node版本。可使用 nvm、n 等方案,還有一個跨平臺的本地管理方案就是 nvs。均可以選擇使用,這裏我舉的例子,就是使用 nvs:

$ nvs add node/13.2.0
$ nvs use 13.2.0
$ node -v
13.2.0
複製代碼

趕忙嘗試一下吧~

最後

  • 歡迎加我微信(winty230),拉你進技術羣,長期交流學習...
  • 歡迎關注「前端Q」,認真學前端,作個有專業的技術人...

GitHub
相關文章
相關標籤/搜索