CommonJS と ES モジュールは、取り込み方の何が違いますか。
CommonJS は require と module.exports、ES モジュールは import と export を使います。CommonJS はモジュールそのものを関数にできますが、import * as の結果は呼び出せません。
面接官が見ているのは補強。require と import の違いを知っているか。
これは「import * as express from "express" と書かれていて、express() を呼ぶところで型エラーや実行時エラーになりました。なぜですか。」への追撃質問です。
よくある答えと、面談でどう見られるか
- CommonJS は require と module.exports、ES モジュールは import と export を使う。モジュール全体の形の考え方が違う
その通りです。この違いを埋めるのが esModuleInterop のような相互運用の仕組みです。 - 書き方が違うだけで、中身はまったく同じ
違います。たとえば ES モジュールの import * as は呼び出せないオブジェクトですが、CommonJS は関数そのものを返せます。 - CommonJS はブラウザ用、ES モジュールはサーバー用
逆に近いです。CommonJS は Node.js で広まった形式で、ES モジュールはブラウザと Node.js の両方の標準です。 - TypeScript では ES モジュールしか使えない
どちらの形式のライブラリも使えます。
模範解答
CommonJS は Node.js で広まった形式で、require で取り込み、module.exports で公開します。ES モジュールは JavaScript の標準の形式で、import と export を使います。
大きな違いの1つは、モジュール全体の扱いです。CommonJS は module.exports に関数を1つ入れて、モジュールそのものを関数にできます。ES モジュールの import * as x で得られるのは、名前付きの公開をまとめたオブジェクトで、呼び出せません。
この差を埋めるために、TypeScript には esModuleInterop などの相互運用の設定があります。
出典(一次資料)
対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。