Node.js CommonJS Modules

2022-02-04

筆記 Node.js 的 CommonJS Modules 機制,並比較與 ES 6 Modules 的使用異同 🙂

JavaScript logo

說明

使用 CommonJS 的目的在於模組化開發 JS,並享受豐富的 NPM 生態資源,但 CommonJS 無法在 Brwoser Side 原生環境使用,必須藉由 WebPack、Parcel 等打包工具模組的引入來使用。

ES 6 Modules (ESM) 則可以原生在瀏覽器中使用,但需要注意瀏覽器的支援度,使用上 Script Tag 必須要符合使用的規範:

<script type="module" src="app.js"></script>

Node.js 預設支援的是 CommonJS,不必透過 WebPack、Parcel 等打包工具就可以使用模組化的開發方式,但限於後端的應用環境,例如寫 Terminal Tool 或者扮演 Web Server,如果模組化的成果是前端網站,仍是必須透過打包工具來轉換。

從 Node.js 14 以後支援 ESM,但無法在單一 JS Files 混用 ESM 與 CommonJS,但可以在不同的 JS Files 中使用不同的 Modules 技術,區別的方式是透過 File Eextension。

Modules Tech File Extension
CommonJS .cjs
ESM .mjs

CommonJS 使用範例

mod.js

const Loto = {
    name: 'Loto'
    hp: 15,
    str: 3,
    vit: 2,
}

module.exports = Loto;

app.js

const hero = require('./mod.js')
console.log(hero);
node app.js
rem { name: 'Loto', hp: 15, str: 3, vit: 2 }

ES 6 Modules (ESM)

Modern JS 新語言特性筆記 | Modules (ES6 Modules)

Node.js With ESM

方式一:從 packages.config 設定 type 讓預設由 CommonJS 改為 ESM。

{
  "type": "module",
}

mod.js

function square(num) {
    return num * num;
  }
  
  export { square };

app.js

import { square } from './mod.js';

console.log(square(3));
node app.js
rem 9

方式二:利用不同的 file extension mjs 讓 Node.js 自行判斷。

mod.mjs

function square(num) {
    return num * num;
  }
  
  export { square };

app.mjs

import { square } from './mod.mjs';

console.log(square(3));
node app.mjs
rem 9

參考資料

Node.js Modules

Node.js ESM

Node.js Packages

平時沒注意的 JavaScript - JS 生態系及週邊工具整理

前端模块化开发的价值

Webpack 與 Module 模組化 JS

webpack 新手教學之淺談模組化與 snowpack