Frontrend Vol.4 に参加してきた
Frontrend Vol.4 powered by CyberAgent, Inc. : ATND
http://atnd.org/events/35720
今年初めて参加するセミナーということで、
サイバーエージェントさんが主催するフロントエンド系技術セミナーに行ってきました。
「JavaScript Development Tools – JavaScript開発の効率アップ」 平木 聡さん
「JavaScriptツール初心者から脱初心者へ」という目的で、
JavaScript開発の効率アップが図れるGUI•CUIツールを紹介になります。
JavaScript開発に役立つGUIツールの紹介
■Chrome Developer Tool
- サイバーエージェントさんの社内勉強会で発表した資料が参考になるとのことです。http://www.slideshare.net/yoshikawa_t/chrome-devtoolsnext
- ショートカットを覚えると便利
- ⌘+Option+I → DevTool起動
- ⌘+O → js/cssファイル選択
- ⌘+Shift+O → js関数選択
- ⌘+L → 指定行移動
- ⌘+Option+F → js全体の検索
- Chrome Developer Toolでは複数のデバッグ方法がある
- Break Point
- TimeLine
- Profile
- Chrome Url
- 隠し項目がいろいろ見れる
- chrome://net-internals/ など
■Charles
- http://www.charlesproxy.com/
- デバッグ用Proxyサーバーをローカルに立てれる
- MapLocal
- URL先のファイルとローカルファイルを掏り替えれる
- AutoResponderと同様の機能
- Throttle
- 回線速度のエミューレート
- 3G相当の通信の遅さでサイトを見るなどが出来る
■DocHub
- http://dochub.io/#css/
- CSS、JSのAPI検索
■jsFiddle
- http://jsfiddle.net/
- オンラインデバッグ
- モバイル用URLを開く事でモバイルデバッグが可能
■jsPerf
- http://jsperf.com/
- http://jsperf.com/am-js-loops のようにJSのパフォーマンステストが可能
■browserling
- https://browserling.com/
- 各ブラウザでのテストが可能
- おそらく社内のみの環境とかではテスト無理な気がします
JavaScript開発に役立つCUIツールの紹介
■JSHint
- http://www.jshint.com/
- Webアプリ、CUIで提供
- CUIはNode.jsで動作
- エディタ(vimなど)に組み込める
% brew install node % npm install -g jshint % jshint -v 0.9.1 % jshint wrong_pattern.js wrong_pattern.js: line 2, col 3, Expected 'WIN' to have an indentation at 5 instead at 3. 1 errors
■jq
- http://stedolan.github.com/jq/
- JSONプロセッサ
- JSONの結果をクエリで操作
- 色んなサービスのAPIからのレスポンスデータを解析するのに便利そうです
% brew install node % jq --version jq version 1.1 % cat twitter.json | jq '.' // 見やすく整形 % cat twitter.json | jq '.results[0]' // 1つ目のデータを整形 % cat twitter.json | jq '.results[0] | {from_user, text}' // 1つ目のデータの指定項目を整形
■Doctor JS
- http://doctorjs.org/
- JavaScript用タグファイル生成
% npm install -g jsctags % jsctags demo/doctorjs
■Yeoman
- http://yeoman.io/
- Webアプリケーション作成支援ライブラリ
- 既存ライブラリを組み合わせて開発されている
- Web App (default)
- AngularJS
- Backbone
- BBB (Backbone Boilerplate)
- Chrome Apps Basic Boilerplate
- Ember
- Jasmine
- Mocha
- Testacular
% npm install -g jsctags % curl -L get.yeoman.io | bash
最近のJavaScript開発には役立つツールがあるので、
そのツールを上手く使う事で効率化を図ることが大切。
そしてCUIツールは「黒い画面」だからといって
尻込みせず使うと幸せになれる、とのまとめでした。
「jQuery Performance Tips – jQueryにおける高速化 -」 水野 隼登さん
パフォーマンスチューニングには必ずトレードオフが発生する(可読性が低下する等)、
JavaScriptよりjQueryを使っている方が多い、
その前提を基にjQuery Likeを保ったままのパフォーマンスチューニングに関するお話です。
ファイルサイズを減らす
- モバイルデバイスにおいて、1kbにつき1msのパース時間が発生
- jQueryのバージョンによってファイルサイズが異なる
- 1.9 → 33kb
- 2.0 → 30kb
- IE6-8対応用スニペットによるjQueryファイルの出し分け
- ブラウザに適したファイルサイズの小さいjQueryファイルが呼び出せる
<!--[if lt IE 9]> <script src="jquery-1.9.0.js"></script> <![endif]--> <!--[if gte IE 9]><!--> <script src="jquery-2.0.0.js"></script> <!--[endif]-->
- GRUNTを用いて不必要なモジュールを省いたjQueryファイルを取得
- https://github.com/jquery/jquery#how-to-build-your-own-jquery
- ajax、css、effects、offsetなどを省くことでファイルサイズを削減
% grunt custom:-ajax,-css,-deprecated,-dimensions,-effects,-offset
セレクタのチューニング
- 速いセレクタランキング
- JavaScriptのネイティヴのメソッドを使ってるか、全検索するか、jQuery独自セレクタを使うかどうかでパフォーマンスが違ってくる
1. $('#id') 2. $('tag') 3. $('.class') 4. $(':first-child') 5. $(':first')
- 例
$('#target p') → querySelectorAll が使われる ↓ $('#target').find('p') → getElementById+.find()+getElementsByTagName
- キャッシュも活用する
var $target = $('#target'), $p = $target.find('p');
リフローの影響を考える
- CSS Reflow - jQuery.com http://www.youtube.com/watch?v=ILvF25ljaoM
- 描画のフローは段階的に行われている
- リフローが発生する可能性のあるトリガー
- 不要なリフローを避ける
- CSS()は1回にまとめる
- リフローが必要な取得系メソッドはキャッシュして使い回す
- body閉じタグ直前ではなhead閉じタグ直前に記述
- ボトルネックを解消する
- 描画コストの高いCSSプロパティ
- アニメーション
- ループ処理
最後の戒めの言葉がとても印象的でした。
「小さな効率は忘れよう。 時間の97%について語ろう。 早まった最適化は諸悪の根源だ。 」TONY HOARE(?)
「Testable Javascript – テストしやすいJavaScriptとテストについて -」 斉藤 祐也さん
テストしやすいJavaScriptとは
- テストしづらいJavaScriptを考える
- コードの役割分担が複雑(イベント処理、フォームのインプットデータ取得、DOM操作、HTML生成etc)
- コードの役割が密接な関係
- →テストを行う事が難しくなる
- テスト駆動リファクタリング
- テスト駆動開発はデザインプロセス
- テストしやすいJavaScriptへのリファクタリング
ユニットテストツールとテスト
- Jasmine
- QUnitt
- http://qunitjs.com/
- DOM要素周りのテストに優れている
- Mocha
- http://visionmedia.github.com/mocha/
- カスタマイズに優れている
- Phantom.js
- テストの自動化
ユニットテストツールは色々ありますが、
どのツールにも得意不得意はあるのでとりあえず書いてみる事が重要であること、
テスト自動化という環境を整えれば言い訳しづらくなる等、
JavaScriptのテストはまだ日が浅いとは充実しつつありますね。
僕の感覚的には、リファクタリングしても動作が保証出来るテストを書く事が重要、という印象を受けました。
「jQuery to Backbone – アーキテクチャを意識したJavaScript入門」 佐藤 歩さん
Backboneについて
- http://backbonejs.org/
- 構造化の手段を提供するライブラリ → MVC
- 軽量さといじりやすい柔軟さが売り
jQueryの特徴と役割
- DOM APIを簡潔に書ける
- JavaScriptは書けないけどjQueryは書けるという人多そうですしね
- クロスブラウザの諸問題を解決してくれる
- プラグインの充実とエコシステム形成
- 逆にjQueryでも解決してくれない問題もある
- コードの肥大化
- スパゲッティーコード
- テスト
- メンテナンスのしづらさ
- →フロントエンド実装の比重が高まってきたため
JavaScriptにおけるMV*の現状
- Todo MVC http://addyosmani.github.com/todomvc/
- knockout.js http://knockoutjs.com/
- batman.js http://batmanjs.org/
- Ember.js http://emberjs.com/
- AngularJS http://angularjs.org/
- aura https://github.com/aurajs/aura#readme
- Flight http://twitter.github.com/flight/
- https://gist.github.com/tily/1362110 ここで議論されたり高い関心を寄せやすい
アーキテクチャとデザインパターン
- Facade 複数の処理をまとめる
- Singletion ただひとつのオブジェクト
- Flyweight インスタンス生成
- Observer イベントを監視
- Mediator イベントを仲介
- 急に取りかかるのは難しい → Backboneで実践してみる
Backboneにおけるコンポーネント
- View
- 見た目とUIにおける入出力
- DOM要素の管理
- イベント制御
- Model
- 取り扱うデータの最小単位
- ストレージとの通信、同期
- APIやレコードの情報を表現
- Collection
- Modelが集合したリスト
- リスト操作(filter,where..)
- Router
- URLによるルーティング
実践踏まえBackboneを紹介してもらいましたが、かなり分かりやすい印象、
かつ既存のjQueryコードをbackboneへ移行というのもそこまでコストかからず出来そうでした。