25
ServiceWorker それを取り巻くAPI 駆け足紹介 HTML5オールスターズ 06/13/2015 Kinuko Yasuda (@kinu) [email protected]

Service Workerとその周辺API 駆け足紹介

Embed Size (px)

Citation preview

Page 1: Service Workerとその周辺API 駆け足紹介

ServiceWorker とそれを取り巻くAPI駆け足紹介

HTML5オールスターズ 06/13/2015Kinuko Yasuda (@kinu)[email protected]

Page 2: Service Workerとその周辺API 駆け足紹介

今日のお話

最近話題のServiceWorker を中心に

新しいAPIについて(偏った視点で)駆け足で紹介します

* 発表時点の確認バージョンは Chrome 43 (Canary 45), Opera 30, FireFox Nightly です

* 個人的な意見を含みます。雇用者とは無関係

Page 3: Service Workerとその周辺API 駆け足紹介

去年までのWeb

Cache

Page 4: Service Workerとその周辺API 駆け足紹介

今年のWeb

Cache

ServiceWorker

CacheAPI

FetchAPI

HTTPSHTTP/2

PushAPI

!

Background Sync API

PermissionAPI

StreamsAPI

Page 5: Service Workerとその周辺API 駆け足紹介

①ServiceWorker

ページの裏側で動くイベント駆動型Yet another Javascript 環境

■ ページのセット (= scope) に対してインストー

ルされ、バックグラウンドで動作

■ 対象ページからのロードリクエストを proxy のように横取りして操作可能

Page 6: Service Workerとその周辺API 駆け足紹介

①ServiceWorker

♪ServiceWorker

‘fetch’イベント

register

Page 7: Service Workerとその周辺API 駆け足紹介

①ServiceWorkernavigator.serviceWorker.register(

‘sw.js’, {scope: ‘scope/’})

.then(function(registration) {

/* 成功! */

});

self.onfetch = function(event) {

event.respondWith(

new Response(‘from SW!’));

};

Page 8: Service Workerとその周辺API 駆け足紹介

■ 最初のロードからServiceWorkerでコントロールしたい:Clients.claim() (M42から)

■ スクリプトのあるディレクトリ外のページをコントロールしたい:Service-Worker-Allowed ヘッダ (M42から)

■ ServiceWorkerがコントロールしているページの一覧が取りたい:Clients.matchAll()(M43でgetAllから変更)

ServiceWorker細かい話

Page 9: Service Workerとその周辺API 駆け足紹介

■ HTTPS だけなのでテストが面倒:--unsafely-treat-insecure-origin-as-secure=http://url/--user-data-dir=/tmp/dir (M44から)

■ ServiceWorker からも Performance API 使いたい:resource timing, user timing で workerStart が使えるように (M45から)

■ ServiceWorker をスクリプトから更新したい:registration.update() (M45から…多分)

ServiceWorker細かい話

Page 10: Service Workerとその周辺API 駆け足紹介

②Cache APIHTTPリクエスト・レスポンスのための

オフラインストレージ

■ Request オブジェクトをキーに、Response オブジェクトを値に取る

Cache

CacheAPI

Page 11: Service Workerとその周辺API 駆け足紹介

// Cache に ‘foo.png’ のレスポンスを入れるcaches.open(‘cache-name’).then(

function(cache) {

cache.add(‘foo.png’);

});

// Cache から ‘foo.png’ のレスポンスを取り出すcaches.match(‘foo.png’).then(

function(res) {

console.log(res);

});

②Cache API Chrome, Opera ではまだ一部に polyfill 必要global scope の仕様はまだちょっと議論中

Page 12: Service Workerとその周辺API 駆け足紹介

self.oninstall = function(event) {

event.waitUntil(caches.open(‘cache’)

.then(function(cache) {

return cache.addAll([‘index.html’,...]);

}));

};

self.onfetch = function(event) {

event.respondWith(

caches.match(event.request));

};

②Cache API ServiceWorker でのサンプル

Page 13: Service Workerとその周辺API 駆け足紹介

③Fetch APIネットワークからリソースを ‘fetch’ して Response オブジェクトを返す

■ XHR より CORS, cache control などを

きめ細かく制御可能

FetchAPI

Page 14: Service Workerとその周辺API 駆け足紹介

③Fetch API

fetch('foo.txt').then(function(response) {

response.text().then(function(data) {

console.log(data);

});

});

余談:cancel をどうするかなどで揉めてる

Page 15: Service Workerとその周辺API 駆け足紹介

③Fetch API

// Cache になかったものだけネットワークから取ってくる例

self.onfetch = function(ev) {

ev.respondWith(

caches.match(ev.request).then(

function(response) {

return response || fetch(ev.request);

}));

};

ServiceWorker でのサンプル

Page 16: Service Workerとその周辺API 駆け足紹介

④ReadableStreamまとめてじゃなくてデータを受け取るた

びに処理したい

■ 絶賛仕様策定中: Streams API■ バイナリ・ストリームをちゃんと扱える

■ fetch と組み合わせて response.body をストリームとして読み出せる

* まだまだ仕様について議論中

Page 17: Service Workerとその周辺API 駆け足紹介

④ReadableStream

// レスポンスを少しずつ読み出す (あまり意味ない例)fetch(url).then(function(res) {

var reader = res.body.getReader();

reader.read().then(

function(r) {

if (!r.done) { console.log(r.value); }

});

});

Page 18: Service Workerとその周辺API 駆け足紹介

⑤Push APIServiceWorker を使ってサーバから

のプッシュ通知を受け取る

■ GCM などを使う (実装依存)■ タブ閉じてても受けられる

■ Chrome for Android では

Chrome 起動してなくてもOK

!

* まだ仕様少し変わったりしている

Page 19: Service Workerとその周辺API 駆け足紹介

⑤Push APInavigator.serviceWorker.ready.then(

function(sw) {

sw.pushManager.subscribe().then(

function(sub) {

// endpoint をサーバに登録 });

}

);

self.onpush = function(event) {

event.waitUntil(

self.registration.showNotification(...))

};

Page 20: Service Workerとその周辺API 駆け足紹介

今ネットにつながってなくても後で

つながったときに通信して欲しい

■ ツイートやメッセージをオフラインで書いて次に

つながったとき送る

■ 定期的にバックグラウンドで通信する ‘periodic sync’ の仕様も策定中

* Chrome でも --enable-service-worker-sync --enable-experimental-web-platform-features フラグが必要

⑥Background Sync

Page 21: Service Workerとその周辺API 駆け足紹介

⑥Background Syncnavigator.serviceWorker.ready.then(

function(sw) {

sw.sync.register({ tag: ‘send-later’ })

.then(function(reg) {

// 登録成功! });

}

);

self.onsync = function(event) {

if (event.registration.tag == ‘send-later’)

event.waitUntil(sendEverythingNow());

};

Page 23: Service Workerとその周辺API 駆け足紹介

いろいろ出るのはいいけど使

うの大変 (怒)詳しい人が作ってくれたライブラリとか

使いましょう

■ platinum-sw: ServiceWorker in Polymer■ sw-precache: オフラインキャッシュのSWコー

ドを生成してくれるNodeモジュール

Page 24: Service Workerとその周辺API 駆け足紹介

デモ的サイトなど

■ www.locchat.com - ServiceWorker + Push API チャットサイト

■ https://jakearchibald-gcm.appspot.com/chat/ - ServiceWorker + Push API + Background Sync■ ソース: https://github.

com/jakearchibald/push-api-appengine-demo