Node.jsとCommonJSについて

日経ソフトウェア8月号にJavaScriptの特集がありまして、そこでNode.jsが紹介されていました。
それを読んで、僕は以下のようなツイートしました。

*1だと言わざるをえません。Node.jsはCommonJSの仕様のうち「Module 1.0」と「Unit Testing 1.0」には一応準拠していることになっています(http://wiki.commonjs.org/wiki/CommonJS#Implementations)。が、Node.jsのその他のAPI(たとえばfsモジュールのwrite()など)はCommonJSに従った形で実装されているわけではありません。

さらに準拠していることになっている「Module 1.0」にしても、CommonJSで規定されているモジュールの作り方は

exports.hoge = function() {...};

なのですが、Node.jsではそれに加えて以下の2通りでもモジュールを作ることができます。

module.exports.hoge = function() {...};
this.hoge = function() {...};

よって、Node.jsにはCommonJSにない独自仕様が存在していると言えます。
また「Unit Testing 1.0」にしても、CommonJSで規定されているAssertとTestのモジュールのうち、Node.jsにあるのはAssertモジュールだけなので、実際には準拠しているとは言いがたい状態です。

結局、Node.jsがCommonJSの一部仕様に準拠していると主張しているのは(上のWikiがそうであるように)CommonJS側であって、Node.js側ではそのような主張は(昔はしていたこともありましたが)積極的にはしていません。公式サイトAPIドキュメントにもそのような記述はないはずです(GithubのWikiには一部残ってるかもしれませんが)。

さらに先日Node.jsの作者のRyan DahlがRedditに降臨して「Node.jsの作者だけど何か質問ある?」スレを立てたときに、「CommonJSはもうオワコンだから、今後NodeのAPI変えるときにはCommonJSのことなんて一切気にしないよ」宣言がありました。

以上のように、Node.jsとしてはすでにCommonJSのことは眼中にないといった感じです。なので、今後Node.jsをCommonJSと絡めて論ずるときには十分注意を払った上で行った方がよろしいと思います。

*1:「嘘」っていうのはちょっときつい表現だったかもしれませんね。すみません。140字ギリギリだったので(言い訳)。