読者です 読者をやめる 読者になる 読者になる

yo_waka's blog

418 I'm a teapot

デブサミ2012で大規模JS開発について発表してきました

「Developers Summit 2012 - 10年後も世界で通じるエンジニアであるために」で発表してきました。


イマドキのJSの話とかではなくて、UIをJSで作る際の設計ノウハウみたいな話にしたので、つまらなかったら申し訳ないなと思ってたのだけど、終わったあとも何人か質問しにきてくれた方がいたのでホッとしました。
10年後も・・というテーマとして、激しく進化するJSの最新動向に左右されず使えるネタを選んだつもりではあります。
普段からJSでもパフォーマンス意識して設計してる方には当たり前のことばかりだったかも。


jQueryは甘えってのは書いてみたかっただけですすいません。。
けど、適材適所というかSinatraで100画面近くあるようなWebアプリは作らないでしょそういうときはRails採用するでしょというかそういう感じのことが言いたかったんだ!
実は初期の頃はjQueryも検討してたんですけど、要素が多くなってくるとコントロールが増えてイベント数が増えると画面が重くなることが分かって、上手くやれば回避もできるんですが属人性の高いコードになりそうだし将来チューニングに追われるのが目に見えていたのであきらめた経緯があったりして。jQueryは家でサクッと書きたいとき便利に使ってます。
全然関係ないけど、気軽にDOM操作が出来るところがjQueryのストロングポイントだと思っているのですが、最近のバージョンアップはどういうユーザーをターゲットにしてるのかよく分からないなー


書き忘れたことがあって、クラス同士で通信するやり方で紹介したものは書いてある通り単純なMapで実装されているので、dispatchEventを受け取ったハンドラは同期処理されます。
その辺が通常のDOMイベントと違うので注意が必要ですね。でもボタン押した後の処理は分割されても同期で処理してほしいケースがほとんだし問題ないか。


Deferredに関してはClosure LibraryはMochikitのDeferredクラスをポーティングしてきているので、普段はそれを使ってます。
でもスライドで解決法として上げた、非同期ループ(JSDeferredでいうところのloop)は機能として実装されてないので、goog.async.Deferredクラスを継承したクラスに自前でcybozu.async.forEachみたいに書いて使っています。


Closure CompilerのAdvanced Optimizations(最大レベル)による圧縮は、サクッと書いてしまいましたが既存のJSプロジェクトをAdvanced Optimizationsで圧縮するのはかなり大変です(JSDocコメントの整備、extern書いたり、コンパイルできない記法を書き換えたり)。
ウチでもみんなでひたすら置換するシェルスクリプト書いて後は人海戦術みたいな力技で対応した思い出が。
規模が小さければ対応は簡単ですが、大きくなってくると時間がかかります。なるべくプロジェクトの初期に使う前提でいくかどうかを検討して調査しておくのがいいと思います(体験談)。


後半の@hikomaによるRDBMSで非構造型DBをどう作るかという話もぜひ公開したかったのですが、ちょっと事情があって泣く泣く削除。。。
ウチのトップエンジニアの発表だし、こちらも時代に左右されない技術だったので公開したかったなー><
でも、見たい!という人がTwitterなりでつぶやいたりしてくれれば公開できるかもしれません。

※ @hikomaがブログで後半の話をフォローしてくれたみたいです
デブサミ2012でkintoneの裏側を紹介したけど・・


それにしても疲れた><
帰宅後、週末にスライド数十枚作るのって大変なんだなーということが分かっただけでも勉強になりました。