angularとonsen uiで作る最高のhtml5ハイブリッドアプリ

90
Angularと Onsen UIで作る 最高のHTML5 ハイブリッドアプリ ng-japan 2015年3月21日 アシアル株式会社 久保田光則

Post on 15-Jul-2015

20.734 views

Category:

Software


0 download

TRANSCRIPT

Page 1: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Angularと Onsen UIで作る 最高のHTML5 ハイブリッドアプリ

ng-japan 2015年3月21日 アシアル株式会社 久保田光則

Page 2: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

久保田光則

- @anatoo - アシアル株式会社所属 - UI/UXデザイナー兼ソフトウェアエンジニア

- Onsen UIリード開発者

Page 3: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

好評発売中!

- 最近になって韓国語版も翻訳出版されます

Page 4: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

話すこと

Onsen UIテーマ:

Page 5: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

http://onsen.io

Page 6: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Onsen UI

- HTML5ハイブリッドアプリ用のUIフレームワーク - Angularをベースにしています - iOS, Androidをサポートしています - 高速な動作性がウリです - なんてことを説明しててもつまらないですよね。

Page 7: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

本当に話すこと

- HTML5ハイブリッドアプリとは?

- ハイブリッドアプリ開発にどんな問題があるのか?

- なぜAngularとOnsen UIが必要なのか?

- 少しだけOnsen UIの紹介

Page 8: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

HTML5ハイブリッドアプリとは

Page 9: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ネイティブアプリ

- Objective-CやJavaなど、そのOSの流儀で実装 - いわゆる普通のアプリ

Java or

Objective-CJava

or Objective-C

アプリ

Page 10: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ウェブアプリ

- ブラウザで動作する - 要するにただのウェブページ

Page 11: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

HTML5ハイブリッドアプリ

- アプリとして動作 - 内部の実装にHTML5をつかっている

アプリ

ネイティブ層

HTML5

Page 12: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

仕組み

アプリ

HTML

読み込み

WebView

Page 13: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

HTML5ハイブリッドアプリの 何が良いのか?

Page 14: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

クロスプラットフォーム性

Android iOS

Page 15: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ウェブの知識が活かせる

Page 16: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ストアでの配布

- 外見は普通のアプリなので、ストアで配布可能

Page 17: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ネイティブの機能の呼び出し

Android / iOS

OS API

Page 18: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Cordovaについて

- ハイブリッドアプリ用フレームワーク - 昔はPhoneGapという名前だった

http://cordova.apache.org

Page 19: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Cordovaがやってくれること

- HTML5をアプリ内部にパッケージ化 - OSとのAPIのやり取りを一本化

Page 20: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Cordovaの提供するプラグイン

‣ さらにCordovaプラグインの仕組みを使えばこれ以外のことも可能

ファイルストレージ、カメラ、コンパス 加速度センサー、コンタクトリスト、 位置情報取得、ネットワーク、Bluetooth通信、 Androidのインテント、アプリ内ブラウザ、 GPS、NFC、etc…

Page 21: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

「HTML5でモバイルアプリが作れるんですね、やったー」

Page 22: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

こうして数多くのフロントエンド開発者が

HTML5ハイブリッドアプリに

取り組んでいくことになった…

Page 23: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

結果

- 数年程度前の出来事 - いったいなにが起こった?

Page 24: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

最も有名な失敗例

「HTML5に賭けたのは失敗」Facebook ザッカーバーグCEO

- HTML5で記述したfacebookアプリをネイティブで書きなおす

2012年9月11日 TechCrunch Disrupt SF 2012より

Page 25: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

数年前に比べて現在状況は 好転してきた

- 端末スペックの向上 - CPU、メモリ共に一昔前のノートPCとほぼ同じに

- AndroidでのWebViewのChromiumの採用 - 利用できるHTML5 APIの増加 - Android2.3系のシェアの低下 - CrossWalkの登場 - Android5からのAndroid System WebViewの導入 - HTML5ハイブリッドアプリの事例の増加 - BYODの一般化により

Page 26: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

好転を表すシグナル

- Rails作者のDHHによるHTML5ハイブリッドアプリ評

Page 27: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

しかしそれでも

- HTML5ハイブリッドアプリは遅い!

- ネイティブに比べると 使い物にならない!

- 昔の体験が・・・

画像出典: ヒストリエ

Page 28: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

問題

Page 29: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

直接の問題

- パフォーマンスや安定性が悪い - UIコンポーネントをいちいち作らないといけない

Page 30: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

パフォーマンスに関する答え

チューニングすればいいじゃん!

Page 31: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- 今ではハイブリッドアプリは十分速く動作する

- だから勝手にチューニングすればいい、と思ってた

Page 32: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

得られた知見

- フロントエンド開発者の多くは、HTML・CSS・JSの書き方だけしかわかっていないことがわかった

Page 33: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- 多くの開発者はより素早く描画するためのチューニング方法を知らない

