ヒカラボ-HOME'Sのサイト開発

43
HOME’Sのサイト開発 @なかじま

Transcript of ヒカラボ-HOME'Sのサイト開発

Page 1: ヒカラボ-HOME'Sのサイト開発

HOME’Sのサイト開発@なかじま

Page 2: ヒカラボ-HOME'Sのサイト開発

自己紹介

名前

なかじまたくや (勤続7年目くらい)

普段の業務内容

サイトの機能開発を自由にやってます

得意な領域

フロントエンド(主にJS)だけど、一人プロジェクト多いのでだいたいどこの領域もやることが多いです

Page 3: ヒカラボ-HOME'Sのサイト開発

今日の話

Page 4: ヒカラボ-HOME'Sのサイト開発

ユーザー視点の開発…

は、僕は特にしてないので語れることはなかった

UX界隈の人すぐ斧なげるから怖い

Page 5: ヒカラボ-HOME'Sのサイト開発

代わりに地図系のサイト作った時に得た知見とかの話

僕の思う「使い勝手」を追い求めてみた話

Page 6: ヒカラボ-HOME'Sのサイト開発

地図系のサイト

Page 7: ヒカラボ-HOME'Sのサイト開発

緯度経度で何か検索して地図上に表示させるよくあるやつ

Page 8: ヒカラボ-HOME'Sのサイト開発

地図検索系あるある

• 地図検索系ってそんなにバリエーションがないから結構共通の苦悩と戦うことになると思う

Page 9: ヒカラボ-HOME'Sのサイト開発

あるある1

• 検索クエリ(緯度経度)が毎回違うから検索エンジン側のキャッシュが効かなくてパフォーマンスでない

\ちょっと移動/

検索クエリ(緯度経度)

が微妙にかわる

Page 10: ヒカラボ-HOME'Sのサイト開発

あるある2

• 地図移動前と移動後で表示領域のかぶり多いのに全部検索しなおたりして無駄だなーって憂鬱になる

\ちょっと移動/この部分は前の表示領域一緒なのに・・・

Page 11: ヒカラボ-HOME'Sのサイト開発

あるある3• 超でかいディスプレイで操作されると検索範囲広がってパフォーマンスでない(スケールとかの恩恵受け辛い)

一回の検索範囲が大きいいくつかに分けたい…

Page 12: ヒカラボ-HOME'Sのサイト開発

あるある4

• マーカーとかポリライン沢山ひくとなんか動作がほんのりもっさくなる

Page 13: ヒカラボ-HOME'Sのサイト開発

Google Maps自身はあんなにシームレスでサクサクなのに!

Page 14: ヒカラボ-HOME'Sのサイト開発

僕らもサクサクでストレスレスなユーザー体験を提供した

い!!

Page 15: ヒカラボ-HOME'Sのサイト開発

Google Mapsの実装を探る

なんでそんなサクサクうごくの(*?_?*)

Page 16: ヒカラボ-HOME'Sのサイト開発

基本編

Page 17: ヒカラボ-HOME'Sのサイト開発

Google Mapsはいかにして継ぎ目のない描画を実現しているの

Page 18: ヒカラボ-HOME'Sのサイト開発

地図そのものの表示

Page 19: ヒカラボ-HOME'Sのサイト開発

小さな画像をタイル状に敷き詰めて表示させてる

Page 20: ヒカラボ-HOME'Sのサイト開発

彼らは地図をタイルごとに読み込むことで、地図の移動時に差分となるタイルだけを描画している

Page 21: ヒカラボ-HOME'Sのサイト開発

タイルについて考える

zoom lv. 0

zoom lv. 1

0,0

0,1

1,0

1,1

0,0

Page 22: ヒカラボ-HOME'Sのサイト開発

タイルの開始点

緯度経度: (85.05112877980659,-180)

赤道を256pxとして表現する時にいい感じに収まる座標

Page 23: ヒカラボ-HOME'Sのサイト開発

pixel座標と緯度経度の変換

function fromLatLngToPoint(lat, lng) {

var x, y;

x = (lng + 180) / 360 * 256;

y = ((1 - Math.log(Math.tan(lat *

Math.PI / 180) + 1 / Math.cos(lat *

Math.PI / 180)) / Math.PI) / 2 *

Math.pow(2, 0)) * 256;

return {x: x, y: y};

}

