Node.jsで拡張子「.js」のままimportやexportしたい
Node.js を触り始めて、真っ先に遭遇したエラー。
$ node server.js
(node:57017) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
下調べした時は、Node.js の ver.12 から ESM はデフォルトでサポートされていると書いていたのに、1行目の import が早々にエラーを吐いて止まったので「あれれ~?おっかしいぞォ~?」状態でした。
$ node -v
v19.2.0
現時点では最新版の Node.js を使っているし、変だなと思い調べてみた。
拡張子を「.mjs」にする
エラー文に書いてある通りだが、どうやら JS ファイルの拡張子を「.mjs」にする必要があるようなので、server.js を server.mjs にリネームしてみた。
$ node server.mjs
listen:3000
無事起動を確認、中で import されている拡張子が「.js」のファイルも、この時点ではエラーを吐いていない模様。
なるほど、ネイティブ対応ってこう言う事なのね。
拡張子を「.js」のまま使いたい
だがしかし、ちょっと面倒な事が起きた。
拡張子が「.mjs」のファイルをエディタで開くと、プレーンテキストとして開かれてしまう。(※エディタ側がこの拡張子をデフォルトでサポートしていない。)
少なくとも、管理人が長年愛用している Dreamweaver と Notepad++、最近使い始めた iOS の Textastic では Javascript として認識されなかったため「この拡張子(.mjs)は JS ですよ!」と言う設定をしてやる必要が。
めんどくs(ry
正直面倒だと感じたので、package.json に type="module" を追加する方法を試してみた。
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "server.js",
"type": "module",
"author": "THE-URI Studio",
"license": "MIT"
}
Line: 6 のとこ、これで拡張子が「.js」でもモジュールとして認識するようになるので、import とかが使えるようになるらしい。
$ node server.js
listen:3000
無事動作した。
これにより、以下のような仕様に変化するらしい。
- 常に strict mode になる(常にそうあって欲しいので問題無し)
- require が使用不能になる(import 使うので問題無し)
- exports が使用不能になる(export 使うので問題無し)
- __filename が使用不能になる(代替え処理があるので問題無し)
この方法がマズイかどうかは理解出来ていないが、少なくともフロントエンドで根付いてしまった手癖が全て許されるのは大きいと思っているので、当サイトでは当面これを基本設定として行く事にする。