Page 34: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

レンダリングの仕組み

Page 35: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

効率的なチューニング

- まずは、どこがボトルネックになっているのかを知る - インスペクタのTimelineタブで計測 - AndroidではChrome、iOSではSafariのインスペクタを利用

Page 36: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- インスペクタのTimelineタブで計測 - AndroidではChrome、iOSではSafariのインスペクタを利用

Page 37: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

インスペクタのTimelineタブで取れるカテゴリ

Loading

Scripting

Rendering

Painting} 1frame

描画が始まって終わるまでが1frame これを16ms以下に抑えれば最高

Page 38: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ボトルネックがどこにあるかでチューニングもまた変わってくる

Page 39: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

1. Loading

- リソースの読み込みやパース - ハイブリッドアプリではウェブアプリよりもここが消費する時間は短い - リソースがローカルにすでにあるから

Page 40: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

2. Scripting

- JavaScriptの実行時間 - 純粋な計算は速い。基本的に問題にならない。 - ただし、canvasへの描画やディスクI/Oが発生したりリフローを同期的に強制するコードなどは遅い

Page 41: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Scriptingがボトルネックだったら?

- 話は簡単 - Profilesタブでさらにどのコードが重いのかを見る

Page 42: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- Bottom UpのSelf欄が重要

Page 43: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

3. Rendering

- Rendering - レイアウト処理

- Recalculate Style - 要素に当たるCSSルールの計算 - Layout - Render Treeの生成

Page 44: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Recalculate Style - 要素のスタイルの計算

- 個別のDOM要素に対して、当たるスタイルを計算する

- CSS OMを参照して、DOM要素の数 x CSSルールの数分マッチング処理が走る - 重たいCSSの書き方を減らす - 使っていないCSSのルールは消す

Page 45: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Layout - RenderTreeの生成

- 全てのDOMのレイアウト情報を計算 - 計算された結果の視覚的なオブジェクトのツリーがRenderTree

Page 46: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

4. Painting

- Painting - 描画処理 - Paint - Display List(ChromiumだとSkiaへの命令)の生成

- Rasterize - Display Listの実行してピクセル化 - Composite Layers - レイヤの合成

Page 47: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

雑多なチューニングテクニック小話

Page 48: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

translate3d(0, 0, 0)が速いのはなぜ?

- GPUで描画されるから?

- 半分正解だが半分間違っている - transform CSSプロパティを変更しても、Composite Layersのみが起こるから

- つまり、同時に別処理でLayoutを引き起こしたりすると台無し

Page 49: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

どのCSSプロパティを変更すると何が起こる?

- 要素の大きさが変わるような場合Layoutから処理が始まる

- transformやopacityだとComposite Layersのみ走る - CSSプロパティによって変更で何が起こるか違う

- 詳しくはCSS Triggersでググるんだ!

Page 50: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

DOMリークを防ぐ

- DOM要素が誤って参照されたまま開放されない - 見た目よりも深刻

- detached DOMツリーとそれに参照されているリソースが全てリークする

- iOS, Androidだとメモリスワッピングが弱く設計されている

Page 51: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

reflowを起こさないようにする

- 画像のサイズは必ず指定する - 一度DOMツリーから切り離して操作する - offsetHeightやgetBoundingClientRect()を呼び出しつつstyleを変更するみたいなコードをループで書くと地獄

Page 52: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

GPUバウンド

- CPUよりもGPUの方で時間がかかっている状態 - Rasterize後にテクスチャとしてGPUのVRAMに転送 - Composite Layers

- GPUへの転送や合成がCPU時間よりも時間がかかっていればGPUバウンド

Page 53: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

GPUバウンドなページを作る

- 大きな領域を持つ要素にtransform: translate3d(0, 0, 0)を当ててたくさん生成してアニメーションさせる

- Rasterize時にGPUにテクスチャとして転送される - 転送や合成に時間がかかるようになる - GPUのVRAMへのbandwidthが分かれば転送にかかる時間の理論値が割り出せる

Page 54: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

省略

- スライドが150ページ超えそうなので省略。

Page 55: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

チューニングの罠

Page 56: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ただし

- こういったチューニングの大部分はレンダリングエンジンの実装に依存している

- どうしてもわからない時はWebKitやChromiumのコードを読むしか無い

Page 57: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ふと我に帰る瞬間

- なぜ単にHTML5でアプリ書きたいだけなのに私はChromiumのコードを読んでいるのか?

- なぜ単にCSS書いてるだけなのに私はGPUのVRAMへの転送速度を気にしなければならないのか?

Page 58: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- ここまでチューニングする余裕がアプリ開発中にあるのだろうか?

- こういったチューニングを全て把握することを全ての開発者に求めて良いのだろうか?

否!!

Page 59: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

何かがおかしい

- ごく一部の人間でないと高速なHTML5ハイブリッドアプリは開発できないのだろうか?

- ユーザがアプリの構築そのものにフォーカスできないのだろうか?

