なぜ MJS を CJS に変換するのですか?
CommonJS を想定している古い Node.js 環境やツールでコードを実行するため、または ESM 版と並行して require 互換のビルドを提供するために .CJS に変換します。ロジックは同じままで、モジュールの接続部分のみが変更されます。
MJS から CJS への変換方法
esbuild EASIEST
esbuild input.mjs --format=cjs --platform=node --outfile=output.cjs を実行して CommonJS を出力します。依存関係もインライン化したい場合は --bundle を追加します。
Babel OPEN-SOURCE
設定に @babel/plugin-transform-modules-commonjs を追加し、babel input.mjs -o output.cjs を実行してインポートを require に書き換えます。
Rollup FREE
rollup.config.js で output.format を cjs に設定してビルドします。Rollup は ESM エントリから CommonJS バンドルを出力します。
これらの形式について
品質と注意点
- トップレベルの
awaitには CommonJS 相当の機能がないため、変換に失敗します。 - 名前付きエクスポートは
module.exportsのプロパティになり、デフォルトエクスポートとの相互運用性は微妙に異なる場合があります。 - 相対的な
importパスやimport.meta.urlは、CommonJS 出力に合わせて調整が必要になる場合があります。
よくある質問
手動で変換できますか?
小さなファイルなら可能です。
import x from 'y' を const x = require('y') に、export を module.exports に置き換えます。ビルドが失敗したのはなぜですか?
最も多い原因はトップレベルの
await です。これは CommonJS では表現できないため、非同期関数の中に移動させてください。拡張子を .cjs に変更する必要がありますか?
はい、
package.json に "type": "module" が設定されている場合は必要です。.cjs 拡張子は Node に対して強制的に CommonJS として扱うよう指示します。どのツールが一番速いですか?
単一のコマンドであれば esbuild が最速です。Babel と Rollup は出力に対してより細かい制御が可能です。