function fromPointToLatLng(x, y) {

var lat, lng, n;

lng = x / 256 * 360 - 180;

n = Math.PI - 2 * Math.PI * y / 256;

lat = (180 / Math.PI * Math.atan(0.5 *

(Math.exp(n) - Math.exp(-n))));

return {lat: lat, lng: lng};

}

ってstack overflowが言ってたよ

Page 24: ヒカラボ-HOME'Sのサイト開発

中級編

Page 25: ヒカラボ-HOME'Sのサイト開発

Markerとかってどうやってるの

Page 26: ヒカラボ-HOME'Sのサイト開発

Markerを調べる

Page 27: ヒカラボ-HOME'Sのサイト開発

MarkerはCanvasで作られていた

Page 28: ヒカラボ-HOME'Sのサイト開発

複数のmarkerでも収まれば1つのcanvasで表示→ 省エネ

Page 29: ヒカラボ-HOME'Sのサイト開発

PolyLine & Polygon

Page 30: ヒカラボ-HOME'Sのサイト開発

Google Maps APIのだいたいのやつはCanvasで作られていた

ぐう有能

Markerとか一つ一つ要素作ってstyle当ててたらコスト高すぎてこのパフォーマンスは実現できない

Page 31: ヒカラボ-HOME'Sのサイト開発

canvasでの描画

• 大量のDOMを作るよりタイルシステムの規格通りのcanvas作ってその上で描画する方がコストが低い

• でも、描画情報しかないんならmarkerクリックできないのでは???????

• クリックできたりhoverしたらカーソルがかわったりするけど???????

Page 32: ヒカラボ-HOME'Sのサイト開発

canvasとマウスアクション

カーソルがcanvas上のマーカー描画位置にきたら地図コンテナ自身のcursor値を変更してる!!!!

Page 33: ヒカラボ-HOME'Sのサイト開発

canvasあるいはそれより上位の要素にイベントを割り当てて、mousemove時に座標判定して該当マーカーがある時に処理するというガチなやつで実装してるみたい

canvasとマウスアクション

デフォルトのpoiとかは

時々リクエストに紛れてるこいつらがが座標情報なんじゃないかな

Page 34: ヒカラボ-HOME'Sのサイト開発

融通効かないとこ

でもその割に、1マーカーに1つずつevent設定していくしかないのはもったいないような…

全部のマーカーに共通のイベント張る時とかコストが勿体ない

Page 35: ヒカラボ-HOME'Sのサイト開発

まぁなにはともあれ

Page 36: ヒカラボ-HOME'Sのサイト開発

この辺の仕組みが地図アプリのパフォーマンスの肝になってる

• タイル化することで とかも可能になる

• 何かを検索して地図上にプロットする系のサイトもタイルごとに検索を行えば同タイルの時に発生するリクエストは全部同じ座標になるためある程度Cacheできる

• MarkerのCavans化も自前でやっちゃえばイベントハンドラ周りとか、さらにいい感じに省エネ化できる

Page 37: ヒカラボ-HOME'Sのサイト開発

サクサクさせるために模倣する

• Google Mapsのタイル規格と同じタイルのレイヤを作り、それぞれマーカーCanvasを自作する

\きえた/

Page 38: ヒカラボ-HOME'Sのサイト開発

実際の仕上がりと操作感

継ぎ目ない感じでてる!検索もキャッシュ効くからはやい!

Page 39: ヒカラボ-HOME'Sのサイト開発

操作感をより上げるための細かいチューニング

• 単純にcanvas化しまくるとどこかでメモリ溢れるから描

画領域から離れたタイルは描画座標だけ記憶してすぐ復元できる状態だけ作って消したり

• retina対応とかは解像度みてやる必要があるか判定したり

• 検索エンジン側(solr)でfilter query利用してcacheできるようにしたり

Page 40: ヒカラボ-HOME'Sのサイト開発

二度と同じ実装したくないのでライブラリ化

Page 41: ヒカラボ-HOME'Sのサイト開発

そんな感じで日々HOME’Sの中の人は自分の思う「よりよい使い勝手」を探し求めて今日も実装しています

終わり

Page 42: ヒカラボ-HOME'Sのサイト開発

1 more slide

Page 43: ヒカラボ-HOME'Sのサイト開発

ネクストではいい感じのiOSエンジニアとWebエンジニアを

募集しています!

本当におわりです!