package.jsonのtype: moduleとは何だろう?

意味不明のオプションを理解しよう


発端

Node.jsプロジェクトで'import'文を使用しようとすると、SyntaxError: Cannot use import statement outside a moduleエラーが発生する。モジュール外部ではimport statementを使用できないという意味だが、モジュールとは何で、なぜimportが使えないのだろうか?

CommonJSとECMA Script Modules

CJSとESMは両方ともモジュールシステムである。最初のJavaScriptにはモジュールシステムがなかったが、JSをバックエンドでも使用し始めてからCommonJSというモジュールシステムを作成し、デファクトスタンダードとして使用した。

CommonJSは公式的な標準ではなかったため、ECMA Script Modulesというモジュールシステムが標準として新しく制定され、モジュールを活用するためのCommonJSとは異なる文法と内部構造を持っている。

  • 余談として、ESMモジュールシステムと'ES6、ES7、ES8'などのECMAScript仕様バージョンは異なるものである。

結論

package.jsonのtypeとは、現在のパッケージがどのモジュールシステムを使用するかを指定するものである。

{
  "name": "node_jwt",
  "version": "1.0.0",
  "type": "module",
  ...
}

type: moduleを指定する場合、モジュールシステムとして'ESM'を使用するということであり、したがってESMに適合するモジュール文法を使用する必要がある。 type: commonjsまたは何も指定しない場合、CommonJSの文法であるrequire()文を使用する。

私が使用したいと思ったimport from文はESMの文法であるため、プロジェクトにtype: moduleを追加した。