SlideShare une entreprise Scribd logo
1  sur  44
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mithril - 軽量・高速な
MVCフレームワーク
株式会社 DeNA Games Osaka
技術編成部 人西 聖樹
masaki.hitonishi@dena.com
Copyright © DeNA Co.,Ltd. All Rights Reserved.
自己紹介
 人西 聖樹(ひとにし まさき)
 Twitter: @sairoutine
 株式会社 DeNA Games Osaka
 Webアプリケーションエンジニア
 趣味事では、WebGL と Electron を使ってPCゲー
ムを作るチャレンジをしています。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
フロントエンド
JavaScript
フレームワーク
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ところで皆さんに質問
JavaScript フレームワーク、
どれ使ったことあります?
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mithril とは
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mithril
 フロントエンド MVCフレームワーク
 仮想DOM
 コンポーネントもサポート
 ファイルサイズが小さい(バージョン0.2.5 時点で、約 20 KB)
 APIが少ない(約23個。よく使う API は4つくらい)
 最小ながらも Mithril だけで SPA が作れる程度には揃ってる
 速い
Copyright © DeNA Co.,Ltd. All Rights Reserved.
界隈における
Mithril の位置づけ
Copyright © DeNA Co.,Ltd. All Rights Reserved.
今学びたいJSフレームワークは?
https://medium.com/@sachagreif/the-state-of-javascript-front-end-frameworks-1a2d8a61510
より引用
Copyright © DeNA Co.,Ltd. All Rights Reserved.
もう一度使いたいJSフレームワークは?
https://medium.com/@sachagreif/the-state-of-javascript-front-end-frameworks-1a2d8a61510
より引用
Copyright © DeNA Co.,Ltd. All Rights Reserved.
その他に言及されているJSフレームワーク
https://medium.com/@sachagreif/the-state-of-javascript-front-end-frameworks-1a2d8a61510
より引用
Mithril
Copyright © DeNA Co.,Ltd. All Rights Reserved.
MVC
Copyright © DeNA Co.,Ltd. All Rights Reserved.
MVC
 Model(状態), View(表示), Controller
(Model と View を管理する)
 フレームワークとしてのサポートはないが、
ViewModel を追加して、MVVM (+
Controller) の設計にするとよりよい設計に。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Model
 普通の JavaScript オブジェクト (Mithril フ
レームワークにロックインしてない)
 m.prop を使えば、getter-setter を生成で
きる。
 Web API から取得/へ保存するデータを主
に担当する
Copyright © DeNA Co.,Ltd. All Rights Reserved.
View
 仮想DOM(後述)を返すJavaScriptの関数
 Controller の保持する状態を参照できる
 再描画が走るたびに呼ばれるので、重い処理
は View で行わず Controller で行う。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Controller
 インスタンスを作る JavaScript の関数
 各種クラスの初期化など
 Controller が Model (or ViewModel)を持ち、
View は Controller を通して状態にアクセ
スする感じになる
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ViewModel
 アプリケーションの状態を扱う。
 永続化する状態は Model に、永続化しない
状態は ViewModel に直接持たせるような設
計をよく見る。
 ここをシングルトンにしておくと、SPAで
ページ遷移しても前のページの状態を残して
おいたりできる。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Component
 JavaScript のオブジェクト。 controller プ
ロパティと、 view プロパティを持つ。
 SPAにおいては 1ページ 1コンポーネント最
低必要。
 コンポーネントの中で別のコンポーネントを
呼び出せる。
 よって、 React のように再利用可能なコン
ポーネントを作っておくと楽
Copyright © DeNA Co.,Ltd. All Rights Reserved.
仮想DOM
Copyright © DeNA Co.,Ltd. All Rights Reserved.
HTML(実DOM)の変更はコストが高い
 ツリー構造のDOMデータを走査していく
 座標計算のやりなおし、CSSスタイルの再適
