Node.js使用ES6 Module

Node.js可以直接使用ES6 module新語法,而不需要透過babel等編譯器,在Node.js 12(2019-04-23發佈) 版本後,支援了新的ECMAScript module(ESM)改進。13版本後可以更容易的使用 ESM 語法。

簡單結論

Node >= v13

選擇下面兩種其一:

  • 將 ES modules 檔案的副檔名存為 .mjs
  • 加入 { "type": "module" } 在 package.json 檔案中

Node <= v12

Node 8-12版本,將 ES modules 檔案的副檔名存為 .mjs,然後以下面的方式來執行:

node --experimental-modules my-app.mjs

註:Node.js 12+ 原生支援 ESM 但需要透過旗標 --experimental-modules,Node.js 13.2.0+ 原生支援 ESM 不需要透過旗標。

使用 ESM 語法導入 CommonJS 模組

有許多內建的 Node.js 模組為 CommonJS 模組,導入的語法如下:

import * as http from 'http'
import * as fs from 'fs'
import * as path from 'path'
import * as readline from 'readline'
import * as os from 'os'

你也可以導入部份的函式或變數:

import { fileURLToPath } from 'url'
import { dirname } from 'path'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)

如果還想要使用 CommonJS 模組,此時應儲存為副檔名.cjs,如下範例:

// common.cjs
module.exports = {
foo: 1,
}

然後在自己的檔案中用 import 語法來導入:

// test.js
import common from './common.cjs'
console.log(common) // {foo: 1}

參考