2025年4月7日月曜日

node.jsのmjs(esm)とcjsってなーに?

mjs(esm)とcjsの違い

処理速度が爆速なので重たい処理をスクリプトで作るならnode.jsだなって事をこの前記事にしたんですけど、自分のコードを変換して貰った時に「{"type": "commonjs"}」って内容の「package.json」を作ってねって言われたんですよ。

色々調べた結果node.jsは現在二つに分岐していて、esmとcjsの二つの記述方法があるという事が分かりました。

cjs

まずcjsは「CommonJS」の略で、要するに一般的なjavascriptの記述方法です。

mjs

そして、esmはECMAScriptModules(エクマスクリプトモジュール)の略で「Ecmaインターナショナル」といものがあり、それによって標準化されたJavaScriptの国際規格という事らしい。

このECMAは大元をたどると「欧州電子計算機工業会(英語: European Computer Manufacturers Association)」の略だったが今は関係ないただの単語としてだけ文字が残って「Ecma」みたいな記述で良いらしい。

要するにEcmaという国際規格にしたjavascriptって事です

2024年今現在のnodeの仕様

v12以前「.jsのデフォルトはCommonJSだった時代」
v14以降「.cjsやpackage.jsonでの明示が必要になった」
v22以降「.jsのデフォルトがESMになった」←今ここ

というわけで、一旦最初の疑問「json」って何?って所はおおよそ理解しました。
そしてnodeが規格を判定する時に最初に判定するのは拡張子らしいので仮にどっちがデフォルトであっても拡張子をcjsにするか、mjsとすれば確実のようです。
一括でファイルのタイプを管理するときは「json」ファイルを作ればOK!

javascriptって今どうなってるの?

cjsは古い記述方法と言ってしまえばそれまでですが、過去のjavascriptと現在のjavascriptを結ぶ規格。
一言で言えば、web記述ベースのnode特化コード。
esmはwebとnodeを共通化しようという未来規格です。nodeがこちらをデフォルトにしたのはその意識が強いという事でしょう。
今の所cjsの記述されたパッケージなども多いですが今後はesmが主流になるのかもしれないです。
つまり、esm「ブラウザネイティブ」かcjs「Node.js特化」かの違い

まとめ
ESM: ブラウザ+Node.jsの未来標準、非同期・静的解析が強み。
CJS: Node.jsの歴史的規格、同期的でサーバーサイドに強い。
ESMがモダン、CJSがレガシー。

今からjavascriptを勉強するならesmベースで勉強しつつ、cjsに対応できると良いという感じ。

0 件のコメント:

コメントを投稿