用 etc…
Copyright © DeNA Co.,Ltd. All Rights Reserved.
node.querySelector('.foo').innerHTML = ’aaa'
しかし、こうしたコードは最終的に
どういうHTMLが出力されるのか
追いにくい。
仮想DOMの出番!
今までは jQuery などで差分を
追加/変更/削除するコードを書いて、
極力 DOM の変更を抑えてきた
Copyright © DeNA Co.,Ltd. All Rights Reserved.
仮想DOMだと
<div class="modal-body">
<form>
<div class="form-group">
<label>イベント名</label>
<div class="form-control-static">{ model.name() }</div>
</div>
<div class="form-group">
<label>日時</label>
<div class="form-control-static">{ model.start_date() }</div>
</div>
</form>
</div>
DOMのあるべき姿を書くだけで、
フレームワークが
状態の変更前と変更後を比較して
差分だけ書き換えてくれる。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
差分検知の仕組み
 ソースコードにコメントがある
* diff algorithm can be summarized as this:
*
* 1 - compare `data` and `cached`
* 2 - if they are different, copy `data` to `cached` and update the
M
* based on what the difference is
* 3 - recursively apply this algorithm for every array and for the
* children of every virtual element
Copyright © DeNA Co.,Ltd. All Rights Reserved.
めっちゃ要約すると
1. 更新前の仮想DOMと更新後の仮想DOMを比
較する
2. 異なる場合は、異なる種類に応じて更新を
する
3. 再帰的に子要素を辿っていって、上記のア
ルゴリズムを適用していく
↓
めっちゃシンプルなアルゴリズム!
Copyright © DeNA Co.,Ltd. All Rights Reserved.
じゃあなんでこんな速いのか?
Copyright © DeNA Co.,Ltd. All Rights Reserved.
再描画が走るタイミング
 Mithril は再描画が走るタイミングを絞ることで、
圧倒的なパフォーマンスを発揮している。
 m.module() か m.route() を使って コントローラ
が初期化されたタイミング
 イベントハンドラ(onclick等)が発生したタイミン
グ
 m.request(後述する http リクエスト)が完了した
タイミング
 m.redraw() を呼んで、明示的に再描画を呼んだタ
イミング
Copyright © DeNA Co.,Ltd. All Rights Reserved.
描画が走るタイミングの調整
 1フレーム単位で何回再描画が呼びだされても、1
度しか再描画しない
 Model が更新された際に view を再描画する仕組
みが Mithril にはない。
 よって setInterval などで Model を更新しても、
view が更新されない罠にハマる。
 m.redraw() を呼び出すと、次のフレーム更新タイ
ミングで再描画する。
 あるいは m.startComputation() と
m.endComputation() で描画カウンタを増減させ
ることで、再描画を行う。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
msx
Copyright © DeNA Co.,Ltd. All Rights Reserved.
msx
 React でいう jsx
 仮想DOMは JS のデータなので、フレーム
ワークに沿った書き方をしないといけない
 いわゆる普通のHTMLで書いて、それを仮想
DOM の書き方に変換する
Copyright © DeNA Co.,Ltd. All Rights Reserved.
これが
var todos = ctrl.list.map(function(task, index) {
return <li className={task.completed() && 'completed'}>
<div className="view">
<input
className="toggle"
type="checkbox"
onclick={m.withAttr('checked', task.completed)}
checked={task.completed()}
/>
<label>{task.title()}</label>
<button className="destroy" onclick={ctrl.remove.bind(ctrl,
index)}/>
</div>
<input className="edit"/>
</li>
})
Copyright © DeNA Co.,Ltd. All Rights Reserved.
こうなる
var todos = ctrl.list.map(function(task, index) {
return {tag: "li", attrs: {className:task.completed() && 'completed'}, children: [
{tag: "div", attrs: {className:"view"}, children: [
{tag: "input", attrs: {
className:"toggle",
type:"checkbox",
onclick:m.withAttr('checked', task.completed),
checked:task.completed()}
},
{tag: "label", attrs: {}, children: [task.title()]},
{tag: "button", attrs: {className:"destroy", onclick:ctrl.remove.bind(ctrl,
index)}}
]},
{tag: "input", attrs: {className:"edit"}}
]}
})
Copyright © DeNA Co.,Ltd. All Rights Reserved.
 jsx はキショイ(javascript の中に 生の HTMLが混
ざってくる) と言われがち
 個人的には、ejs や jade などのような、新手のテ
