33
部分更新における Turbolinks 3 のマシさ C#er から見た Turbolinks 3 @dany1468

C#er から見た Turbolinks 3

Embed Size (px)

Citation preview

Page 1: C#er から見た Turbolinks 3

部分更新における Turbolinks 3 のマシさ

C#er から見た Turbolinks 3

@dany1468

Page 2: C#er から見た Turbolinks 3

昔は C#er だった❖ 2 年前まで 5 年ぐらいずっと C#/ASP.NET。その前は Java/Struts/

Seasar2で 2 年ぐらい。

❖ C# は 2 ぐらいから始めて、4.5 ぐらいまで触った感じ。6 とか分からん。

❖ ASP.NET は ASP.NET Ajax を経由して ASP.NET MVC は 3 ぐらいまで。

❖ C# は好きだけど、テスト書きにくいのがむむむ。

❖ Ruby はもうすぐ2年ぐらい

Page 3: C#er から見た Turbolinks 3

Turbolinks 3

Page 4: C#er から見た Turbolinks 3

その前に・・

Page 5: C#er から見た Turbolinks 3

Turbolinks の一般的なイメージ

Page 6: C#er から見た Turbolinks 3

こんな感じですよね 😅

Page 7: C#er から見た Turbolinks 3

Turbolinks ってなんだっけ?❖ 簡単には Github のサイトでやっているような pjax 的な動作を簡単に実現できる仕組み。

❖ title, body を非同期に入れ替えているけど、pushState

使って URL は変える

❖ GET リクエストだけ

❖ ページ自体をキャッシュできたりと、さらに View を高速化する仕組みも入っています。

Page 8: C#er から見た Turbolinks 3

Turbolinks 3 の発表 🎉

❖ 皆に無効化されながらも生き残った Turbolinks が

Rails5 で 3 になる事が RailsConf 2015で発表され、現在も活発に開発が続けられています。

Page 9: C#er から見た Turbolinks 3

🚀目玉機能 の Partial Replacement

Page 10: C#er から見た Turbolinks 3

目玉機能の Partial Replacement

❖ title, body だけでなく細かく制御できるようになった

❖ client, server side の両方でキーワードを指定することで、部分的に更新する箇所、しない箇所を指定できる

❖ client side は data-turbolinks-temporary, data-turbolinks-

permanent をタグに指定をすることで切り替え

❖ server side は redirect_to, render 時に change, keep のキーワードを指定することで切り替え

Page 11: C#er から見た Turbolinks 3
Page 12: C#er から見た Turbolinks 3
Page 13: C#er から見た Turbolinks 3

部分更新ができればもっと高速に画面の切り替えができる❓

Page 14: C#er から見た Turbolinks 3

ちょっと待て・・ 部分更新と言えば・・😧

Page 15: C#er から見た Turbolinks 3

ASP.NET Ajax❖ 皆さんはこの単語をご存知でしょうか?

Page 16: C#er から見た Turbolinks 3

その前に ASP.NET❖ Ruby/Rails の方にはあまり馴染みが無いかも

❖ Windows Formを無理やりWebに持ってきたというのが簡単な説明

❖ Web なのにステートフルという点では Java の Wicket がちょっと近い。

❖ 今はオワコンと化して ASP.NET MVC にとって変わられた

Page 17: C#er から見た Turbolinks 3

いや、言うほど悪くないですよ 😅

Page 18: C#er から見た Turbolinks 3

そして ASP.NET Ajax❖ Ajax の流れに完全に乗り遅れた MS が出した超兵器( ASP.NET MVC の爆誕前)

❖ JS を書かないっていう点では Google Web Toolkit を思い出したり

❖ JS を書くこと無くモーダルやインクリメンタルサーチとかを特殊なタグを書くことで実現できる💡

❖ なんかコンポーネントっぽい!

Page 19: C#er から見た Turbolinks 3

でも ASP.NET Ajax は失敗した💀❖ 簡単な画面なら良かったんですよね。。

❖ Wicket よりもステートフルのやり方が良くなかった(状態を全部 hidden に書き出しだと。。)

❖ Ajax の機能も特殊なタグでやり過ぎて、自動生成な

JavaScript が実行時に大量に流れた

❖ よって、複雑な画面を作ろうとすると、エラーが発生しデバッグも困難になった 😖

Page 20: C#er から見た Turbolinks 3

特に辛かった部分更新❖ 一番便利でかつ、一番悩ましかったのが部分更新

