Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
僕たちとHTML5の2500日~Cacoo 脱Flashへの道 / 2500 days Cac...
Search
株式会社ヌーラボ
PRO
October 03, 2017
Technology
2
2.3k
僕たちとHTML5の2500日~Cacoo 脱Flashへの道 / 2500 days Cacoo and HTML5
2017年10月3日にヌーラボ東京オフィスで開催した「Geeks Who Drink in Tokyo - HTML5 Edition -」の登壇資料です。
株式会社ヌーラボ
PRO
October 03, 2017
Tweet
Share
More Decks by 株式会社ヌーラボ
See All by 株式会社ヌーラボ
ヌーラボ‧ウェブサイト課の ⼀年間の取り組みをふり返る
nulabinc
PRO
1
730
今からでも入れる re:Inventがあるんですか!?
nulabinc
PRO
0
280
ライティングチームだからこそできた、「どことでも繋がれるチーム」づくりの結果 / Technical Writing Meetup vol.38
nulabinc
PRO
0
45
4つの基本的な組織形態を知る ~ミンツバーグの組織論 7つの類型と力学、そしてその先へ~ より GWD in Nagoya
nulabinc
PRO
2
130
必要なのは客観性。組織変革をもたらす、より良い「対話」を生み出すための活動 #scrummikawa
nulabinc
PRO
3
1.1k
悪い実装例から学ぶ ウェブアクセシビリティ改善のヒント
nulabinc
PRO
1
600
ヌーラボカスタマーサクセスチームのBacklog活用
nulabinc
PRO
0
310
言葉で「ヌーラボらしさ」をどう届ける? グローバルチームでコラボレーションする大切さ
nulabinc
PRO
1
110
タスクの可視化は争いをなくす!? 夏休みを乗り切る 宿題プロジェクトマネジメント
nulabinc
PRO
2
280
Other Decks in Technology
See All in Technology
非機能品質を作り込むための実践アーキテクチャ
knih
5
1.5k
NilAway による静的解析で「10 億ドル」を節約する #kyotogo / Kyoto Go 56th
ytaka23
3
380
複雑性の高いオブジェクト編集に向き合う: プラガブルなReactフォーム設計
righttouch
PRO
0
120
普通のエンジニアがLaravelコアチームメンバーになるまで
avosalmon
0
110
AWS re:Invent 2024で発表された コードを書く開発者向け機能について
maruto
0
200
LINE Developersプロダクト(LIFF/LINE Login)におけるフロントエンド開発
lycorptech_jp
PRO
0
120
Google Cloud で始める Cloud Run 〜AWSとの比較と実例デモで解説〜
risatube
PRO
0
110
社外コミュニティで学び社内に活かす共に学ぶプロジェクトの実践/backlogworld2024
nishiuma
0
270
フロントエンド設計にモブ設計を導入してみた / 20241212_cloudsign_TechFrontMeetup
bengo4com
0
1.9k
統計データで2024年の クラウド・インフラ動向を眺める
ysknsid25
2
850
OpenAIの蒸留機能(Model Distillation)を使用して運用中のLLMのコストを削減する取り組み
pharma_x_tech
4
560
ガバメントクラウドのセキュリティ対策事例について
fujisawaryohei
0
560
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Designing for humans not robots
tammielis
250
25k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
How GitHub (no longer) Works
holman
311
140k
Building Your Own Lightsaber
phodgson
103
6.1k
GitHub's CSS Performance
jonrohan
1030
460k
A Tale of Four Properties
chriscoyier
157
23k
Transcript
僕たちとHTML5の2500日 ∼Cacoo 脱Flashへの道∼
自己紹介 川端 慧 ・2016 年12 月株式会社ヌーラボ入社 ・Cacoo のHTML5 版を開発中のフロントエンジニア ・最近パパになりました
国広 輝夫 ・2016 年9 月株式会社ヌーラボ入社 ・オンライン作図ツールのCacoo のHTML5 版を開発しています ・フロントエンドの開発に携わることが多く、JS に慣れ親しんで います
What's Cacoo? ・Cacoo はオンライン作図ツール ・コンセプト “ ビジュアルコラボレーション” ・世界中で使われている (270 万ユーザ)
・最近、Flash 版からHTML5 版へ移植しました!
年表 2015 年 2010 年 Cacoo の前身 をJS で作る 11
月 Flash 版 リリース 2006 年 2009 年 2013 年 2008 年 100 万ユーザ突破 Flash での開発を 始める 11 月 HTML5 移行の 調査開始 春頃 HTML5 移行へ 調査再開 150 万ユーザ突破 2016 年 6 月 ブログにて脱Flash 宣言 4 月 本格的にHTML5 版の開発を開始 200 万ユーザ突破 2017 年 8 月28 日 HTML5 版リリース 3 月 社内ベータ開始 7 月 Flash 終焉のアナウンス
Cacoo のはじまり ・Backlog のwiki 的な作図ツールを作りたかった ・2006 年 前身となるアプリをJavaScript で開発 ・単純なdiv
のみ描画するアプリ ・2008 年 Flash で開発を始める ・「Java 感覚で書ける」「描画プログラムを書きやすい」 ・2009 年 11 月Flash 版 Cacoo リリース
HTML5 化への第一歩 ・Flash 版リリース当時からFlash 排斥の風潮 ・リリース後すぐHTML5 化に着手 → 技術調査開始のチケットが切られる →
これが2010 年11 月4 日 だったのだが… !
凍結するHTML5 化プロジェクト ・サービスの成長にフォーカス ・Flash 版の追加開発を優先させるためプロジェクト凍結へ ・その間もグローバルに成長していくサービス ・2013 年 100 万ユーザ
突破 ・2015 年 150 万ユーザ 突破 ・2016 年 200 万ユーザ 突破
プロジェクトの再開 ・2015 年 春頃からHTML5 化へ向けた調査を開始 ・描画API の調査 SVG / Canvas
/ webGL ? ・データフォーマット AMF / JSON / messagepack ? ・動作保証ブラウザの調査 (IE までサポートするのか?) ・ライブラリ選定 ・2016 年 4 月 本格的に開発を開始
2016 年6 月 脱Flash 宣言 開発は進む… !
社内ベータ ・2017 年 3 月頃 社内ベータ開始 ・HTML5 で作った図が一瞬で吹き飛んだりした ・ブラウザ個別の挙動の違いや、非同期処理、同時編集やタイミング 依存のバグなど再現困難な問題に対処
・「なんか動かなくなった」に苦しむ ・全力でブラッシュアップする日々 そして… !
2017 年7 月 Flash player の終焉が告げられる
歓喜の瞬間 ・2017 年8 月28 日 リリース ・HTML5 化のissue が最初に切られた2010 年11
月4 日から2500 日が経 っていた
歓喜の瞬間の裏では… ・ブラウザ間のサポート状況の差異 ・描画API の調査 (SVG or Canvas webGL) ・データフォーマットの調査 (JSON
or messagepack) ・indexedDB の採用 ・作画ツールならではの難しさ ・エラーログの収集によるバグ検知 ・ライブラリの話
IE をサポートしない決断 ・SVG 上でのテキスト表現にforeignObject を使用しているが、 そのforeignObject が使えない ・その他開発者泣かせの独自仕様が多すぎる Chrome 57
で突然動かない! ・SVG のtransform 属性が効かなくなり、図がいきなり崩れた ・属性を再代入することで一旦は回避できた ・その後、Chrome のバージョンアップで解決 ブラウザによる差異
Safari でSVG を一部画像化できない ・テキスト表現に<foreignObject /> を使用している ・Safari ではforeignObject を画像化(Blob 化)
できない SVG Canvas Blob ・テキストをHTML に変換してCanvas 化 ・画像の読み込みが非同期で画像が抜け落ちてしまう →setTimeout で調整 あいうえお
SVG vs Canvas ・デスクトップ前提 ・Cacoo で使うような大量の オブジェクトを並べるデモ 検証 結果 ・SVG
がパフォーマンスよかった ・大画面でもSVG の方が速い
SVG の長所と短所 長所 ・拡大してもきれい ・DOM として扱えるので、開発者ツールでデバッグしやすい ・描画のための機能がネイティブで備わっている ・イベントハンドリング ・グループ化 ・ライブラリ要らず
短所 ・ブラウザのサポート状況の違い ・SVG の表現力に限界がある → 今後Canvas や画像をSVG 上に置くなどの対応が必要かもしれない
Flash 版 AMF Binary HTML5 版 JSON ・Flash に特化したバイナリデータフォーマット ・ひとかたまりのバイナリデータ
・1 つシェイプを削除したらデータ全体を 書き換える必要がある ・ユニークなID で関連付けられるツリー構造 ・必要な差分データだけを書き換えられる データ形式の刷新 Diagram Sheet Sheet Shape Shape Shape Shape Shape JSON Book Page Shape Shape Page Shape
JSON のメリット ・JavaScript で扱いやすい ・データ転送量だとバイナリの方が有利だが、Cacoo で扱うデータ 量的にはそれほど大きな利点は見られなかった ・PostgreSQL でJSON を扱う機能がある
IndexedDB ・ブラウザに備わっているDB ・キャッシュとして有効活用 ・図のデータをローカルでも保持 ・起動時には差分のみ取得 ・表示しているシートのみ読み込むことでメモリ使用量削減
データ更新の流れ Server Client User Editor IndexedDB Server Operation Request Write
Feedback ・ユーザへのフィードバックを優先 ・データの整合性を保つことに最新の注意を払う ・共同編集でのコンフリクトからの復帰などの対応 Redraw
作図ツールならではのつらさ ・速度を出すためにSVG 描画にライブラリは使用していない ・図の回転とか拡大、歪み アフィン変換、三角関数で地道に計算 ・図のグループ化で考慮すべきパターンが多い 子供の要素や親の要素の考慮のパターンが多くてつらい ・PNG 、SVG 、PPT
、PDF など複数の出力に対応しなければならない いろんなファイル形式でちゃんと見れるようにしないといけない
エラーログの収集 ・なんか動かなくなったの対処法としてログを収集 操作ログやスタックトレースなど ・エラーログはTypetalk (社内チャット)にて確認 ・それでも再現は難しい場合もあるが、だいぶエラーの原因を突き止 めることができている
ライブラリ選定 言語 TypeScript ・様々なデータタイプを交換するため、型付き言語が必須 ・成長も早くライブラリも多い HTML レンダリング Riot.js ・軽量で仮想DOM 的なのを提供してくれる
・React ほどの高機能が必要ではなかった SVG レンダリング 何も使って ません ・素のSVG のAPI を使用しています
ライブラリのメンテナンス ・メインのライブラリはなるべくバージョンをあげるようにしている。 あげるときはnpmcheckupdate などを使用して一つずつ最新に ビルドだけに使用しているものとかめんどくさいのはあげない ・最新バージョンの確認 npm outdated の結果を週一回Typetalk にポストして目視でライブラリ
のバージョンの確認をおこなう
エンジニア募集 職種 業務内容 勤務地 フロントエンジニア CacooHTML5 版クライアント開発 福岡 Go エンジニア
Cacoo のサーバーサイド開発 福岡 一緒にCacoo を世界に届けましょう!
ありがとうございました