SlideShare a Scribd company logo
Submit Search
Upload
実践Backbone.Marionette 現場の悩みと解決まで
Report
Share
Ryuma Tsukano
Web Developer at NTT Resonant
Follow
•
81 likes
•
19,610 views
1
of
90
実践Backbone.Marionette 現場の悩みと解決まで
•
81 likes
•
19,610 views
Report
Share
Download Now
Download to read offline
Technology
2014/1/22 gooラボopen tech talkで話したBackbone.jsとMarionette.jsの話です。
Read more
Ryuma Tsukano
Web Developer at NTT Resonant
Follow
Recommended
introduction to Marionette.js (jscafe14) by
introduction to Marionette.js (jscafe14)
Ryuma Tsukano
28.4K views
•
52 slides
はじめよう Backbone.js by
はじめよう Backbone.js
Hiroki Toyokawa
41.9K views
•
72 slides
Angular js or_backbonejs by
Angular js or_backbonejs
Omasa Yusaku
11.8K views
•
32 slides
Backbonejs @BuildInsiderOffline #1 by
Backbonejs @BuildInsiderOffline #1
daisuke shimizu
18.3K views
•
24 slides
忙しい人のためのBackbone.jsとAngular.js入門 by
忙しい人のためのBackbone.jsとAngular.js入門
Toshiaki Maki
8.1K views
•
40 slides
Backbone.js入門 by
Backbone.js入門
AdvancedTechNight
13.6K views
•
26 slides
More Related Content
What's hot
モテる JavaScript by
モテる JavaScript
Osamu Monoe
50.8K views
•
41 slides
Capybaraで雑にWebスクレイピング by
Capybaraで雑にWebスクレイピング
Koji Nakamura
1.5K views
•
16 slides
JavaScriptことはじめ by
JavaScriptことはじめ
Yuki Ishikawa
16.9K views
•
61 slides
メディア芸術基礎 II jQuery入門 by
メディア芸術基礎 II jQuery入門
Atsushi Tadokoro
4.5K views
•
66 slides
TypeScriptへの入口 by
TypeScriptへの入口
Sunao Tomita
22.2K views
•
36 slides
Rubyで作るクローラー Ruby crawler by
Rubyで作るクローラー Ruby crawler
Takuro Sasaki
38.1K views
•
37 slides
What's hot
(20)
モテる JavaScript by Osamu Monoe
モテる JavaScript
Osamu Monoe
•
50.8K views
Capybaraで雑にWebスクレイピング by Koji Nakamura
Capybaraで雑にWebスクレイピング
Koji Nakamura
•
1.5K views
JavaScriptことはじめ by Yuki Ishikawa
JavaScriptことはじめ
Yuki Ishikawa
•
16.9K views
メディア芸術基礎 II jQuery入門 by Atsushi Tadokoro
メディア芸術基礎 II jQuery入門
Atsushi Tadokoro
•
4.5K views
TypeScriptへの入口 by Sunao Tomita
TypeScriptへの入口
Sunao Tomita
•
22.2K views
Rubyで作るクローラー Ruby crawler by Takuro Sasaki
Rubyで作るクローラー Ruby crawler
Takuro Sasaki
•
38.1K views
クライアントサイドjavascript簡単紹介 by しくみ製作所
クライアントサイドjavascript簡単紹介
しくみ製作所
•
2.8K views
Anemoneによるクローラー入門 by Tasuku Nakano
Anemoneによるクローラー入門
Tasuku Nakano
•
24.4K views
覚醒!JavaScript by Haraguchi Go
覚醒!JavaScript
Haraguchi Go
•
27.7K views
Rubyによるクローラー開発 by しくみ製作所
Rubyによるクローラー開発
しくみ製作所
•
2.3K views
Scc2014 :jQueryの仕組みを完璧に理解する by Jun Futakawa
Scc2014 :jQueryの仕組みを完璧に理解する
Jun Futakawa
•
8.8K views
Web制作勉強会 #2 by Moto Yan
Web制作勉強会 #2
Moto Yan
•
614 views
2時間で学ぶjQuery by Shumpei Shiraishi
2時間で学ぶjQuery
Shumpei Shiraishi
•
7.5K views
20140523 jQuery基礎 (HTML5ビギナーズ) by Daisuke Yamazaki
20140523 jQuery基礎 (HTML5ビギナーズ)
Daisuke Yamazaki
•
3K views
⑯jQueryをおぼえよう!その2 by Nishida Kansuke
⑯jQueryをおぼえよう!その2
Nishida Kansuke
•
21.5K views
Start React with Browserify by Muyuu Fujita
Start React with Browserify
Muyuu Fujita
•
3.3K views
Webデザインの幅を広げる、jQuery【コードを記述する】 先生:保坂 庸介 by schoowebcampus
Webデザインの幅を広げる、jQuery【コードを記述する】 先生:保坂 庸介
schoowebcampus
•
4.8K views
jQueryで気をつけてほしいこと by 良太 増子
jQueryで気をつけてほしいこと
良太 増子
•
4.7K views
Vue.js 2.0 で自社プロダクトを SPA + SSR 化した話 by Yutaro Miyazaki
Vue.js 2.0 で自社プロダクトを SPA + SSR 化した話
Yutaro Miyazaki
•
21.3K views
大規模Node.jsを支える ロードバランスとオートスケールの独自実装 by kidach1
大規模Node.jsを支える ロードバランスとオートスケールの独自実装
kidach1
•
25.3K views
Viewers also liked
最強オブジェクト指向言語 JavaScript 再入門! by
最強オブジェクト指向言語 JavaScript 再入門!
Yuji Nojima
374.3K views
•
194 slides
最近のTDDネタをカジュアルに by
最近のTDDネタをカジュアルに
Ryuma Tsukano
2.2K views
•
21 slides
Java電卓勉強会資料 by
Java電卓勉強会資料
Toshio Ehara
1.7K views
•
22 slides
Java初心者勉強会(2015/08/07)資料 by
Java初心者勉強会(2015/08/07)資料
Toshio Ehara
2.1K views
•
35 slides
関数型プログラミング in javascript by
関数型プログラミング in javascript
Ryuma Tsukano
18.5K views
•
52 slides
Marionettejs getting started by
Marionettejs getting started
Kyohei Morimoto
1.2K views
•
27 slides
Viewers also liked
(20)
最強オブジェクト指向言語 JavaScript 再入門! by Yuji Nojima
最強オブジェクト指向言語 JavaScript 再入門!
Yuji Nojima
•
374.3K views
最近のTDDネタをカジュアルに by Ryuma Tsukano
最近のTDDネタをカジュアルに
Ryuma Tsukano
•
2.2K views
Java電卓勉強会資料 by Toshio Ehara
Java電卓勉強会資料
Toshio Ehara
•
1.7K views
Java初心者勉強会(2015/08/07)資料 by Toshio Ehara
Java初心者勉強会(2015/08/07)資料
Toshio Ehara
•
2.1K views
関数型プログラミング in javascript by Ryuma Tsukano
関数型プログラミング in javascript
Ryuma Tsukano
•
18.5K views
Marionettejs getting started by Kyohei Morimoto
Marionettejs getting started
Kyohei Morimoto
•
1.2K views
iPhoneアプリを Javaで書くよ? by Toshio Ehara
iPhoneアプリを Javaで書くよ?
Toshio Ehara
•
2.9K views
いまさら聞けない!?Backbone.js 超入門 by Kohei Kadowaki
いまさら聞けない!?Backbone.js 超入門
Kohei Kadowaki
•
21.2K views
BACKBONE.JSによるWebアプリケーション開発について by Toshio Ehara
BACKBONE.JSによるWebアプリケーション開発について
Toshio Ehara
•
41.3K views
20130626 kawasaki.rb NKT77 by nkt77
20130626 kawasaki.rb NKT77
nkt77
•
1.8K views
Parse.comと始めるBackbone.js入門(jscafe7) by Ryuma Tsukano
Parse.comと始めるBackbone.js入門(jscafe7)
Ryuma Tsukano
•
4.8K views
意識低くMeteor紹介 by hashedrock
意識低くMeteor紹介
hashedrock
•
5.2K views
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 1 章 by Narimichi Takamura
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 1 章
Narimichi Takamura
•
3.9K views
Client-side MVC with Backbone.js by iloveigloo
Client-side MVC with Backbone.js
iloveigloo
•
28.2K views
海外で注目されてるJs framework “mithril”の特徴 by Shoyo Kyou
海外で注目されてるJs framework “mithril”の特徴
Shoyo Kyou
•
16.6K views
Riot + generator で始める新しいデータバインディング by Tsutomu Kawamura
Riot + generator で始める新しいデータバインディング
Tsutomu Kawamura
•
9.8K views
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと by Mitsuru Ogawa
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
Mitsuru Ogawa
•
17.7K views
俺的フロントエンド開発 by Kotaro Kawashima
俺的フロントエンド開発
Kotaro Kawashima
•
17.2K views
今後のWeb開発の未来を考えてangularJSにしました by Mitsuru Ogawa
今後のWeb開発の未来を考えてangularJSにしました
Mitsuru Ogawa
•
25.8K views
5分でわかる?Backbone.js ことはじめ by Kohei Kadowaki
5分でわかる?Backbone.js ことはじめ
Kohei Kadowaki
•
11.4K views
Similar to 実践Backbone.Marionette 現場の悩みと解決まで
究極にして至高のWAF by
究極にして至高のWAF
Yuki Ishikawa
4.5K views
•
71 slides
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~ by
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
normalian
1.5K views
•
33 slides
20130924 Picomon CRH勉強会 by
20130924 Picomon CRH勉強会
Yukihiro Kitazawa
538 views
•
11 slides
スマートフォン対応、気をつけたいトラブル by
スマートフォン対応、気をつけたいトラブル
Hiroaki Wakamatsu
29.3K views
•
51 slides
Reactnative はじめの一歩 by
Reactnative はじめの一歩
PIXTA Inc.
2.1K views
•
42 slides
Nodeにしましょう by
Nodeにしましょう
Yuzo Hebishima
294 views
•
20 slides
Similar to 実践Backbone.Marionette 現場の悩みと解決まで
(20)
究極にして至高のWAF by Yuki Ishikawa
究極にして至高のWAF
Yuki Ishikawa
•
4.5K views
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~ by normalian
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
normalian
•
1.5K views
20130924 Picomon CRH勉強会 by Yukihiro Kitazawa
20130924 Picomon CRH勉強会
Yukihiro Kitazawa
•
538 views
スマートフォン対応、気をつけたいトラブル by Hiroaki Wakamatsu
スマートフォン対応、気をつけたいトラブル
Hiroaki Wakamatsu
•
29.3K views
Reactnative はじめの一歩 by PIXTA Inc.
Reactnative はじめの一歩
PIXTA Inc.
•
2.1K views
Nodeにしましょう by Yuzo Hebishima
Nodeにしましょう
Yuzo Hebishima
•
294 views
Java fx勉強会lt 第8回 by Taiji Miyabe
Java fx勉強会lt 第8回
Taiji Miyabe
•
2K views
作って分かるKnockoutJS@ALM11月 by Takuya Ueda
作って分かるKnockoutJS@ALM11月
Takuya Ueda
•
3K views
griffon plugin を 実際に作ってみよう #jggug by kimukou_26 Kimukou
griffon plugin を 実際に作ってみよう #jggug
kimukou_26 Kimukou
•
1K views
130710 02 by openrtm
130710 02
openrtm
•
1.4K views
Start-padrino by Uchio Kondo
Start-padrino
Uchio Kondo
•
5.4K views
Web技術勉強会 第33回 by 龍一 田中
Web技術勉強会 第33回
龍一 田中
•
1.4K views
20130412 titanium meetupvol7 by Hiroshi Oyamada
20130412 titanium meetupvol7
Hiroshi Oyamada
•
1.3K views
Djangoのススメ by Alisue Lambda
Djangoのススメ
Alisue Lambda
•
19.1K views
第8回KPF発表資料 by cryks
第8回KPF発表資料
cryks
•
4.3K views
モダンJavaScript入門.pdf by omochids0113
モダンJavaScript入門.pdf
omochids0113
•
66 views
Isomorphic Architecture & Interface by Jxck Jxck
Isomorphic Architecture & Interface
Jxck Jxck
•
5.4K views
sysloadや監視などの話(仮) by Takanori Sejima
sysloadや監視などの話(仮)
Takanori Sejima
•
5.3K views
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1 by Y Watanabe
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
Y Watanabe
•
4.4K views
HTML5-pronama-study by Naoya Inada
HTML5-pronama-study
Naoya Inada
•
940 views
Recently uploaded
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PC Cluster Consortium
66 views
•
12 slides
光コラボは契約してはいけない by
光コラボは契約してはいけない
Takuya Matsunaga
28 views
•
17 slides
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PC Cluster Consortium
28 views
•
36 slides
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可 by
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可
Hitachi, Ltd. OSS Solution Center.
10 views
•
22 slides
IPsec VPNとSSL-VPNの違い by
IPsec VPNとSSL-VPNの違い
富士通クラウドテクノロジーズ株式会社
606 views
•
8 slides
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 by
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Hitachi, Ltd. OSS Solution Center.
109 views
•
26 slides
Recently uploaded
(7)
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by PC Cluster Consortium
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PC Cluster Consortium
•
66 views
光コラボは契約してはいけない by Takuya Matsunaga
光コラボは契約してはいけない
Takuya Matsunaga
•
28 views
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by PC Cluster Consortium
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PC Cluster Consortium
•
28 views
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可 by Hitachi, Ltd. OSS Solution Center.
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可
Hitachi, Ltd. OSS Solution Center.
•
10 views
IPsec VPNとSSL-VPNの違い by 富士通クラウドテクノロジーズ株式会社
IPsec VPNとSSL-VPNの違い
富士通クラウドテクノロジーズ株式会社
•
606 views
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 by Hitachi, Ltd. OSS Solution Center.
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Hitachi, Ltd. OSS Solution Center.
•
109 views
定例会スライド_キャチs 公開用.pdf by Keio Robotics Association
定例会スライド_キャチs 公開用.pdf
Keio Robotics Association
•
146 views
実践Backbone.Marionette 現場の悩みと解決まで
1.
実践Backbone.Marionette 現場の悩みと解決まで ryuma tsukano (@lxyuma) 塚野
龍馬
2.
Presented By ...
3.
自己紹介 : 塚野
龍馬 (@lxyuma) ● ServerSide寄りWeb Developer ○ 元々SIer出身:java/rubyで法人サービス開発してた ○ 今は、弊社でCGMを開発 ○ 技術Skill ■ 言語FW:Rails + Backbone ■ storage:MySQL + MongoDB ■ 他rails周辺技術 ● 趣味 ○ 旅行/音楽/美味しい物食べる事 ○ 去年は台湾とFrance行った(今年は国内巡ろう) ○ 2013年ハマったのは、あまちゃんと叛逆
4.
jsCafe jsCafeというjavascriptの勉強会をやってる 今日のMarionetteも元はこちらで発表した物 良ければ是非お気軽にご参加を(次は2/2予定)
5.
目的/目標 ● 対象 ○ ある程度、Backbone知ってる方 ●
目的 ○ 現実的にBackboneを使う上での悩み事を解決する ● 目標 ○ 現場でBackbone適用して絶望する人を減らす
6.
目次(& ダイジェスト) ● 導入編 ○
Angularとの比較、BackboneでのDataBindings等 ● 設計編 ○ Marionetteでのコンポーネント構成等 ● 実装編 ○ オレオレ実装を如何に回避するか?等 ● テスト編 ○ javascriptのtestし辛い所と救済措置 ⇒これらQA形式で書いて行く。
7.
導入編
8.
javascriptのframework界隈の動き といえば、Angularの勢いが強いですね ● DailyJSの2013年12月Survveyの利用率 ○ Backbone:25%(辛うじて1位) ○
Angular:25%(僅差で2位) ● GoogleTrendsでAngularが急上昇 ○ 日本でも2013年9月に逆転してAngular>Backboneに [世界] [日本]
9.
Backboneやべぇ 結構古いし そろそろ寿命? ^o^ / 老害ですか?
10.
「老害」について Engineer皆が好きな言葉だから ついでにGoogleTrendsで調べてみた 着実に上昇中! 色々検索されてる!
11.
「老害 Backbone」 良かった〜(> <;) まだ、胸を張って生きていけそうです。
12.
BackboneとAngularを比較する ● VictorSavkin氏の比較記事 ○ infoQ訳 ■ 俺も前に訳してたんだけどね>< ●
この記事が良いのは、 ○ Plugin付けた現実的な構成のBackboneと ○ Angularを比較してる所
13.
BackboneとPlugin ● Backbone =
ただの背骨 ○ 肉は自分で付けないといけない>< ○ 肉付けは大体皆一緒 = Plugin化されてる see BackPlug.io ⇒
14.
BackboneとDataBindings Angularのウリの1つ = DataBindings ⇒Backboneもplugin追加すれば動く ●
NYTimesのBackbone.stickit ● 使い方は超簡単!
15.
Backbone.stickit Viewの中で 1. 紐づけたいセレクタとmodel属性名を定義 2. $el描写後にstickit() ① ② ⇒すげー簡単!form使うなら盲目的に使うべき ⇒他、Backbone単体の問題はPluginで補える
16.
Backbone単体の問題 ● BoilerPlateばっかり ○ 多くはMarionette.jsのViewクラスで解決 ●
俺俺実装でカオス ○ これもMarionette.jsのController/Region等で解決
17.
Marionette.jsとは? Marionette.jsはBackboneをwrapしたframework ⇒以前slideにまとめた 細かい説明は、そちらを見て ※次の章に行く迄に上の slideをチラ見しておくと良いかと。。 ⇒特にView周りで 頻繁に書く所をカバーしてくれる
18.
Marionette.jsは必要か? ● Yes! ○ Backbone使うなら絶対オススメ ●
以前blogに書いたがBackbone書いてると同じ 様なrenderやView構成に何度も出くわす ○ それをMarionette.jsが共通化してくれる ○ 小規模でも使うと楽になる
19.
Backbone単体の問題の続き ● Testし辛い ○ これはsinon.jsのテストダブルで解決 ■
sinon.jsもblog記事書いたので良ければ。 ○ ⇒これらで、ある程度は、楽になるはず ■ ただ、この辺りはやっぱりAngularが強い これらでBackboneの諸問題は回避可能 ⇒Angularの問題は?
20.
Angularの問題 ● 学習コストかかる ○ GoogleTrendsでAngular高い=調べ物多い(のが要因の1つ) ○
Backboneはsource grepで解決(simple素晴らしい!) ● ベンダーロックインに近い状態になる ○ client側の動きや各componentが非常に独特 ■ これ勉強してもAngularだけでしか活かせない ■ なんか某Mの.n●tみたいだ... ● 空気のようなAngularWay ○ まだまだBestPracticeが定まってない感 ○ 今後、WebComponent化すると更にまた変わる?
21.
AngularとBackboneの大人のつきあい方 ● 個人Lv :
Angularは監視/学習し続けるとして ● 現場Lv : まだBackboneで良いのでは? ○ ※で、AngularはWebComponent繋がって、情報整理さ れた頃使えばいいんじゃねーの ● 大分枯れてきてる ● 情報も豊富(無料で一通り手に入る) ⇒現実解としてBackbone!
22.
ここ1年位のBackbone関係の話題 思いつく限り ● 海外 ○ 2013年もカンファあった。Maionetteも出てくる ○
Airbnbがサーバサイドで動くrendr作った ○ addyさんの素晴らしい書籍も出た ● 国内 ○ 春に、多分単独で初めて?書籍も出た ○ C社さんがBackbone baseの独自FW作った 等、まだまだ現役。まだ終わってはいない。 ⇒「老害 Backbone」でつぶやかないように。
23.
という事で... 今年も皆Backboneやろうぜ! ⇒今から現場でBackbone入れた話をする
24.
今日の話の前提条件 「普通の」rails3アプリに適用した話 ● SinglePageAppliでない ● ちなみに、turbolinksも使ってない ⇒前提違うと、 構成や注意点等大分違うと思うのでご注意を ※なお、rails固有の話もしません。
25.
設計編
26.
どう設計? Backbone使う前提 ⇒気軽にajax/Event追加 ⇒設計の可能性が広がる。 同時に、色々悩みが出て来る
27.
Q:htmlは全部Backbone.Viewにする? ⇒No SPAでも無いので、 いつも通りServerSideのViewを9割使ってる DHHが昔disったダブルMVC! ● ServerSideのViewにメリットある ○ 値の連携 ○
FWのhelper等
28.
Q:では、どこにBackbone.View? A:jsが必要になる以下の時に書いてる 普通のWebアプリでよくあるパターン ● ①Eventキャッチ用View ● ②ajax通信が必要なView ○
A:単一リソース ○ B:複数リソース ■ 1:単純な親子 ■ 2:単純な親子+親戚 ⇒大体、このどれかに落ち着く ※要するに普段 js書いてるのを整理してるだけ
29.
Q:①Eventキャッチ用Viewとは 殆どのjs処理がコレ。 例)#menuをclickしたらdiv.menu表示みたいな ● なぜ、これもBackboneで書くのか? ○ Backbone無いと、bindしてるDOMと処理内容がバラバ ラで読み辛い。テストもし辛い(=習慣化しない) ■
昔blogに書いたが、jQueryダラダラ書いて長くteam 開発して量も増えるとゴミコード溜まるし、管理できな くなってくる
30.
Q:Eventキャッチ用Viewはどれ使う? ⇒Marionette.Viewがオススメ 理由:uiがあるから ● ui ○ selectorを一カ所にまとめて、bindしてjQueryObjに ■
(後述するがこれがテストで重要) ○ 使う時、bindUIElements()忘れずに ■ ※ちなみに、ItemView継承してるclassは不要 ● なお、htmlについて ○ render()書かず、ServerSideのViewを元にしてる ○ もし、render()必要ならItemView使おう(自力でrender書 かない事)
31.
Q:②ajax通信が必要なViewとは? MarionetteのViewを使い分ける ● A:単一リソース ○ Marionette.ItemViewを使うと良いよ ●
B:複数リソース ○ 1:単純な親子 ■ Marionette.CollectionView使うと良いよ ○ 2:単純な親子+親戚 ■ Marionette.CompositeView使うと良いよ
32.
Q:複数リソースのViewとは Backboneで複数data取得/表示する situationが非常に多い! 例)検索して結果一覧表示 ⇒ここで親子にView分割する ※ただのイメージ図です 子View 子View ● なぜ親子分割が必要か? ○ Blogにも書いた通り ○
分割しないと ■ MとVの紐付けが毎回必要 ■ 冗長なクラス/htmlになる 子View 子View 親View
33.
親子ViewとMarionette.js Marionetteで親子View用のclassが準備されてる ● 親View ○ CollectionViewか ○
CompositeViewのいずれか。 ● 子View ○ ItemView
34.
Q:2種類の親Viewをどう使い分ける? ※ただのイメージ図です ⇒親戚要素(仮)がいるかどうか ● 親戚要素(仮)とは ○ 親子に働きかける別の要素 ○
俺以外誰も使わないので(仮)を付けてる CompositeView 要素のActionを起点として 親子呼び出すSituation多い ● 例)検索box/tab等 ⇒この時、CompositeView使う これで親子と親戚の連携がスッキリ! 親戚要素(仮) 子View 子View 子View 子View 親要素
35.
2種類の親Viewを整理する ● CollectionView ○ 単純に親子階層だけ必要な時に使う ●
CompositeView:親にTemplate使える ○ 親子要素と、 ○ その親子要素に働きかける別の要素(親戚要素(仮))が 必要な時に使う
36.
Q:component構成は? ⇒Backbone MV* in
MVC model2っぽい構成 AppRouter Controller 生成 連携event 表示 監視 Region View 描写 html Model/Collection event event Template 元々のBackboneの基本的なMV*構成
37.
意図している所 Controller一カ所見ればhtml上でのレイアウト構成 と処理概要が分かるようにしたい ● ①レイアウト構成 ○ Region使ってる ●
②処理概要:Controller ○ Marionette.Controller使ってる
38.
①レイアウト構成:Region DOM要素とViewを紐付け表示管理するclass。 ● ItemView継承してる ○ show()でそのまま使う ●
ItemView継承してない ○ attachView()で強制的に紐づけてる ⇒どのViewも必ずRegionと紐づける事で、 後でsrc辿る時にどこに何があるか分かり易い ● Regionからel貰うのでView内部でel持たない ○ これは、テストの為にもそうしてる(後述)
39.
②処理概要:Controller Marionette.Controller使ってる ● Controllerの関数に書く事 ○ 宣言的な所 ■
A)Regionの定義 ○ 命令的な所 ■ B)Viewの連携Event
40.
A)Controller内のRegion管理 ⇒基本ApplicationのRegionに追加 (Layoutを使ってない) ● いつかFatControllerになったら、 ○ Region管理してる所(宣言的な所)をLayoutに外出しし ようと思ってる ○
が、直近困ってない
41.
B)Controller内のView連携Eventとは あるViewのイベントをきっかけに、 別のViewの要素を変える時のイベント Controller View A View B ●
あえて、Controller挟んでる ○ ⇒ControllerでどのViewがどう連携してるか分かる ○ View内に書くと処理全貌が掴み辛いので避けてる ● ちなみに、主にMarionetteのcmd使ってる
42.
Q:なぜControllerに寄せてる? ⇒Controllerの単位で処理切替るから ● ちなみにこれがSPAなら... ○ App.jsみたいなのがglobalな連携event持って ○
Controllerはview小片call程度のThinなcontrollerにな るんだろうなぁ ● 比較的fat気味なControllerにしてるのは ○ 普通のwebアプリの延長で作った場合 ■ 連携eventはControllerの単位で変わるから ■ 連携eventがControllerまたぐ事ないから ⇒この辺りは、状況に応じてCaseByCase
43.
実装編
44.
Backboneの実装といえば オレオレ実装でしょ!
45.
オレオレ実装とは 特にBackbone.View周辺で見られる ● オレオレ自由系render() ! ○
view毎バラバラでカオスなrender()記述 ● オレオレ深層SubView構成! ○ 深くまで辿らないと全貌が分からない ● オレオレスパゲティdata bindings! ○ 1Viewが複数のModelに複雑にbindしてる 等々・・・
46.
オレオレ実装との戦い Backboneで書いたのにsource追えない 何の為にコレ入れたんだっけ? はい、しゅーりょー ^o^/ これは、どうにかしないと...
47.
Backboneに素直に従う 与えられた物をその範囲内で素直に使う事で 絡まる事無くsimpleでtestableな状態に! ● Backbone.Viewが用意してくれる事 ● Marionetteが用意してくれる事 ●
stickitが用意してくれる事
48.
Backboneが用意してくれる事 ● $el ○ Viewは$el内のDOM要素だけを扱う ○
globalな$使って外の要素を勝手に変えない ■ やりたければさっきの連携eventをtrigger ● Model/Collection ○ 1Viewは1Modelか1Collectionだけと紐づく ○ オレオレModel/Collection作らない ■ 連携が必要なら、同じく連携event使う ● render() ○ 画面描写はrenderで行うのであって、initialize等別の関 数で画面描写するべきでない ■ initializeに書くと画面描写とそれ以外が混合><
49.
Marionetteが用意してくれる事 ● render() ○ 自分でrender書かないで、カオスを回避 ○
Template準備して、誰かと作業し易く ● ui ○ ui経由でjQuery objとって冗長さを避ける ● Event系 ○ 与えられたEventに処理を追加していく ● 親子View ○ Collection/CompositeView + Region管理でカバー ○ 可能な限り自力でsubview書かない(Backboneに準備 されてないし)
50.
大原則 当たり前の事だけど、 これらに沿うだけで大分違う。 ※勿論、例外はあるが。 基本的に、 与えられた物を素直に使う事に徹する のがオススメ
51.
Q:ぱっと見でViewの動きが掴めない ⇒関数名にevent入れる規約にする ● event関数名 =
on + イベント名 + 対象 ○ 例)onClickSaveButton / onSyncModel ● これでevents一々見なくても流れが掴める ○ Backbone.View関数名で動作を説明する必要は無い ■ (特にMarionette入れた)Backboneはviewの関数の 行数が少なくsrc見れば動きがすぐ分かるし ○ そもそも他のevent駆動programも同じ発想 ■ iOS/VB等々.. ○ 勿論event関数から呼ぶ別の関数は普通に名前付け(こ れでevent駆動の関数とそれ以外で分かれる)
52.
Q:view内の関数同士の関係がカオス ⇒関数同士の継ぎ目になるstatusを区別する status? ● 関数横断して相互利用する要素があった時 ○ 例えば、tab/modal/load
anime等 ○ testでbuggyなのは、この辺り! ○ そのままjQuery操作すると(特にsrcが長くなった時)独立 した表示要素の操作と区別がつかなくなって、埋もれて しまう ○ これはtestする上で致命的(追加改修時も大変) ⇒statusは変数として外出して変更箇所を統一
53.
Q: statusどう管理する? ⇒methodにstatus/画面操作を統一で妥協 結局、どこまでやり過ぎるかのせめぎ合い ● デザパタState
pattern ○ ⇒Backbone.ViewのSubview構成に行き着く ● Backbone.Events継承 ● pluginもやっぱりある(がっつり系 / 簡易系) ⇒いずれにせよ、冗長になるが ○ Viewがstatus持ってる事を明示出来る ○ testや追加時に、status確認する起点が出来る
54.
Q:変な動きするんだけど ⇒ソースgrepが早くて一番正確。 ● BackboneもMarionetteもstickitも全部 ● どれもそんなに長くなくてsimple ○
例えば、Backbone.Viewはたった百行前後しかない ソース辿れるとどうにかなる。 simpleって素晴らしいですね! ここがBackboneの良い所!
55.
Q:書いてて不安になるんだけど ⇒分かる。だから、TDD必須 ● 実装からBrowser表示まで時間かかる事ある ○ こまめにTestFirstでjs
levelの動作確認が必要 ● しかし、生でtestは限界がある。 ● 結局、幾つかの慣例表現を知らないと backboneのtest書けないので次に扱う ○ ※今日はTestとTDDまとめて話すが、blogに書いた通り 厳密には違う。これも知らないと、どう書くか悩む事にな るので、良ければ読んで頂ければ。今日はこの違いの 話はしない。
56.
テスト編
57.
jsのTest Frameworkざっくり流れ ● 数年前 ●
2年前 ● 去年 ⇒コロコロ主流が 変わってきましたね
58.
Q:Test Frameworkどれがいい? ● ちょっと前迄、mochaでいいと思ってた ○
mocha使う=chai使う=language chainが気持ち悪い ○ chai以外にどのassertionLibに落ち着けばいいか謎。 (それぞれメリデメと、流行/廃りがある) ⇒最近、個人的にjasmineでいい気がしてきた
59.
jasmine ● jasmine2が出てdone(非同期test機能)付いた ● 呼出し口が固定されてる(当たり前だけど) ○
※jasmineのspy周りは、機能詰め過ぎ/関数名長過ぎで 気持ち悪いので、sinon(後述)使ってる ● 調べるときも公式pageだけで完結 ● 2013DailyJSアンケートでも、まだ1位 ⇒simple素晴らしい jasmine + sinonでいいんじゃない?
60.
BackboneとTest BackboneのTestはFrontEnd特有の問題がある ● ①jsがDOM/htmlに依存してる問題 ● ②素直に検証書けない問題 これらの解決策を知らないとかなり悩む事に!
61.
①jsがDOM/html依存してる問題 ● 頻発するデザイン変更の度にtest修正が必要 ○ test修正自体正しい事だが量が多い点が問題>< ●
DOM調整作業やってるとTDDし辛い ○ DOM調整でhtml注力すると開発flowにTest入らない ● target/testの2つだけで完結しない(htmlがある) のでTDDに集中できない ○ ServerSideではtargetとtestの2つだけで恵まれてた
62.
TDD進める為に ● ゴール ○ ServerSideのTDDの様にTest/Targetだけの行き来に する ●
方向性 ○ DOM/htmlの分離 ■ 勿論、完全分離は不可能だが、距離をあける ○ jsを書く事と、DOM調整作業を分ける ※ちなみに、テストから完全にDOM排除せよとい う話ではない。違う形で確認は必要。
63.
BackboneでのDOM/html分離 ● DOMselector書かずMarionette. View.ui使う ○
TestCodeから要素掴むのもview.ui使う ○ targetもtestも中身が絡まるのをおさえる ○ 変更時の修正の起点を作る ● test用templateを基本的に作らない ○ 変更時の修正costを下げるため ○ htmlは本物のfileだけ。 ● Viewは$elの範囲内だけ扱う相対View作る ○ test用template書かずに済む ○ htmlに無いので表示検証が難しいが、逆にそれでDOM 分離(logic検証spyでも可。jQuery関数自体を検証して も意味ない)
64.
②素直に検証書けない問題 ● instance変数の変更等は普通に検証書けるが ● event/server通信はそのまま書けない ⇒後者の対応の為に結局TestDoubleが必要
65.
テストダブルとは テスト対象が別コンポーネントに依存しており この別コンポーネントの為テストが困難な時に 別コンポーネントを置換/監視する仕組み。 spy/stub/mock等がある。 テストコード mocha等 置換/監視 テスト対象 Backbone等 別の コンポーネント
66.
spy/stub/mockざっくり解説 ● spy ○ ある関数の入出力を監視 ●
stub ○ ある関数の戻り値を改ざん ● mock ○ 検証作業自体をobject化
67.
Q:jsでどうやってTestDouble? ⇒sinon.jsがある ● spy/stub/mockに加え、fakeTimerや fakeServer等非常に便利 ● ※jasmineにもあるが、前述の通り、機能詰め 過ぎと関数名長過ぎでオススメしない
68.
Q:いつTestDouble? ⇒主に、以下 ● ● ● ● イベントトリガー サーバー通信 アニメ localなinstance
69.
イベントトリガー例 Event掴む為にTestDouble ● spyを作ってイベントにbindしておく ● spyが呼ばれたか確認 ※view.model等も一緒 ※ちなみに、bindは_event確認すると良い
70.
サーバー通信 ● TestDouble無しでそのまま書くと ○ ○ ○ ○ テスト検証非同期callback深くなる Serverside経由する分、testの時間もかかる POST/PUTの検証にtest用GET自作する必要あり 問題有ったときの原因の切り分け面倒 ⇒これら回避するためサーバ通信もTestDouble
71.
Q:サーバー通信どこでTestDouble? どこにTestDouble張るかは色々やり方がある ● 1.元の口にTestDouble ○ $.ajaxやsyncメソッド等 ●
2.xhr自体をTestDouble ○ sinon.createFakeServer()でxhr自体wrapする ○ stubとしては最も正しい姿だが設定面倒くさい ● 3.個別のメソッドにTestDouble ○ model.save等 現実的に3が多い気がする
72.
個別メソッドにTestDouble例 ● 普通にspyしてlogicの検証してもいいし ● fetch等はstubで仮のデータを返すのも有り ○
yieldsTo使うと、success/error等も叩ける
73.
アニメ 普通に書くとテストで数秒待ちする必要 ⇒sinon.fakeTimer使うと、すぐ終わる
74.
localなinstanceのcheck ある関数の中でModelのinstance作って、save等 する時、普通にやると掴めない ⇒TestDouble(Mock) ● Model.prototypeにmockかける ● sinonのstub ○
sinonはstubも検証できるobjなので、stubでも書けてし まうが、Testのcontextでは無い所での検証なのでmock の方が正しい。(主体となる視点の違い)
75.
localなinstanceの例 こんな感じ
76.
テストダブルの注意 stub/mock等使うと実際の動きと異なる ⇒stub等経由しないテストが必要 ● ※必ずしも全自動化の必要は無いと思うが
77.
Q:sinonつらい ⇒分かる。 ServerSide他言語のtest書いてて、こんなに TestDouble頻繁に書かないし。ありえない。 ● cursor戻して逐一before書くのが苦痛 ○ stubは必要なのは分かる。処理異なるし。 ○
問題はspy周り。普通にそのままevent等確認したい ⇒Viewの全部にまとめてspyできねーか?と今 plugin作ってみてる。良ければ。
78.
Backboneのbug BackboneのViewの関数は (特にMarionetteと一緒に使うと) 行も少ないsimpleな物になる。 ⇒1関数LVの挙動でbug入り込む余地が少ない それより、event駆動に起因するbugが多い
79.
event駆動 ● FrontEnd ≒
event駆動 ○ 関数はeventに応じて実行(順番通りの部分もあるが) ○ 例 ■ 開発:関数A ⇒ 関数B ⇒ 関数Cを意図 ■ 実際:関数A ⇒ click ⇒ 関数C ⇒ click ⇒ 関数B ⇒意図しない関数の組み合わせがあり得る ● 独立している関数は意識しなくていいが ● 独立していない関数は注意が必要
80.
独立していない関数とは、例えば。 ● statusに依存している/影響与える関数 ○ これは、先程の話 ○
思わぬ前提条件statusの違いや思わぬstatus影響等 ● 非同期処理を伴う関数 ○ 処理中に別の関数あると影響与える?与えない?等 ○ これも結局、上と同じstatusの話に行き着く ⇒これらの関数を中心に、 別の関数との相互作用を重点的にTestする
81.
まとめ ● 設計編 ○ 親子ViewはCollection/CompositeViewを使う ○
Controllerに処理寄せる(not SPAならね) ● 実装編 ○ Backbone/Marionetteに素直に作る ○ status外出し ● テスト編 ○ jsのテストとDOMを分ける ○ テストダブルを使う ○ 独立してない関数に注意
82.
Backboneの悩みを解決できた? オレオレ実装/設計から逃れられそう?
83.
これでBackboneに絶望する人を 少しでも救えたら幸い (皆で渡れば怖くない。 まだ老害になりたくない。 今年もBackboneでしょ!)
84.
Q:今日の内容もお前のオレオレだろ? そうですね。 書いてて思った。
85.
俺のオレオレと、 お前のオレオレと... 新しい宇宙と......
86.
なに言ってんの?(゚д゚ )
87.
オレオレとの付き合い方 Marionetteやstickitみたいなpluginにして ● オレオレをルールにしなければ。 ● 人に同意されなければ。 という事で、Backbone周辺libraryを 皆で色々作っていこう! おわり
88.
SNS等 ● ● ● ● Twitter Github Slideshare jsCafe(javascript勉強会)のFacebookGroup ⇒それぞれfollow/参加ご自由に!
89.
Blogもやってる http://lxyuma.hatenablog.com/ ● 今日の内容も殆どここから ○ いつも酒飲みながらダラダラ書いてる ○
今日言葉足りなかった所は是非読んで頂けると幸い ○ 「はてぶくれ!」
90.
Presented By ...