ンプレートエンジンだと思えばそこまで気になら
ない。
 フロントエンドエンジニアが Model と Controller
を書いて、マークアップエンジニアが View を書
く、みたいな役割分担もしやすい。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
バインディング
Copyright © DeNA Co.,Ltd. All Rights Reserved.
モデルからビューへのバインディング
 モデルの内容をビューに反映させる
 再描画によって差分を検出し、value の中身の部分
のみ更新される
 先述のように、setInterval などで Model を更新
した場合、明示的に再描画を呼び出す必要がある。
m("input", {value: ctrl.model.description()})
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ビューからモデルへのバインディング
 ビューにてユーザーが入力した内容をモデルに反
映する
 m.withAttr を使う
 onchange イベントによって
ctrl.model.description を更新してくれる
 やってることは下記と同じ
m("input", {onchange: m.withAttr("value", ctrl.model.description)})
m("input", {onchange: function (e) {
ctrl.model.description(e.currentTarget.value);
})
Copyright © DeNA Co.,Ltd. All Rights Reserved.
http リクエスト
 m.request を使って行う。
 thennable (いわゆる Promise)
 リクエストが完了するまで、再描画を待たせ
てくれる。
User.listEven = function() {
return m.request({method: "GET", url: "/user"}).then(function(list) {
return list.filter(function(user) {return user.id % 2 == 0});
})
.catch(function(e) { throw e; });
}
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mithril を選択することが有用な場合
 サーバーサイドエンジニア
同じMVCなので学習しやすい
Mithril 自体が1000行程度なので
最悪コードを読めばなんとかなる
 最終的に捨てる選択肢を取る場合
あと2〜3年もすれば新しいメジャーな
FWが登場する。
どうせ捨てるなら学習コストの低いものを
Copyright © DeNA Co.,Ltd. All Rights Reserved.
公式サイト
http://mithril-ja.js.org/
Copyright © DeNA Co.,Ltd. All Rights Reserved.
日本語のオライリー本
Mithril――最速クライアントサイドMVC
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ご清聴ありがとう
ございました!

Contenu connexe

Tendances

DeNAのゲーム開発を支える技術 (クライアントサイド編)
DeNAのゲーム開発を支える技術 (クライアントサイド編)DeNAのゲーム開発を支える技術 (クライアントサイド編)
DeNAのゲーム開発を支える技術 (クライアントサイド編)denatech2016
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニックinfinite_loop
 
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜Kentaro Matsumae
 
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechconYosaku Toyama
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる増田 亨
 
よろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだよろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだNarami Kiyokura
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところY Watanabe
 
GAE + Spannerで目指せ No (Uncomfortable) Ops
GAE + Spannerで目指せ No (Uncomfortable) OpsGAE + Spannerで目指せ No (Uncomfortable) Ops
GAE + Spannerで目指せ No (Uncomfortable) OpsMiniascape
 
ドリコム的Railsアプリ開発流儀
ドリコム的Railsアプリ開発流儀ドリコム的Railsアプリ開発流儀
ドリコム的Railsアプリ開発流儀Takafumi ONAKA
 
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発infinite_loop
 
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)Takuya Kawabe
 
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Yoshiki Shibukawa
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャーssuser070fa9
 
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -Tomoya Kabe
 
Implementing Domain-Driven Design: Part 1
Implementing Domain-Driven Design: Part 1Implementing Domain-Driven Design: Part 1
Implementing Domain-Driven Design: Part 1Atsushi Kambara
 
JPAのキャッシュを使ったアプリケーション高速化手法
JPAのキャッシュを使ったアプリケーション高速化手法JPAのキャッシュを使ったアプリケーション高速化手法
JPAのキャッシュを使ったアプリケーション高速化手法Chihiro Ito
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術dena_study
 
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論賢次 海老原
 
自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方光晶 上原
 

Tendances (20)

DeNAのゲーム開発を支える技術 (クライアントサイド編)
DeNAのゲーム開発を支える技術 (クライアントサイド編)DeNAのゲーム開発を支える技術 (クライアントサイド編)
DeNAのゲーム開発を支える技術 (クライアントサイド編)
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜
 
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
 
よろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだよろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだ
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
GAE + Spannerで目指せ No (Uncomfortable) Ops
GAE + Spannerで目指せ No (Uncomfortable) OpsGAE + Spannerで目指せ No (Uncomfortable) Ops
GAE + Spannerで目指せ No (Uncomfortable) Ops
 
ドリコム的Railsアプリ開発流儀
ドリコム的Railsアプリ開発流儀ドリコム的Railsアプリ開発流儀
ドリコム的Railsアプリ開発流儀
 
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
 
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
 
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
 
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -
 
Implementing Domain-Driven Design: Part 1
Implementing Domain-Driven Design: Part 1Implementing Domain-Driven Design: Part 1
Implementing Domain-Driven Design: Part 1
 
JPAのキャッシュを使ったアプリケーション高速化手法
JPAのキャッシュを使ったアプリケーション高速化手法JPAのキャッシュを使ったアプリケーション高速化手法
JPAのキャッシュを使ったアプリケーション高速化手法
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術
 
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
 
自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方
 

Similaire à Mithril - 軽量/高速なMVCフレームワーク

Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】WESEEKWESEEK
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternAtsushi Kambara
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~Yoshitaka Seo
 
jadeで作るclient template
jadeで作るclient templatejadeで作るclient template
jadeで作るclient templateOta Tomoaki
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】Yasuhito Yabe
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~normalian
 
クラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチクラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチTomoharu ASAMI
 
[JavaOne Tokyo 2012] JavaFX and Web Integration
[JavaOne Tokyo 2012] JavaFX and Web Integration[JavaOne Tokyo 2012] JavaFX and Web Integration
[JavaOne Tokyo 2012] JavaFX and Web IntegrationKazuchika Sekiya
 
Java fx勉強会lt 第8回
Java fx勉強会lt 第8回Java fx勉強会lt 第8回
Java fx勉強会lt 第8回Taiji Miyabe
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tipsyoshikawa_t
 
Web workers&parallel.js html5勉強会lt大会
Web workers&parallel.js   html5勉強会lt大会Web workers&parallel.js   html5勉強会lt大会
Web workers&parallel.js html5勉強会lt大会Yuta Shimakawa
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発Akira Inoue
 
Xamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツXamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツMasuda Tomoaki
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azurede:code 2017
 

Similaire à Mithril - 軽量/高速なMVCフレームワーク (20)

Vue入門
Vue入門Vue入門
Vue入門
 
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~
 
SimpleModeler
SimpleModelerSimpleModeler
SimpleModeler
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
jadeで作るclient template
jadeで作るclient templatejadeで作るclient template
jadeで作るclient template
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】
 
20200304 vuejs
20200304 vuejs20200304 vuejs
20200304 vuejs
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
 
クラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチクラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチ
 
[JavaOne Tokyo 2012] JavaFX and Web Integration
[JavaOne Tokyo 2012] JavaFX and Web Integration[JavaOne Tokyo 2012] JavaFX and Web Integration
[JavaOne Tokyo 2012] JavaFX and Web Integration
 
Java fx勉強会lt 第8回
Java fx勉強会lt 第8回Java fx勉強会lt 第8回
Java fx勉強会lt 第8回
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tips
 
Web workers&parallel.js html5勉強会lt大会
Web workers&parallel.js   html5勉強会lt大会Web workers&parallel.js   html5勉強会lt大会
Web workers&parallel.js html5勉強会lt大会
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発
 
Xamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツXamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツ
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
 

Plus de sairoutine

How to manage parameters for gacha games
How to manage parameters for gacha gamesHow to manage parameters for gacha games
How to manage parameters for gacha gamessairoutine
 
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容sairoutine
 
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例sairoutine
 
Dark side of the reflect
Dark side of the reflectDark side of the reflect
Dark side of the reflectsairoutine
 
マジック・ザ・ギャザリングの背景世界とストーリー
マジック・ザ・ギャザリングの背景世界とストーリーマジック・ザ・ギャザリングの背景世界とストーリー
マジック・ザ・ギャザリングの背景世界とストーリーsairoutine
 
