nodeのデフォルトはCJSらしい

公開日: 

Node のバージョン

node: v18.16.0

ESM 形式のモジュールを使ってみる

├ module
│ └ hoge.js
└index.js
hoge.js
// ESM形式で書くよ
export const hoge = () => {
  console.log('hoge!!!!!!!!!!!!!');
};
index.js
import { hoge } from './module/hoge.js';

hoge();

console.log('index.jsが実行されました');
// 実行
$ node index.js

// 出力結果
(node:26988) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/Users/y_tezuka/Desktop/Training/NodePractice/index.js:1
import { hoge } from "./module/hoge.js";
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at internalCompileFunction (node:internal/vm:73:18)
    at wrapSafe (node:internal/modules/cjs/loader:1176:20)
    at Module._compile (node:internal/modules/cjs/loader:1218:27)
    at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
    at Module.load (node:internal/modules/cjs/loader:1117:32)
    at Module._load (node:internal/modules/cjs/loader:958:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:23:47

Node.js v18.16.0
  • package.json"type": "module"を設定しろ
  • ファイルの拡張子を.mjsにしろ

と怒られる

https://nodejs.org/api/packages.html#type

package.json"type": "module"を設定すると、.jsファイルが.mjs(esm モジュールのファイル)として認識されるらしい。

要するに、node で esm を使うときは

  • package.json"type": "module"を設定して、.jsファイルを.mjsとして認識させる

もしくは

  • ファイル拡張子を.mjsにする

必要があるようだ。

  • package.jsonを作り、"type": "module"を設定 ⇒ 正常に出力される
  • hoge.jsindex.jsのファイルの拡張子を.mjsにする ⇒ 正常に出力される

以上のどちらかをやると以下のように正常に出力された

// 出力結果
hoge!!!!!!!!!!!!!
index.jsが実行されました

CJS 形式のモジュールを使ってみる

├ module
│ └ fuga.js
└index.js
fuga.js
// CJS形式で書くよ
const fuga = () => {
  console.log('fuga!!!!!!!!!!!!');
};

module.exports = {
  fuga,
};
index.js
const { fuga } = require('./module/fuga.js');

fuga();

console.log('index.jsが実行されました');
// 実行
$ node index.js

// 出力結果
fuga!!!!!!!!!!!!
index.jsが実行されました

普通に実行された

まとめ

今まで俺こんなこと気にしながら開発したことないぞ?と思って色々調べると、TypeScript がコンパイルするときにモジュールの形式を変換してくれる機能があったり、色々と事情がありそうです。この辺りはまた後で詳しく調べます。一旦この記事のまとめとしては、Node.js がデフォルトでサポートしているモジュールシステムは CJS 形式のものであるということ。

では

Bye