Alex Liang

NodeJS使用ESM Import載入模組

上一篇介紹如何解決CommonJS相對路徑問題。假如你偏好ES6的export/import,從NodeJS 12開始支援實驗性質的解決方法。

二個地方需要修改:

  1. package.json 加入 "type": "module"
  2. 執行程式時加入 --experimental-modules 或修改package.json的start script

以上是不用修改副檔名的方式,否則NodeJS預設只認.mjs的檔案能使用export/import

接下來介紹 export/import 的基本語法

有二種 export 方式: nameddefault, 一個檔案可以有許多 named export, 但只能有一個 default export

1
2
3
// 以下是 named export
export funcA = val => Math.sqrt(val);
export const seed = Math.random();
1
2
// 以下是 default export, 注意結尾不加分號
export default class Calculator { ... }

named export 會強制使用同樣的名稱 import, 而 default export 可用任意名稱輸入, 例如:

1
2
3
4
export default str = 'default'; // module1.js

import a from './module1';
console.info(a); // 'default'

如果一個檔案有許多 named export, 如果要選擇部分物件, 則:

1
2
3
4
5
6
7
8
9
// constant.js
export VALID_TYPES = [...];
export VALID_STATUS = [...];

// app.js, 只輸入 VALID_TYPES
import { VALID_TYPES } from './constant';

// app2.js, 將 VALID_STATUS 改名
import { VALID_STATUS as ALERT_STATUS } from './constant'

reference:

  1. import document
  2. export document

NodeJS 解決require相對路徑問題

Node.JS目前有二種方式載入module: CommonJS(也就是本文會介紹的方式)及ES6的import/export

CommonJS是預設的module載入方式,其使用方式為 require & module.exports

funcA.js
1
2
3
4
5
function funcA() {
// ...
}

module.exports = funcA;
index.js
1
2
3
4
5
const funcA = require('funcA');

function main() {
funcA();
}

相信大家對此都不陌生,然而此方法最大的問題是module如果是專案的source file,其require的路徑為相對路徑。假如專案結構有許多階層,在使用上會相當不便

Read More