02 April 2011

JavaScript がサーバ・クライアントで動くことは大きな問題ではない

Ian Bicking さんの "Javascript on the server AND the client is not a big deal" という記事を斜め読んだメモです. Node.js のメリットとしてクライアント・サーバサイドで同じ言語を使えるというものがよく挙げられますが, その理由にひとつひとつ反論しています.

Not Found

導入

Node.js が注目を集めています. その理由のひとつに, "JavaScript がサーバ・クライアントの両方で動く!" というものがありますが, 私はそれを重要なことだとは思いません.

ひとつの言語だけを覚えれば良い!

複数の言語を覚えることはハードですが, それ以上に複数のプラットフォームに対応することのほうがハードです. Node.js を導入すればクライアント・サーバサイドを同じ言語でかけますが, ブラウザ環境と同様の感覚でサーバサイドの開発ができるわけではありません.

ライブラリをクライアント・サーバサイドで共有できる!

まず, ある処理をクライアントサイドでやったとしたらそれをサーバサイドでやる必要はないので (もちろん逆も), このような場合は両プラットフォームでコードを共有する必要はありません.

また両方で共有したい便利なライブラリがあった場合, 多くのクライアントサイドライブラリはブラウザ API に依存しているので, サーバサイドへの移植は簡単ではありません.

ブラウザ API を JavaScript で実装するのは困難です. Proxy を使えばできるかもしれませんが, V8 はまだサポートしていません. (Node.js の C++ アドオンの実装はある)

ブラウザの API を実装できたとしても, まだまだ両プラットフォーム間の違いはあります. window オブジェクト, プロセス (Node.js は長時間起動), ブロッキングコール, システムコール (もちろんブラウザでは使えない) など.

これはチャレンジングな課題だし乗り越えることも可能ですが, そうする理由が多くありません.

クライアント・サーバ両者にわたって滑らかに開発できる!

クライアントサイドとサーバサイドを同じように扱うのは, 便利さよりも危険性の方が大きいです. 例えばセキュリティ, HTTP などはそれぞれのプラットフォームでは別の考え方が必要です.

クライアント・サーバで同じ方法のバリデーションができる!

クライアント・サーバサイドで同じバリデーションコードが使えるというのは巷でよく言われているメリットです. しかし, クライアントでのバリデーションは User Experience に主眼をおいたものです. 入力のミスを見つけ, ユーザーにフレンドリーなメッセージを出します. サーバサイドではそんなことは必要なく, ただ 400 Bad Request を返せば良いのです. 両者のロジックにそれほど共有部分はないでしょう.

サーバサイド JavaScript をクライアントのフォールバックとして使える!

フォールバックと JavaScript という言語で行うことの関連性は薄いです. フォールバックのことはアーキテクチャの決定とは別事項として考慮する必要があります.

※このパラグラフは自信なし. 原文:

Writing for clients without Javascript is becoming increasingly less relevant, and if we aren’t there yet, then we’ll certainly get there soon. It’s only a matter of time, the writing is on the wall. Depending on the project you might have to put in workarounds, but we should keep those concerns out of architecture decisions. Maintaining crazy hacks is not worth it. There’s so many terrible hacks that have turned into frameworks, and frameworks that have justified themselves because of the problems they solved that no longer matter… Node.js deserves better than to be one of those.

まとめ

この文章で私は Node.js が悪いといっているわけではありません. Node.js のこの特徴について同意していないだけで, ほかの多くの利点があります.