識別子・拡張子、そして .mjs ファイルの正体
識別子(=identifier、あるものを他と区別して指し示す名前)は、人の名前や車のナンバープレートとまったく同じ発想である。プログラムの中では変数や関数に名前を付け、ファイルの世界では拡張子がファイルの種類を指し示す。.mjs はその一例であり、Node.js(=サーバー側などでJavaScriptを動かす実行環境)が「ESモジュールとして扱え」と判定するためのJavaScriptファイルである。
識別子とは何か
識別子とは、あるものを一意に指すためのラベルであり、後からそれを呼び出せるようにするための名前である。プログラムでは、変数(=データを入れておく名前付きの箱)や関数(=処理のかたまり)に名前を付ける。let price = 100 という記述であれば、price が識別子にあたる。コンピュータは「100」という値を漠然と覚えるのではなく、「price という名前の箱に100が入っている」という形で管理する。price と書けば、後から再びその値を取り出せる。
拡張子も識別子の一種
拡張子(=extension)とは、ファイル名の末尾に付く「.○○」の部分であり、そのファイルが何の種類かを指し示す。.jpg(画像)・.pdf(文書)・.js(JavaScript)がその例である。厳密には、プログラミング用語としての「識別子」は変数名・関数名を指し、拡張子は別のカテゴリに分類される。ただし「何かを他と区別して指す名前」という根っこの発想は両者に共通している。OS(=基本ソフト)や他のプログラムは、この拡張子を読み取って「どう開くか・どう実行するか」を判断する。
では .mjs とは何か
.js は JavaScript(=Webサイトやツールを動かすプログラミング言語)のファイルを表す。.mjs は、Node.js が必ず「ESモジュール」として扱うことを要求されるJavaScriptファイルである。モジュール(module)とは、プログラムを機能ごとに分けた再利用可能な部品を指す。大きなソフトウェアを部品A・B・C…に分割し、import / export(=部品を他のファイルとやり取りする命令)で組み合わせて使う。Node.js は通常、package.json の「type」欄でモジュールかスクリプトかを推測するが、.mjs という拡張子はその推測を上書きし、設定の内容にかかわらずESモジュールとしての扱いを強制する。このリポジトリでは gen-notes-manifest.mjs のようなファイルでノート一覧を自動生成しており、.mjs にすることで追加設定なしに import/export が使える。
まとめ
識別子とは「あるものを他と区別して指す名前」であり、この根っこの発想は変数名にも拡張子にも等しく貫かれている。.mjs は Node.js に対して「このJavaScriptをESモジュールとして扱え」と伝える拡張子である。