Page 60: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ハイブリッドアプリ開発から見た 今のHTML5の課題

- アプリケーションアーキテクチャの構築方法の不在 - チューニングされて高速に動作するUI基盤が無い

?

Page 61: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

iOS

UIKit

アプリ

Objective-C/Swift

Android

View System

アプリ

Java

iOSアプリ Androidアプリ

Page 62: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ネイティブだとUIフレームワークがある

- そのOSに必要なUIが全て揃っている - 開発者はUIフレームワークが裏で何をやっているか気にしなくても良い

- すぐにアプリを開発し始められる

- これに対してHTML5ハイブリッドアプリでは?

Page 63: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

WebView&Cordova

!

アプリ

iOS/Android

HTML5ハイブリッドアプリ

Page 64: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- アプリの開発者が何もかも考えなければならない!

リストビューはどうやって実装すれば?

画面遷移の管理はどうすれば?

ジェスチャを扱うにはどうすれば良い?

MVCフレームワークには何を使おう?

アプリが遅いけどチューニングってどうやるの? CSSは最初から書いていく?

iOSのSwitchってどうやって実装するの?

viewportの設定ってどうやればいいの?

DOMの数が巨大になるとどれぐらい重くなるんだろう?

Bootstrapって使っていいのかな?

リストビューはどうやって実装すれば?

CSSの設計規約って何がいいのかな?fpsはどれぐらいを目標にすればいいんだろう?

描画の速度ってCIやテストで回せるっけ?

Page 65: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

無いもの

- 使うだけで高速に描画されるUIキット - アプリケーションアーキテクチャを形作るもの

Page 66: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Onsen UI

Page 67: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- 開発者が、アプリの開発そのものにフォーカスできるようにする。

Page 68: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Angularをベースにして構築

- HTMLを拡張して、アプリも記述可能にしてくれる - 大規模なアプリでも耐えられるアーキテクチャ

- DIコンテナ、サービス、コントローラ、フィルタ等

Page 69: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Custom Elements

- HTMLを記述するだけでUIを構築できる

<ons-page class=“first-page”> <ons-toolbar>

<div class=“center”>Toolbar Title</div> </ons-toolbar> <div>

<p>Page Contents</p> <ons-button ng-click=“foo()”>

MyButton </ons-button>

</div> </ons-page>

Page 70: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

CSSによるテーマ

- Adobeの超高速CSSフレームワークtopcoatをベースに構築 - CSSメタ言語にStylusを利用 - 設計規約はBEMを採用

Page 71: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

http://components.onsen.io/

- ウェブ上で簡単に色をカスタマイズできるテーマローラも完備

Page 72: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Onsen UIのコンポーネント群

- チューニングにより高速に動作

Page 73: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ons-navigator

- 画面遷移と遷移アニメーションを管理する

<ons-navigator class=“first-page”> <ons-toolbar>

<div class=“center”>Toolbar Title</div> </ons-toolbar> <div>

<p>Page Contents</p> <ons-button ng-click=“foo()”>

MyButton </ons-button>

</div> </ons-navigator>

Page 74: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- ページをスタックで管理する - 画面遷移を司るコンポーネント

page1.html

page2.html

page1.htmlpushPage() popPage()

page1.html

Page 75: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ons-pull-hook

- いわゆるpull-to-refreshを実装できるコンポーネント

<ons-page> <ons-pull-hook ng-action="load($done)"> Pull to refresh </ons-pull-hook> <ons-list> ... </ons-list> </ons-page>

Page 76: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- pull-to-refreshの例

Page 77: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ons-lazy-repeat

- 数千数万のDOM要素のライフサイクルを管理 - いわゆる無限リストが簡単に実装できる

<ul> <li ons-lazy-repeat=“lazyRepeatDelegate”> … </li> </ul>

Page 78: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- 画面に必要な分だけ表示するので高速 - AndroidやiOSのリストビューと同等のことが可能

隠れたら アンロード

表示しそうなら ロード

Page 79: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ons-sliding-menu要素

- スライディングメニュー、ドロワーメニューを表現

Page 80: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ons-alert-dialog要素

- HTMLで表現されたアラートダイアログ

Page 81: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ons-popover要素

- 吹き出しを表現するコンポーネント

Page 82: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ons-carousel要素

- 置くだけでカルーセルのUIを表現

Page 83: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Onsen UIが目指すもの

Page 84: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- だれでもHTML5で高速に動作するモバイルアプリを作ることができる世界

Page 85: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- UIをどのようにチューニングするか、ではなくアプリの本質的機能の開発にフォーカスするための基盤

Page 86: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

Onsen UI 2.0

Page 87: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

- Material Designsサポート

- Angular2サポート

Page 88: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

最後に

Page 89: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

開発者募集

- アシアル株式会社では一緒にOnsen UIを開発してくれるエンジニアを募集しています

Page 90: AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

ご清聴ありがとうございました