Mithril

Yoshiki Shibukawa
Yoshiki ShibukawaProgrammer at DeNA
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
meetup app tokyo@1
Web MVC+SPAフレームワーク
Mithril
2016/06/24
GDI 渋川よしき
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
お前だれよ?
 前職
⁃ 自動車会社の社内SE
 現職
⁃ 社内ゲームエンジン用のフレームワーク
(クライアント用もサーバ用も)作ったり、
開発支援ツール作ったりいわゆる社内SE
⁃ 最近はQt(C++)を毎日書いてます
渋川 よしき
 プログラミング
 C++とかPythonとかGolangとかJavaScriptとか
 本
 つまみぐい勉強法、アート・オブ・コミュニティ(翻訳)、
Mobageを支える技術、オブジェクト指向JavaScript(翻訳)、
ポモドーロ・テクニック入門(翻訳)、etc
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
昨年出しました!
 JavaScriptの、最速クライアント用MVCフレームワークの本です!
⁃ 速いのが好きな人や、変化が多いブラウザ周辺技術に疲れた人に
オススメ
⁃ 古くなってません!
 電子書籍のみです
 表紙は黒ムツの仲間
⁃ 南オセアニアの深海魚
⁃ 最大75cm
⁃ 確認された最高齢は
100歳を超えるとか
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
かんたん/Easy/Simpleについて
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
かんたん/Easy/Simpleについて
 かんたん/Easy/Simpleといった言葉がよく使われる
 ソフトウェアのライブラリ・フレームワーク・言語は特定の問題の解決
をしやすくするために作られる
→対象を限定すればどのソフトウェアも「かんたん」で説明できる
→つまり何も説明していないのと同じ
 例えば
⁃ Qt/Xamarin
• 1度GUI作成を学べば、同じ知識で他のOSのアプリも「かんたんに」作れる
⁃ Angular
• 束縛が強いため、レールに乗って「かんたんに」MVCアプリが作れる
⁃ Electron
• ブラウザの知識があれば「かんたんに」デスクトップアプリが作れる
⁃ C++
• ゼロオーバーヘッドでC言語よりも遅くないコードが「かんたんに」作れる
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
かんたん/Easy/Simpleについて
 かんたん/Easy/Simpleといった言葉がよく使われる
 ソフトウェアのライブラリ・フレームワーク・言語は特定の問題の解決
をしやすくするために作られる
→対象を限定すればどのソフトウェアも「かんたん」で説明できる
→つまり何も説明していないのと同じ
 例えば
⁃ Qt/Xamarin
• 1度GUI作成を学べば、同じ知識で他のOSのアプリも「かんたんに」作れる
⁃ Angular
• 束縛が強いため、レールに乗って「かんたんに」MVCアプリが作れる
⁃ Electron
• ブラウザの知識があれば「かんたんに」デスクトップアプリが作れる
⁃ C++
• ゼロオーバーヘッドでC言語よりも遅くないコードが「かんたんに」作れる
かんたん/Easy/Simpleは今日のNGワード
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilとは
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilとは
 ドキュメントの日本語翻訳あります!
 http://mithril-ja.js.org
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilの守備範囲
V-DOM
Router (SPA)
Component XHR
サーバへの通信コード含めて
Mithrilで完結
ビジュアル層は好きなCSS
フレームワーク等が利用可能
(ただしPolymerはChrome限定)
その他、既存のUIライブラリも
使える(jQuery UI系など)
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilのコア
 機能が絞りこまれたアトミックなWebのMVC+SPAフレームワーク
⁃ 他のライブラリに依存せずにアプリが作れる
• サーバ通信、非同期処理(promise)、モデル作成、SPAサポート(ラウター)
仮想DOM、コンポーネント
⁃ gzipされた状態で7.8KBほどの大きさ
• リファレンスに乗っている関数は16個ほど
• そのうちよく使うのは半分ぐらい?
• 本を書き始めてから1年以上、バグ修正等で更新は頻繁にあるが、
ほとんどAPIに変更がない
 内部では仮想DOMという仕組みを使っていて比較的高速
⁃ 詳細は「最速MVCフレームワークMithril.jsの速度の秘密」(Qiita)
⁃ 速度チューニングも可能だが、そこまで頑張る必要性が低い
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilアプリケーションの構造
実際に作ったアプリケーションを参考に紹介します。
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
 戦魂 –SENTAMA-