Touhou Project on JavaScript
Touhou Project on JavaScriptTouhou Project on JavaScript
Touhou Project on JavaScriptsairoutine
 
JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話sairoutine
 
JS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームJS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームsairoutine
 
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をするSlack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をするsairoutine
 

Plus de sairoutine (10)

How to manage parameters for gacha games
How to manage parameters for gacha gamesHow to manage parameters for gacha games
How to manage parameters for gacha games
 
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
 
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
 
Dark side of the reflect
Dark side of the reflectDark side of the reflect
Dark side of the reflect
 
マジック・ザ・ギャザリングの背景世界とストーリー
マジック・ザ・ギャザリングの背景世界とストーリーマジック・ザ・ギャザリングの背景世界とストーリー
マジック・ザ・ギャザリングの背景世界とストーリー
 
em-dosbox
em-dosboxem-dosbox
em-dosbox
 
Touhou Project on JavaScript
Touhou Project on JavaScriptTouhou Project on JavaScript
Touhou Project on JavaScript
 
JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話
 
JS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームJS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲーム
 
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をするSlack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
 

Mithril - 軽量/高速なMVCフレームワーク

  • 1. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mithril - 軽量・高速な MVCフレームワーク 株式会社 DeNA Games Osaka 技術編成部 人西 聖樹 masaki.hitonishi@dena.com
  • 2. Copyright © DeNA Co.,Ltd. All Rights Reserved. 自己紹介  人西 聖樹(ひとにし まさき)  Twitter: @sairoutine  株式会社 DeNA Games Osaka  Webアプリケーションエンジニア  趣味事では、WebGL と Electron を使ってPCゲー ムを作るチャレンジをしています。
  • 3. Copyright © DeNA Co.,Ltd. All Rights Reserved. フロントエンド JavaScript フレームワーク
  • 4. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 5. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 6. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 7. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 8. Copyright © DeNA Co.,Ltd. All Rights Reserved. ところで皆さんに質問 JavaScript フレームワーク、 どれ使ったことあります?
  • 9. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 10. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mithril とは
  • 11. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mithril  フロントエンド MVCフレームワーク  仮想DOM  コンポーネントもサポート  ファイルサイズが小さい(バージョン0.2.5 時点で、約 20 KB)  APIが少ない(約23個。よく使う API は4つくらい)  最小ながらも Mithril だけで SPA が作れる程度には揃ってる  速い
  • 12. Copyright © DeNA Co.,Ltd. All Rights Reserved. 界隈における Mithril の位置づけ
  • 13. Copyright © DeNA Co.,Ltd. All Rights Reserved. 今学びたいJSフレームワークは? https://medium.com/@sachagreif/the-state-of-javascript-front-end-frameworks-1a2d8a61510 より引用
  • 14. Copyright © DeNA Co.,Ltd. All Rights Reserved. もう一度使いたいJSフレームワークは? https://medium.com/@sachagreif/the-state-of-javascript-front-end-frameworks-1a2d8a61510 より引用
  • 15. Copyright © DeNA Co.,Ltd. All Rights Reserved. その他に言及されているJSフレームワーク https://medium.com/@sachagreif/the-state-of-javascript-front-end-frameworks-1a2d8a61510 より引用 Mithril
  • 16. Copyright © DeNA Co.,Ltd. All Rights Reserved. MVC
  • 17. Copyright © DeNA Co.,Ltd. All Rights Reserved. MVC  Model(状態), View(表示), Controller (Model と View を管理する)  フレームワークとしてのサポートはないが、 ViewModel を追加して、MVVM (+ Controller) の設計にするとよりよい設計に。
  • 18. Copyright © DeNA Co.,Ltd. All Rights Reserved. Model  普通の JavaScript オブジェクト (Mithril フ レームワークにロックインしてない)  m.prop を使えば、getter-setter を生成で きる。  Web API から取得/へ保存するデータを主 に担当する
  • 19. Copyright © DeNA Co.,Ltd. All Rights Reserved. View  仮想DOM(後述)を返すJavaScriptの関数  Controller の保持する状態を参照できる  再描画が走るたびに呼ばれるので、重い処理 は View で行わず Controller で行う。
  • 20. Copyright © DeNA Co.,Ltd. All Rights Reserved. Controller  インスタンスを作る JavaScript の関数  各種クラスの初期化など  Controller が Model (or ViewModel)を持ち、 View は Controller を通して状態にアクセ スする感じになる
  • 21. Copyright © DeNA Co.,Ltd. All Rights Reserved. ViewModel  アプリケーションの状態を扱う。  永続化する状態は Model に、永続化しない 状態は ViewModel に直接持たせるような設 計をよく見る。  ここをシングルトンにしておくと、SPAで ページ遷移しても前のページの状態を残して おいたりできる。
  • 22. Copyright © DeNA Co.,Ltd. All Rights Reserved. Component  JavaScript のオブジェクト。 controller プ ロパティと、 view プロパティを持つ。  SPAにおいては 1ページ 1コンポーネント最 低必要。  コンポーネントの中で別のコンポーネントを 呼び出せる。  よって、 React のように再利用可能なコン ポーネントを作っておくと楽
  • 23. Copyright © DeNA Co.,Ltd. All Rights Reserved. 仮想DOM
  • 24. Copyright © DeNA Co.,Ltd. All Rights Reserved. HTML(実DOM)の変更はコストが高い  ツリー構造のDOMデータを走査していく  座標計算のやりなおし、CSSスタイルの再適 用 etc…
  • 25. Copyright © DeNA Co.,Ltd. All Rights Reserved. node.querySelector('.foo').innerHTML = ’aaa' しかし、こうしたコードは最終的に どういうHTMLが出力されるのか 追いにくい。 仮想DOMの出番! 今までは jQuery などで差分を 追加/変更/削除するコードを書いて、 極力 DOM の変更を抑えてきた
  • 26. Copyright © DeNA Co.,Ltd. All Rights Reserved. 仮想DOMだと <div class="modal-body"> <form> <div class="form-group"> <label>イベント名</label> <div class="form-control-static">{ model.name() }</div> </div> <div class="form-group"> <label>日時</label> <div class="form-control-static">{ model.start_date() }</div> </div> </form> </div> DOMのあるべき姿を書くだけで、 フレームワークが 状態の変更前と変更後を比較して 差分だけ書き換えてくれる。
  • 27. Copyright © DeNA Co.,Ltd. All Rights Reserved. 差分検知の仕組み  ソースコードにコメントがある * diff algorithm can be summarized as this: * * 1 - compare `data` and `cached` * 2 - if they are different, copy `data` to `cached` and update the M * based on what the difference is * 3 - recursively apply this algorithm for every array and for the * children of every virtual element
  • 28. Copyright © DeNA Co.,Ltd. All Rights Reserved. めっちゃ要約すると 1. 更新前の仮想DOMと更新後の仮想DOMを比 較する 2. 異なる場合は、異なる種類に応じて更新を する 3. 再帰的に子要素を辿っていって、上記のア ルゴリズムを適用していく ↓ めっちゃシンプルなアルゴリズム!
  • 29. Copyright © DeNA Co.,Ltd. All Rights Reserved. じゃあなんでこんな速いのか?
  • 30. Copyright © DeNA Co.,Ltd. All Rights Reserved. 再描画が走るタイミング  Mithril は再描画が走るタイミングを絞ることで、 圧倒的なパフォーマンスを発揮している。  m.module() か m.route() を使って コントローラ が初期化されたタイミング  イベントハンドラ(onclick等)が発生したタイミン グ  m.request(後述する http リクエスト)が完了した タイミング  m.redraw() を呼んで、明示的に再描画を呼んだタ イミング
  • 31. Copyright © DeNA Co.,Ltd. All Rights Reserved. 描画が走るタイミングの調整  1フレーム単位で何回再描画が呼びだされても、1 度しか再描画しない  Model が更新された際に view を再描画する仕組 みが Mithril にはない。  よって setInterval などで Model を更新しても、 view が更新されない罠にハマる。  m.redraw() を呼び出すと、次のフレーム更新タイ ミングで再描画する。  あるいは m.startComputation() と m.endComputation() で描画カウンタを増減させ ることで、再描画を行う。
  • 32. Copyright © DeNA Co.,Ltd. All Rights Reserved. msx
  • 33. Copyright © DeNA Co.,Ltd. All Rights Reserved. msx  React でいう jsx  仮想DOMは JS のデータなので、フレーム ワークに沿った書き方をしないといけない  いわゆる普通のHTMLで書いて、それを仮想 DOM の書き方に変換する
  • 34. Copyright © DeNA Co.,Ltd. All Rights Reserved. これが var todos = ctrl.list.map(function(task, index) { return <li className={task.completed() && 'completed'}> <div className="view"> <input className="toggle" type="checkbox" onclick={m.withAttr('checked', task.completed)} checked={task.completed()} /> <label>{task.title()}</label> <button className="destroy" onclick={ctrl.remove.bind(ctrl, index)}/> </div> <input className="edit"/> </li> })
  • 35. Copyright © DeNA Co.,Ltd. All Rights Reserved. こうなる var todos = ctrl.list.map(function(task, index) { return {tag: "li", attrs: {className:task.completed() && 'completed'}, children: [ {tag: "div", attrs: {className:"view"}, children: [ {tag: "input", attrs: { className:"toggle", type:"checkbox", onclick:m.withAttr('checked', task.completed), checked:task.completed()} }, {tag: "label", attrs: {}, children: [task.title()]}, {tag: "button", attrs: {className:"destroy", onclick:ctrl.remove.bind(ctrl, index)}} ]}, {tag: "input", attrs: {className:"edit"}} ]} })
  • 36. Copyright © DeNA Co.,Ltd. All Rights Reserved.  jsx はキショイ(javascript の中に 生の HTMLが混 ざってくる) と言われがち  個人的には、ejs や jade などのような、新手のテ ンプレートエンジンだと思えばそこまで気になら ない。  フロントエンドエンジニアが Model と Controller を書いて、マークアップエンジニアが View を書 く、みたいな役割分担もしやすい。
  • 37. Copyright © DeNA Co.,Ltd. All Rights Reserved. バインディング
  • 38. Copyright © DeNA Co.,Ltd. All Rights Reserved. モデルからビューへのバインディング  モデルの内容をビューに反映させる  再描画によって差分を検出し、value の中身の部分 のみ更新される  先述のように、setInterval などで Model を更新 した場合、明示的に再描画を呼び出す必要がある。 m("input", {value: ctrl.model.description()})
  • 39. Copyright © DeNA Co.,Ltd. All Rights Reserved. ビューからモデルへのバインディング  ビューにてユーザーが入力した内容をモデルに反 映する  m.withAttr を使う  onchange イベントによって ctrl.model.description を更新してくれる  やってることは下記と同じ m("input", {onchange: m.withAttr("value", ctrl.model.description)}) m("input", {onchange: function (e) { ctrl.model.description(e.currentTarget.value); })
  • 40. Copyright © DeNA Co.,Ltd. All Rights Reserved. http リクエスト  m.request を使って行う。  thennable (いわゆる Promise)  リクエストが完了するまで、再描画を待たせ てくれる。 User.listEven = function() { return m.request({method: "GET", url: "/user"}).then(function(list) { return list.filter(function(user) {return user.id % 2 == 0}); }) .catch(function(e) { throw e; }); }
  • 41. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mithril を選択することが有用な場合  サーバーサイドエンジニア 同じMVCなので学習しやすい Mithril 自体が1000行程度なので 最悪コードを読めばなんとかなる  最終的に捨てる選択肢を取る場合 あと2〜3年もすれば新しいメジャーな FWが登場する。 どうせ捨てるなら学習コストの低いものを
  • 42. Copyright © DeNA Co.,Ltd. All Rights Reserved. 公式サイト http://mithril-ja.js.org/
  • 43. Copyright © DeNA Co.,Ltd. All Rights Reserved. 日本語のオライリー本 Mithril――最速クライアントサイドMVC
  • 44. Copyright © DeNA Co.,Ltd. All Rights Reserved. ご清聴ありがとう ございました!