【AWS Lambda】index.mjs の mjs って何?【node.js】

こんにちは、エバンジェリスト3号機です。
最近実名で出る機会も増えてきたので、そろそろ3号機もいいかなーと思ってます。

さて、内容的にはひと昔前のお話ですが、今までの経験上、node.jsを本格的に触る機会もなかったので、個人の備忘的として書いてみました。ふと思った疑問を簡単に調べて書いているだけの内容ですので、深くは知らないけどそういうことか、くらいに知りたい方向けです。

AWS Lambda でnode.jsを用いて関数を新規作成する場合、バージョンを 18.x にすると、テンプレートで作成されるファイルが index.mjs になり、バージョン 16.x 以下のものを指定して作成すると、index.js となります。

なぜこういったことになったのでしょうか


CJSとESM

違いは端的に言うと「モジュールシステムの違い」です。
モジュールシステムって何ぞや?となるわけですが、わかりやすく理解していただくために砕けた書き方をすると「JavaScript の書き方の違い」というところでしょうか
※厳密には、CommonJS と ES2015 という標準仕様 の違いです。もっと詳しいことを知りたい方は、脚注のサイトをご確認下さい。*1*2*3

CJS(CommonJS)

拡張子は、cjs
cjsなんて拡張子は見たことない。通常 js になっているかと思います。これは、package.json にて、この後説明するESMの記載をしない限り、デフォルトでCommonJSとなります。

なので、何も気にせずに書くと、デフォルトでは自然と CommonJS で書いていることになります。

ESM

拡張子は、mjs
ES2015 という標準化された仕様で書く必要があります。
つまり、Lambdaで バージョン18.x を選択した場合には、デフォルトで mjs ファイルで作成されますので、必然的にESMでの記載が必要となるわけです。

普段からESMで書くのであれば、以下の対応が必要です。
1.拡張子を mjs にする
2.package.json に以下の設定を記載する。

{
  "type": "module",
  "main": "./main.js"
}

3.実行時に --input-type=module を追記する。


大きな仕様の違いとしては、require ではなく、import に置き換える。など、既存モジュールに影響が出そうな内容が多々ありますので、もう少し様子見でも良さそうです。また、node.js 18.x を選択しても、拡張子を js にして、commonJS で動かせますので、まあこういう流れもある。程度で今のところは問題ないのではないでしょうか。

node.js 16.x は、2023/09/11 でサポート終了となり、Lambdaでは mjs がデフォルトになっているということは、自然と ES2015 への流れの方に向かっている。ということが感じ取れると思っていますが、そう簡単に変わることもすぐには起きなさそう。という感じでいかがでしょうか?

ーー

一緒にGMOあおぞらネット銀行で働いてくれる仲間を募集しています。
社内勉強会はもちろん、GMOグループの勉強会にも参加できます。ご興味のあるエンジニアの方は、当社採用ページをぜひ一度ご覧ください。
gmo-aozora.com


カジュアル面談も随時受付中!
疑問・質問にも、可能な範囲でお答えします!
こちらからお気軽にお問合せください。
js02.jposting.net