戦国時代がモチーフの戦略シミュレーションRPG
開発の目線での紹介はこちら
(http://www.slideshare.net/dena_study/unityrpg)にまとまって
います
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
戦魂チーム向けの運用改善
 マスターデータ運用は、昨年のFINAL FANTASY Record Keeperのマ
スターデータ運用改善で発表したのと同じ仕組みは導入済みだった
 スプレッドシートでは表現が難しく入力⇔確認に手間がかかるデータが
2つほどあったのでElectronを使って入力補助ツールを作成した
⁃ 戦場マップ
⁃ 列伝(キャンペーンモード)のオープニングシーケンス
 これらを題材に、Mithrilアプリケーションの構造を紹介します
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
できあがったもの
 今までのワークフローに手を入れることはなく入力高速化にフォーカス
⁃ Mithril同様、アトミックな部分に割りきって、費用対効果最大化
⁃ コピペ・ツールチェーン(後工程のスプレッドシートにコピペで
データを移せるように、整形した表を表示)
⁃ 試行錯誤の時間が増えて、よりユーザに楽しんでもらえる演出、
マップづくりに時間が使えるようになった
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilアプリケーションの基本設計 (1)
 HTMLの一部をMithrilの仮想DOM管理下にする
⁃ m.mount(): 1つのコンポーネントに描画を任せる
⁃ m.route(): 現在のURLに応じてコンポーネントを切り替える
 全部を仮想DOMにまかせてしまうのも可だが、ヘッダー、フッターな
ど変化しない部分は静的HTMLのままの方が楽
 複数パートに分割適用もできる(した)
m.route()
m.mount()
m.mount()
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
できあがった構造
main.js
application
context.js
script/index.j
s
script/
xxx page.js
script/
xxx page.js
script/
xxx page.js
script/viewm
odel.js
script/model
.jswindow
open
undo/redo
script/
canvasmap.js
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilアプリケーションの基本設計(2)
 コンポーネント、ビューモデル、モデルでアプリを組み立てる
⁃ コンポーネントはコントローラとビューで構成
• どちらも状態は持たない
• コンポーネントは入れ子にできる
⁃ ビューモデルは編集中のデータなど永続化しないデータ持つ
⁃ モデルは永続化するべき大事なデータを持つ
• VMとMの機能分けは規約でそうなっているだけでAPI上は1つにまとめるこ
とも不可能ではない
• それどころか、コントローラ==モデルにすることもAPI上は不可能ではな
いが、上記の規約に従う方がよい
• クラス継承等でコード的にルール強制されるわけではないので、自分で
Mithril Wayに従ってコードを整理しなければいけない点は要注意
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
戦場マップエディタのコンポーネント・ビュー(1)
 各ページのトップはコンポーネント
 よく使うマップ部分もコンポーネント化した
⁃ <canvas>タグをm()で作り、ビューのconfigから、
requestAnimationFrame()の再帰的呼び出しでcanvas更新
⁃ 引数でモード切り替え
• モードによって要素のフィルタリング・サイズ変更など
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
戦場マップエディタのコンポーネント・ビュー(2)
 ビューの一部に、仮想DOM以外のライブラリを併用することが可能
⁃ 既存のUI部品資産があれば、それを利用できる
 表はMITライセンス版のhandsontableを使用
⁃ ビューのconfigの機能を使って適用
⁃ 行・列のどちらの方向もExcelっぽく選択でき、コピペでExcelにそ
のまま貼れる
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
シングルページアプリケーションのサポート
 画面の完全リロードやリセットが起きなくなり、レスポンスがよくなる
 Mithrilの場合は、フルリロードの従来型ウェブアプリケーションも、
SPAにする場合も、コードは特に変わらないので対応しない理由はない
 URLのスタイルがいくつか選べる
 今回はデフォルトのまま利用
スタイル 例 デメリット
“search” (デフォルト) http://server/?/path/to/page history.pushStateがないIE8ではリフレッシュ
してしまう
“hash” http://server/#/path/to/page どのブラウザでもOKだが、名前付きアン
カーが使えなくなる
“pathname” http://server/path/to/page URLは一番きれいだが、サーバ側の設定が必
要
history.pushStateがないIE8ではリフレッシュ
してしまう
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
おまけ: Electron側の描画側ではない方のプロセス
 ブラウザ/レンダラプロセス間のインタラクションを疎にしつつ、普通
のデスクトップアプリの使い勝手を再現した
⁃ Electronのブラウザプロセス側のコードはモデルの履歴管理と、
ファイル入出力に特化する。
⁃ ブラウザがXHRでサーバ通信する代わりに、編集(モデル変更)時に
レンダラープロセスがJSONをブラウザプロセスに送る
⁃ ファイル読み込み、アンドゥ・リドゥ実行時にブラウザプロセスか
ら、今表示すべきモデルを
レンダラープロセスに送り、
Mithrilのモデルをリセット
⁃ 詳しくはQiitaの「Electron+
Mithrilで、ふつうのデスク
トップアプリを作る」参照
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ちなみに
 餃子声優 橘田いずみさん(@izugyoza)の餃子本
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilのアプリの構造と完全に一致
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
橘田いずみさんの餃子のコア
 アトミックな餃子フレームワーク
⁃ 限界まで絞りこまれたシンプルな材料
• 豚肉・青ネギ・生姜のみ
• ニンニクもニラも使わず、豚肉を混ぜるときは箸で行う
⁃ 夕食以外も安心して食べられる
⁃ 爪の手入れをしている女性にも優しそう
⁃ これに、各種野菜などをアドオンして餡を仕上げる
• 単に混ぜるだけなので、肉餡をたくさん作ってから小分けにして、一度に
数種類の餃子を仕上げることも可能
 高いポータビリティ
⁃ 肉餡の状態の状態でも保存ができるし、餃子にしても保存が可能
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
まとめ
 MithrilはアトミックなMVC+SPAフレームワーク
⁃ 関数の数が少なく、余計な機能がないため、APIの変更もほぼない
⁃ デスクトップGUI開発者も勉強になりますよ!
 CSSフレームワークは自由に切り替えられる
⁃ 僕のお気に入りはMaterial Design Lite (mithril-mdl)
⁃ ShadowDOMが来たらPolymerが・・・
 コンポーネントの分割、ビューモデル、モデルの責務分割が勝利の鍵
⁃ データの流れを整流
 既存のUIライブラリと一緒に使ったり、canvas
を組み込んだりもできます
 Electronと一緒に使うのも簡単
⁃ 社内ツールを作ってみた
 餃子と同じぐらいMithrilもいいよ
1 of 29

More Related Content

What's hot(20)

Unityで使える C# 6.0~と .NET 4.6Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6
信之 岩永21.3K views
UniRx - Reactive Extensions for UnityUniRx - Reactive Extensions for Unity
UniRx - Reactive Extensions for Unity
Yoshifumi Kawai68.7K views
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
Core Concept Technologies10.4K views
Bluetoothでgo!Bluetoothでgo!
Bluetoothでgo!
Kouji Matsui5.9K views
Introduction to JIT Compiler in JVMIntroduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVM
Koichi Sakata3.4K views

Viewers also liked(20)

Go & multi platform GUI Trials and ErrorsGo & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and Errors
Yoshiki Shibukawa5.4K views
Excelの話Excelの話
Excelの話
Yoshiki Shibukawa22.8K views
大規模JavaScript開発大規模JavaScript開発
大規模JavaScript開発
Yoshiki Shibukawa3.7K views
[C++ GUI Programming with Qt4] chap6[C++ GUI Programming with Qt4] chap6
[C++ GUI Programming with Qt4] chap6
Picker Weng1.3K views
Advanced file permissions in linuxAdvanced file permissions in linux
Advanced file permissions in linux
Mohit Singh1.7K views
TOSHIBAxGUGEN FlashAirハッカソン-FlashAirでなに作る?TOSHIBAxGUGEN FlashAirハッカソン-FlashAirでなに作る?
TOSHIBAxGUGEN FlashAirハッカソン-FlashAirでなに作る?
FlashAirデベロッパーズ22.2K views
File permission in linuxFile permission in linux
File permission in linux
Prakash Poudel4.6K views
Develop Android app using GolangDevelop Android app using Golang
Develop Android app using Golang
SeongJae Park37.2K views
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
Akihiko Horiuchi61K views

Similar to Mithril(20)

App Modernization for .NETApp Modernization for .NET
App Modernization for .NET
Yuta Matsumura171 views
2013 Ignite UI 最新情報 in 岡山2013 Ignite UI 最新情報 in 岡山
2013 Ignite UI 最新情報 in 岡山
インフラジスティックス・ジャパン株式会社1.3K views
Jslug2 nagoya-shibataJslug2 nagoya-shibata
Jslug2 nagoya-shibata
Naoki Shibata1.4K views
C++ AMPを使ってみようC++ AMPを使ってみよう
C++ AMPを使ってみよう
Osamu Masutani6.7K views
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation1.1K views
Windows 8時代のアプリ開発Windows 8時代のアプリ開発
Windows 8時代のアプリ開発
信之 岩永4K views
Essentials of containerEssentials of container
Essentials of container
Toru Makabe16.8K views

More from Yoshiki Shibukawa(20)

Oktavia Search Engine - pyconjp2014Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014
Yoshiki Shibukawa3.9K views
Xpjug基調lt2011Xpjug基調lt2011
Xpjug基調lt2011
Yoshiki Shibukawa2.9K views
Expert JavaScript ProgrammingExpert JavaScript Programming
Expert JavaScript Programming
Yoshiki Shibukawa2K views
JavaScriptゲーム制作勉強会JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会
Yoshiki Shibukawa2.6K views
Pomodoro techniquePomodoro technique
Pomodoro technique
Yoshiki Shibukawa1.3K views
Bitbucket&mercurialBitbucket&mercurial
Bitbucket&mercurial
Yoshiki Shibukawa2.4K views
つまみぐい勉強法。その後。つまみぐい勉強法。その後。
つまみぐい勉強法。その後。
Yoshiki Shibukawa1.3K views
Erlang and I and Sphinx.Erlang and I and Sphinx.
Erlang and I and Sphinx.
Yoshiki Shibukawa1.9K views
Sphinx Tutorial at BPStudy#30Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30
Yoshiki Shibukawa2.3K views
1日~1週間でOSSに貢献する方法1日~1週間でOSSに貢献する方法
1日~1週間でOSSに貢献する方法
Yoshiki Shibukawa1.6K views
儲かるドキュメント儲かるドキュメント
儲かるドキュメント
Yoshiki Shibukawa2.3K views
Chashitsu And PatternChashitsu And Pattern
Chashitsu And Pattern
Yoshiki Shibukawa908 views
EUnit in Practice(Japanese)EUnit in Practice(Japanese)
EUnit in Practice(Japanese)
Yoshiki Shibukawa1.5K views
Django_and_GTDDjango_and_GTD
Django_and_GTD
Yoshiki Shibukawa2.5K views
FortranからPythonへFortranからPythonへ
FortranからPythonへ
Yoshiki Shibukawa2.6K views
GTD+DGTD+D
GTD+D
Yoshiki Shibukawa1.2K views
小悪魔エンジニア小悪魔エンジニア
小悪魔エンジニア
Yoshiki Shibukawa1.3K views

Mithril

  • 1. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. meetup app tokyo@1 Web MVC+SPAフレームワーク Mithril 2016/06/24 GDI 渋川よしき
  • 2. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. お前だれよ?  前職 ⁃ 自動車会社の社内SE  現職 ⁃ 社内ゲームエンジン用のフレームワーク (クライアント用もサーバ用も)作ったり、 開発支援ツール作ったりいわゆる社内SE ⁃ 最近はQt(C++)を毎日書いてます 渋川 よしき  プログラミング  C++とかPythonとかGolangとかJavaScriptとか  本  つまみぐい勉強法、アート・オブ・コミュニティ(翻訳)、 Mobageを支える技術、オブジェクト指向JavaScript(翻訳)、 ポモドーロ・テクニック入門(翻訳)、etc
  • 3. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 昨年出しました!  JavaScriptの、最速クライアント用MVCフレームワークの本です! ⁃ 速いのが好きな人や、変化が多いブラウザ周辺技術に疲れた人に オススメ ⁃ 古くなってません!  電子書籍のみです  表紙は黒ムツの仲間 ⁃ 南オセアニアの深海魚 ⁃ 最大75cm ⁃ 確認された最高齢は 100歳を超えるとか
  • 4. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. かんたん/Easy/Simpleについて
  • 5. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. かんたん/Easy/Simpleについて  かんたん/Easy/Simpleといった言葉がよく使われる  ソフトウェアのライブラリ・フレームワーク・言語は特定の問題の解決 をしやすくするために作られる →対象を限定すればどのソフトウェアも「かんたん」で説明できる →つまり何も説明していないのと同じ  例えば ⁃ Qt/Xamarin • 1度GUI作成を学べば、同じ知識で他のOSのアプリも「かんたんに」作れる ⁃ Angular • 束縛が強いため、レールに乗って「かんたんに」MVCアプリが作れる ⁃ Electron • ブラウザの知識があれば「かんたんに」デスクトップアプリが作れる ⁃ C++ • ゼロオーバーヘッドでC言語よりも遅くないコードが「かんたんに」作れる
  • 6. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. かんたん/Easy/Simpleについて  かんたん/Easy/Simpleといった言葉がよく使われる  ソフトウェアのライブラリ・フレームワーク・言語は特定の問題の解決 をしやすくするために作られる →対象を限定すればどのソフトウェアも「かんたん」で説明できる →つまり何も説明していないのと同じ  例えば ⁃ Qt/Xamarin • 1度GUI作成を学べば、同じ知識で他のOSのアプリも「かんたんに」作れる ⁃ Angular • 束縛が強いため、レールに乗って「かんたんに」MVCアプリが作れる ⁃ Electron • ブラウザの知識があれば「かんたんに」デスクトップアプリが作れる ⁃ C++ • ゼロオーバーヘッドでC言語よりも遅くないコードが「かんたんに」作れる かんたん/Easy/Simpleは今日のNGワード
  • 7. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilとは
  • 8. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilとは  ドキュメントの日本語翻訳あります!  http://mithril-ja.js.org
  • 9. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilの守備範囲 V-DOM Router (SPA) Component XHR サーバへの通信コード含めて Mithrilで完結 ビジュアル層は好きなCSS フレームワーク等が利用可能 (ただしPolymerはChrome限定) その他、既存のUIライブラリも 使える(jQuery UI系など)
  • 10. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilのコア  機能が絞りこまれたアトミックなWebのMVC+SPAフレームワーク ⁃ 他のライブラリに依存せずにアプリが作れる • サーバ通信、非同期処理(promise)、モデル作成、SPAサポート(ラウター) 仮想DOM、コンポーネント ⁃ gzipされた状態で7.8KBほどの大きさ • リファレンスに乗っている関数は16個ほど • そのうちよく使うのは半分ぐらい? • 本を書き始めてから1年以上、バグ修正等で更新は頻繁にあるが、 ほとんどAPIに変更がない  内部では仮想DOMという仕組みを使っていて比較的高速 ⁃ 詳細は「最速MVCフレームワークMithril.jsの速度の秘密」(Qiita) ⁃ 速度チューニングも可能だが、そこまで頑張る必要性が低い
  • 11. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 12. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilアプリケーションの構造 実際に作ったアプリケーションを参考に紹介します。
  • 13. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 14. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.  戦魂 –SENTAMA- 戦国時代がモチーフの戦略シミュレーションRPG 開発の目線での紹介はこちら (http://www.slideshare.net/dena_study/unityrpg)にまとまって います
  • 15. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 戦魂チーム向けの運用改善  マスターデータ運用は、昨年のFINAL FANTASY Record Keeperのマ スターデータ運用改善で発表したのと同じ仕組みは導入済みだった  スプレッドシートでは表現が難しく入力⇔確認に手間がかかるデータが 2つほどあったのでElectronを使って入力補助ツールを作成した ⁃ 戦場マップ ⁃ 列伝(キャンペーンモード)のオープニングシーケンス  これらを題材に、Mithrilアプリケーションの構造を紹介します
  • 16. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. できあがったもの  今までのワークフローに手を入れることはなく入力高速化にフォーカス ⁃ Mithril同様、アトミックな部分に割りきって、費用対効果最大化 ⁃ コピペ・ツールチェーン(後工程のスプレッドシートにコピペで データを移せるように、整形した表を表示) ⁃ 試行錯誤の時間が増えて、よりユーザに楽しんでもらえる演出、 マップづくりに時間が使えるようになった
  • 17. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilアプリケーションの基本設計 (1)  HTMLの一部をMithrilの仮想DOM管理下にする ⁃ m.mount(): 1つのコンポーネントに描画を任せる ⁃ m.route(): 現在のURLに応じてコンポーネントを切り替える  全部を仮想DOMにまかせてしまうのも可だが、ヘッダー、フッターな ど変化しない部分は静的HTMLのままの方が楽  複数パートに分割適用もできる(した) m.route() m.mount() m.mount()
  • 18. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. できあがった構造 main.js application context.js script/index.j s script/ xxx page.js script/ xxx page.js script/ xxx page.js script/viewm odel.js script/model .jswindow open undo/redo script/ canvasmap.js
  • 19. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilアプリケーションの基本設計(2)  コンポーネント、ビューモデル、モデルでアプリを組み立てる ⁃ コンポーネントはコントローラとビューで構成 • どちらも状態は持たない • コンポーネントは入れ子にできる ⁃ ビューモデルは編集中のデータなど永続化しないデータ持つ ⁃ モデルは永続化するべき大事なデータを持つ • VMとMの機能分けは規約でそうなっているだけでAPI上は1つにまとめるこ とも不可能ではない • それどころか、コントローラ==モデルにすることもAPI上は不可能ではな いが、上記の規約に従う方がよい • クラス継承等でコード的にルール強制されるわけではないので、自分で Mithril Wayに従ってコードを整理しなければいけない点は要注意
  • 20. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 戦場マップエディタのコンポーネント・ビュー(1)  各ページのトップはコンポーネント  よく使うマップ部分もコンポーネント化した ⁃ <canvas>タグをm()で作り、ビューのconfigから、 requestAnimationFrame()の再帰的呼び出しでcanvas更新 ⁃ 引数でモード切り替え • モードによって要素のフィルタリング・サイズ変更など
  • 21. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 戦場マップエディタのコンポーネント・ビュー(2)  ビューの一部に、仮想DOM以外のライブラリを併用することが可能 ⁃ 既存のUI部品資産があれば、それを利用できる  表はMITライセンス版のhandsontableを使用 ⁃ ビューのconfigの機能を使って適用 ⁃ 行・列のどちらの方向もExcelっぽく選択でき、コピペでExcelにそ のまま貼れる
  • 22. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. シングルページアプリケーションのサポート  画面の完全リロードやリセットが起きなくなり、レスポンスがよくなる  Mithrilの場合は、フルリロードの従来型ウェブアプリケーションも、 SPAにする場合も、コードは特に変わらないので対応しない理由はない  URLのスタイルがいくつか選べる  今回はデフォルトのまま利用 スタイル 例 デメリット “search” (デフォルト) http://server/?/path/to/page history.pushStateがないIE8ではリフレッシュ してしまう “hash” http://server/#/path/to/page どのブラウザでもOKだが、名前付きアン カーが使えなくなる “pathname” http://server/path/to/page URLは一番きれいだが、サーバ側の設定が必 要 history.pushStateがないIE8ではリフレッシュ してしまう
  • 23. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. おまけ: Electron側の描画側ではない方のプロセス  ブラウザ/レンダラプロセス間のインタラクションを疎にしつつ、普通 のデスクトップアプリの使い勝手を再現した ⁃ Electronのブラウザプロセス側のコードはモデルの履歴管理と、 ファイル入出力に特化する。 ⁃ ブラウザがXHRでサーバ通信する代わりに、編集(モデル変更)時に レンダラープロセスがJSONをブラウザプロセスに送る ⁃ ファイル読み込み、アンドゥ・リドゥ実行時にブラウザプロセスか ら、今表示すべきモデルを レンダラープロセスに送り、 Mithrilのモデルをリセット ⁃ 詳しくはQiitaの「Electron+ Mithrilで、ふつうのデスク トップアプリを作る」参照
  • 24. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ちなみに  餃子声優 橘田いずみさん(@izugyoza)の餃子本
  • 25. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 26. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 27. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilのアプリの構造と完全に一致
  • 28. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 橘田いずみさんの餃子のコア  アトミックな餃子フレームワーク ⁃ 限界まで絞りこまれたシンプルな材料 • 豚肉・青ネギ・生姜のみ • ニンニクもニラも使わず、豚肉を混ぜるときは箸で行う ⁃ 夕食以外も安心して食べられる ⁃ 爪の手入れをしている女性にも優しそう ⁃ これに、各種野菜などをアドオンして餡を仕上げる • 単に混ぜるだけなので、肉餡をたくさん作ってから小分けにして、一度に 数種類の餃子を仕上げることも可能  高いポータビリティ ⁃ 肉餡の状態の状態でも保存ができるし、餃子にしても保存が可能
  • 29. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. まとめ  MithrilはアトミックなMVC+SPAフレームワーク ⁃ 関数の数が少なく、余計な機能がないため、APIの変更もほぼない ⁃ デスクトップGUI開発者も勉強になりますよ!  CSSフレームワークは自由に切り替えられる ⁃ 僕のお気に入りはMaterial Design Lite (mithril-mdl) ⁃ ShadowDOMが来たらPolymerが・・・  コンポーネントの分割、ビューモデル、モデルの責務分割が勝利の鍵 ⁃ データの流れを整流  既存のUIライブラリと一緒に使ったり、canvas を組み込んだりもできます  Electronと一緒に使うのも簡単 ⁃ 社内ツールを作ってみた  餃子と同じぐらいMithrilもいいよ