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.js
とindex.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