タオルケット体操

サツバツいんたーねっとでゲームとかガジェットのレビューとかをします

AngularJSへの雑感を書く

ここ二、三週間ほど、Angularを使ってUI作ってるので雑感を。

まず、僕がJsNoobで、他のクライアントサイドMV*を使った事はほとんどない(ember.jsはチュートリアルだけやってみて心が折れてやめた)ことを付け加えておく。

Angularの第一印象は、独自タグとか、属性にロジック書くような雰囲気が生理的にうけつけなくて、つまるところ「なんだこれキモッ」って感じだった。
けども、BackboneにしろKnockoutにしろjQueryに依存してたりして、jQueryをあんま好きじゃない僕としては食指が動かない見た目だった。というか、多分この二つはjQueryのラッパーとして覚えられる感じがウリなのかな? でも、そもそもJsほとんど知らない僕からすると、イマドキわざわざjQueryおぼえんのもなーっていうメンドクサイ気持ちが先立つそんな感じ。

そんなこんなで、最近かなり流行りつつある流れに流されてAngularjsでajaxなUI構築デビューしてしまった。
ちなみに慣れてみると、あの独自タグや属性は後述されるDirectiveっていう機能で実装されていて、他のテンプレートでみるような独自構文よりもマークアップを壊さない宣言的な感じがグッドだとかそういう脳みそになってくるはず。多分。

触ってみて

かなりイイ!
当初心配していたほど、学習コストも高くなかった(これは各々が作りたいアプリケーションの複雑度にもよるとおもう)。 今はドキュメントや有志の記事(ありがたい)も充実しているので、一週間もあればモデルを使いつつDirectiveでアレコレなところまではいけるのではなかろうか。

また、MVVM式なデータバインディングを初めて利用したわけだけども、これが本当に便利。
最初はうまく雰囲気をつかめなくて、コントローラーにDOM操作のロジックを書いてしまったりしたわけです(ありがち)。しかしながら、双方向バインディングとかいうなんかに身を委ねた瞬間にコントローラーが大減量。ありがとうデータバインディング。コントローラーはモデルの状態をアレコレすれば良いわけで、モデルの変化はAngularが勝手に感知してビューに伝えてくれる。最高。こういうの欲しかった。

また、その上でDOMに干渉するようなロジックを書きたくなることはあるんだけども、これをコントローラーに書いてしまうと可読性や汎用性が落ちそうな黒い予感でいっぱいになってしまう。 でもちゃんと専用の機能が用意されてる。スゴイ。
AngularではDOM操作はDirectiveというものを作っていい感じにアレするのがマナーらしい。こいつはちょっと複雑なので、僕もまだ5%くらいの力しか引き出せていないけどかなり便利。いわゆる、Angularを使っていると出てくる独自タグや独自属性がこのDirectiveで、よく使いそうなものは標準で提供されてる。

Directiveは多分とても良いものです。jQueryはちょっとしか触ってないけども、使ってて「これ結局やってること同じじゃねえか」みたいな感想を抱いてしまうと思う。JavaScriptのクソさとか、ベンダー格差にクソさとかに起因するクソっぷりを吸収していてはくれても、結局それだけというか。だからウィジェットみたいな感じでプラグイン作っても、再利用性や可読性はイマイチな感じになっちゃうし、低レイヤーなロジックの記述がどんどん膨れ上がっちゃう(それをナントカするためにMVCがいくつも生まれたんでしょうけども) 。 そういうアレやソレを解決しつつ、簡単なことは簡単に出来るようになってはいるのが良い。scopeの宣言のところでクッソはまったりとかは、まぁ必要経費ということで。

あとフィルターという機能があって、これはまだ時間がないのと必要な感じが出てきていないのでリファレンスに目を通してすらいません。今週あたり余裕があったらちょっとやってみようかなー。

まとめ

クライアントサイドMVCって、なんだかんだめんどくせーし、ワンページWEBアプリにこだわる場合にだけ使うようなもんなのかなーって思ってましたけども、こんくらい簡単ならもう全然サーバーサイドのテンプレートいらねえよ! って思いました。なので、最初Jinja2と同居させてたんですけども、途中でJinja依存の部分を全部捨ててAngularのみで作りました。

ただ、戻るボタンの対応とかでオールドブラウザのクソの山を柔らかくする戦いとかが入ってだるいと思うので、そういうのを要求される場合には工数が無意味に増えそうなんで、よっぽどの理由がない限りはやめたほうがいいんじゃないんですかね?

とりあえず、そういう感じです。
あ、ちなみに本当はTypeScriptで書こうと思ったんですが、ここで変にハマったりしても時間もったいないんでCoffeeScriptで書いてます。比較的小規模で、自分一人で書く分にはCoffeeで全く問題ないですね。きつくなったら書き直せば良いですし。