IT-Q

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
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。