モジュールちょっと昔話
プログラムを書き始めてから色々な言語に触れてきた
たいていの言語はそれぞれモジュールのシステムを持っていた
プログラミング初学者に対して、モジュールはいつも「おまじない」として説明される
複雑な機能を持ったライブラリを使うために先頭に一行書いておく「おまじない」
各言語のモジュールシステムはできるだけ簡単に外部モジュールを使えるように設計されてはいる
しかし、その中でも僕はNode.js(CommonJS)のrequireが一番気に入っている
その理由を説明しようと思う
hr.icon
Ruby, Python, Java, Kotlin, Groovy, Objectve-C, Swift, C++, C, C#, Haxe
僕がまともに書いたことのあるJS以外の言語のモジュールシステムは、普通だった
普通というのは、モジュールが言語の仕様として組み込まれていることだ
これらの言語では、requireとかimportとかusingとかincludeが予約語になっていて、たいていプログラムの行頭でモジュールを読み込む
まぁそれが普通である気はする
しかしNode.jsにはそれがなかった
Node.jsのモジュールシステムは、はじめrequire(), module.exportsというJSの機能で実装された
これはNode.jsがV8のランタイム上で設計されたため、最初から言語自体を拡張することを諦めていたからだ
それまで、ECMA Scriptにはモジュールという概念が存在しなかった
グローバルスコープを共有してそこにライブラリごとに一つ変数を宣言して使っていた
もちろん、高度に設計されたソフトウェアではそんな仕組みでは立ち行かず、Node.jsは自前でモジュールシステムを導入したわけなのだが
Node.jsのモジュールシステムはJSで実装されている
requireというグローバル関数を大事に使いながらモジュールシステムを実現している
requireは、モジュールシステムのない言語に作られた妥協の産物であった可能性はある
しかしNode.jsのrequireはそのおかげで他の言語にない面白い特徴を手に入れることができた
hr.icon
requireは単なる関数である
引数に文字列を受けて、JSのオブジェクトを返す