❖ <asp:UpdatePanel> という魔法のタグ1つで、そこが部分更新の対象となる😳

❖ よくなかったのは部分更新によって異る機能を持つコンポーネントが画面にあるような作りなのに、全て一つの Controller で捌く必要があったこと

❖ MVP パターン使って Presenter を作るなどしてマシにはできたが、基本はどんどんコードが肥大化 😩

Page 21: C#er から見た Turbolinks 3

UpdatePanel

Page 22: C#er から見た Turbolinks 3

それもあって最初の感想

❖ 「DHH さん、やっちまったな。。😷」

❖ と Turbolinks の引き続きの無効化を誓ったのでした

Page 23: C#er から見た Turbolinks 3

レスポンスから見る ASP.NET Ajax と Turbolinks 3 の違い

❖ ASP.NET Ajax の部分更新では、例えば POST した時のレスポンスは、UpdatePanel で指定した部分だけのフラグメント HTML が返される

❖ 一方で、Turbolinks 3 の場合は、リクエストしたアクションの戻り値の HTMLがそのまま返される。

❖ 基本は pjax なので、非同期実行ができない場合でも、その画面がレンダリングできるようにしたい

❖ つまり、本当に部分的にしか画面を更新しない場合にはほとんどが無駄なレスポンスになる

Page 24: C#er から見た Turbolinks 3

Turbolinks 3 の有利な点❖ Turbolinks 3 は元々が pjax 的な感じなので、当然別の

Controllerへのリクエストもできる

❖ ASP.NET は原則 POST は自身の Controllerにしかできない

❖ つまり最初のレンダリングが終われば、画面の各パーツは

POST 先の異る別々のコンポーネントとして振る舞える

❖ でも見た目いつもの Rails のコードと変わらない

❖ change, keep みたいなキーワードはあるけど

Page 25: C#er から見た Turbolinks 3

ふむ、それなら使いどころあるかも 💡

Page 26: C#er から見た Turbolinks 3

DEMO https://github.com/dany1468/turbolinks3-playground

demo ブランチ

Page 27: C#er から見た Turbolinks 3

コンポーネント指向に画面を作る❖ 最近ではクライアントサイド、特に React.js 等のフレームワークがコンポーネントに UIとロジックを閉じ込めて画面を作るように設計されていたりします。

Page 28: C#er から見た Turbolinks 3

Turbolinks とコンポーネント

❖ Turbolinks では UI と Logic は相変わらず Controller と

View で離れています。

❖ しかし Partial Replacement によって、それらの組み合わせが1つの画面内で独立して振る舞う事を可能にしています。

Page 29: C#er から見た Turbolinks 3

Rails らしいバランス感覚❖ 「部分更新」と聞いてまず思うのは、 Turbolinks なんか使わずに

SPA として作って、JavaScript のフレームワーク使った方がいいように思える、がそうしなかった。

❖ 思い出すのは、Model の肥大化を防ぐのに、新たな層を入れて整理する事もできるが、それはせず concerns を導入するだけに留めた

❖ みんながそんな複雑なアプリを作るわけじゃない

❖ 本当に複雑な事は解決できないかもしれないが、シンプルに解決できる事を増やしていくようなアプローチ?(個人の感想)

Page 30: C#er から見た Turbolinks 3

Rails の進む道❖ RailsConf の DHH のキーノートでとてもらしい発言がありました

❖ http://tech.misoca.jp/entry/2015/05/08/170112

Page 31: C#er から見た Turbolinks 3

Turbolinks 3 を使うべきか?

❖ あなたのチームが JavaScript に十分熟知していて、メンテナンスする時間も取れそうであり、今後もどんどん画面が複雑化していきそうであれば、React.js のようなフロントエンドのフレームワークを使うべきだと思います

Page 32: C#er から見た Turbolinks 3

Turbolinks 3 を使うべきか?

❖ 一方で、JavaScript が苦手なメンバーが多く、そこに投資もできないのであれば、Turbolinks 3 は1つの選択肢になりうると思います。

❖ ただし、本当に複雑でインタラクティブな画面を作りたい時は、いずれフロントエンドのフレームワークを使う必要があるということは考えなくてはいけないと思います 😤

Page 33: C#er から見た Turbolinks 3

メンテ不能な JavaScript コードを生み出すぐらいなら Turbolinks 3 を検討してはいかがでしょう

か?