SlideShare a Scribd company logo
1 of 71
Download to read offline
進化する Web
~ Progressive Web Apps の実装と応用 ~
AD09
for
DEVELOPER
• Progressive Web Apps について
• Progressive Web Apps を実現する API
• Progressive Web Apps on Windows
アジェンダ
Progressive Web Apps
Progressive Web Apps とは?
ネイティブアプリのような UX を提供する Web アプリの概念
• Chrome Dev Summit 2015
• もともとは Alex Russell 氏(Google) のブログ記事
• Web によるネイティブアプリのような UX
• クライアントの性能に合わせた機能提供
• アプリにおける Progressive Enhancement
アプリにおける Progressive Enhancement
同じコンテンツ
Web ページ
アプリケーション
Web サーバー
Progressive Web Apps を実現する機能
これまでの Web になかった機能
オフラインサポート プッシュ通知 バックグラウンド処理 アイコンの追加
Cache API Push API Background Sync Web App Manifest
Service Worker
Web App Manifest
Web のメリット
•Secure (安全)
•Linkable (リンク可能)
•Indexable (インデックス可能)
•Composable (再構成可能)
•Ephemeral (一時的な利用)
SLICE
Progressive Web Apps が提供する価値
• FIRE = Fast Integrated Reliable Engage
• Fast: パフォーマンスの良い、軽快な動作
• Integrated: OS と統合されたユーザー体験
• Reliable: オフラインでも動作する利便性と信頼性
• Engaging: Web サイトの価値向上
高速で信頼性の高いエンゲージメント
Progressive Web Apps のメリット
PWA = Web + アプリのメリット
Progressive Web Apps を実現する API
Service Worker
• Web Worker のひとつ
• DOM に直接アクセスできない
• Web ページと異なるライフサイクル
• ページのスクリプトから “登録” (インストール)
• 再インストール : Service Worker の JS ファイルの更新
• HTTPS 必須
バックグラウンドで動作するネットワークプロキシ
プログラミング可能な
Service Worker が提供する機能
クライアントWeb サーバー
• キャッシュ
• リクエストのハンドリング
• Push
• バックグラウンド同期
これまでの Web になかった機能
Service Worker が提供する機能
クライアントWeb サーバー
• キャッシュ
• リクエストのハンドリング
• Push
• バックグラウンド同期
これまでの Web になかった機能
Service Worker が提供する機能
クライアントWeb サーバー
• キャッシュ
• リクエストのハンドリング
• Push
• バックグラウンド同期
これまでの Web になかった機能
Service Worker が提供する機能
クライアントWeb サーバー
• キャッシュ
• リクエストのハンドリング
• Push
• バックグラウンド同期
これまでの Web になかった機能
Service Worker が提供する機能
クライアントWeb サーバー
• キャッシュ
• リクエストのハンドリング
• Push
• バックグラウンド同期
これまでの Web になかった機能
Service Worker が提供する機能
クライアントWeb サーバー
• キャッシュ
• リクエストのハンドリング
• Push
• バックグラウンド同期
これまでの Web になかった機能
Service Worker が提供する機能
クライアントWeb サーバー
• キャッシュ
• リクエストのハンドリング
• Push
• バックグラウンド同期
これまでの Web になかった機能
Service Worker の各 API 実装状況
Service Worker 〇 〇 〇 〇
Cache API 〇 〇 〇 〇
Push API 〇 〇 〇 ×
Background Sync API △ 〇 × ×
17 5966 11.1
開発中
Service Worker を使う準備
Service Worker 用の JS ファイルが必要
+
sw.js
JavaScript JavaScript
配下のアセットを制御
Service Worker のライフサイクル
Install
Activate
Idle
Error
Fetch /
Message
• ServiceWoker の登録
(Register メソッド)
• 静的なアセットのキャッシュ
Service Worker のライフサイクル
Install
Activate
Idle
Error
Fetch /
Message
• ダウンロードの失敗
• キャッシュの失敗
• Activate されない
Service Worker のライフサイクル
Install
Activate
Idle
Error
Fetch /
Message
• 有効化された際に発生
• インストール直後
• 復帰時
Service Worker のライフサイクル
Install
Activate
Idle
Error
Fetch /
Message
• 待機状態
Service Worker のライフサイクル
Install
Activate
Idle
Error
Fetch /
Message
• ネットワークリクエスト
またはメッセージに対する処理
Service Worker のライフサイクル
Install
Activate
Idle
Error
Fetch /
Message
• 終了(メモリ節約のため)
Step 1 : Service Worker の登録 Web コンテンツ側の JS
Step 1 : Service Worker の登録
if ( navigator.serviceWorker ) {
} Service Worker がサポートされているか検証
Web コンテンツ側の JS
Step 1 : Service Worker の登録
if ( navigator.serviceWorker.controller ) {
console.log('There’s an active service worker');
}
すでに動作している Service Worker があるか検証することも可能
Web コンテンツ側の JS
Step 1 : Service Worker の登録
else {
navigator.serviceWorker.register('/sw.js')
.then(function(reg) {
}
Service Worker を登録
Web コンテンツ側の JS
Step 1 : Service Worker の登録
.then(function(reg) {
console.log('SW registered for scope',
reg.scope);
});
Promise で結果が返される
Web コンテンツ側の JS
Step 1 : Service Worker の登録
if ( navigator.serviceWorker ) {
navigator.serviceWorker.register('/sw.js');
}
Web コンテンツ側の JS
Service Worker 登録するだけならシンプルに書ける
Step 2 : アセットのキャッシュ Service Worker 側の JS
Step 2 : アセットのキャッシュ
Self.addEventListener('install', function(event)
Service Worker 側の JS
Service Worker 登録時に install イベントが発生
Step 2 : アセットのキャッシュ
event.waitUntil(
caches.open('キャッシュの名前')
)
Service Worker 側の JS
キャッシュを開く
Step 2 : アセットのキャッシュ
urlsToCache
'/',
'/index.html',
'/css/index.css',
'/script/index.js'
caches.open('キャッシュの名前')
.then(function(cache) {
return cache.addAll(urlsToCache);
Service Worker 側の JS
キャッシュするアセットを登録する
Step 3 : 有効化イベント
'キャッシュの名前'
Service Worker 側の JS
Step 3 : 有効化イベント
self.addEventListener('activate', function(e) {
'キャッシュの名前'
});
Service Worker 側の JS
Service Worker のインストールが完了し有効化
Step 3 : 有効化イベント
e.waitUntil(
caches.keys().then(function(keyList) {
'キャッシュの名前'
})
);
Service Worker 側の JS
既存のキャッシュの一覧を取り出す
Step 3 : 有効化イベント
return Promise.all(keyList.map(function(key) {
console.log('ServiceWorker の古いキーを削除しました。', key);
if (key !== 'キャッシュの名前') {
return caches.delete(key);
}
Service Worker 側の JS
今回開いたキャッシュと異なる名前のキャッシュを削除
キャッシュについて
コンテンツのキャッシュをオフラインで使用できるように管理
• App Shell
• UI が機能するために必要な最小限のリソース
• 要件にあったアセット
なにをキャッシュするか?
Service Worker の更新
• js ファイルを更新
• キャッシュがクリアされるわけではない
• 有効になるのは一度ページを閉じた後
Step 4 : リクエストのハンドリング Service Worker 側の JS
Step 4 : リクエストのハンドリング
self.addEventListener('fetch', function(e) {
})
Service Worker 側の JS
ネットワークリクエストがされると fetch イベントが発生
Step 4 : リクエストのハンドリング
caches.match(e.request)
Service Worker 側の JS
キャッシュからのデータが利用可能か どうかを確認
Step 4 : リクエストのハンドリング
e.request
.then(function(response) {
return response || fetch(e.request);
}
Service Worker 側の JS
キャッシュか fetch でネットワークから取得した内容を返す
Step 4 : リクエストのハンドリング
e.respondWith(
)
Service Worker 側の JS
ページにレスポンスを返す
デモ : Service Worker の実装
Web App Manifest
サイトのブックマークを端末のホーム画面に保存
<link rel="manifest" href="/manifest.manifest">
(※)Windows では現状 .appxmanifest(XML)形式に変換して使用
{
"lang": "ja",
"short_name": "Spece Enemy",
"name": "The Spece Enemy",
"icons": [
{
"src": "img/launcher-icon-2x.png",
"sizes": "96x96",
"type": "image/png"
},
{
"src": "img/launcher-icon-4x.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "/pwa/?utm_source=homescreen",
"display": "standalone",
"orientation": "portrait",
"background_color": "black"
}
Web Application Manifest の記述
{
"lang": "ja",
"short_name": "Spece Enemy",
"name": "The Spece Enemy",
"icons": [
{
"src": "img/launcher-icon-2x.png",
"sizes": "96x96",
"type": "image/png"
},
{
"src": "img/launcher-icon-4x.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "/pwa/?utm_source=homescreen",
"display": "standalone",
"orientation": "portrait",
"background_color": "black"
}
• name:アプリのフルネーム
• short_name:ショートネーム
{
"lang": "ja",
"short_name": "Spece Enemy",
"name": "The Spece Enemy",
"icons": [
{
"src": "img/launcher-icon-2x.png",
"sizes": "96x96",
"type": "image/png"
},
{
"src": "img/launcher-icon-4x.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "/pwa/?utm_source=homescreen",
"display": "standalone",
"orientation": "portrait",
"background_color": "black"
}
• icons : ホーム画面の
アイコンや起動画面に使用
されるアイコン
{
"lang": "ja",
"short_name": "Spece Enemy",
"name": "The Spece Enemy",
"icons": [
{
"src": "img/launcher-icon-2x.png",
"sizes": "96x96",
"type": "image/png"
},
{
"src": "img/launcher-icon-4x.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "/pwa/?utm_source=homescreen",
"display": "standalone",
"orientation": "portrait",
"background_color": "black"
}
• display : 優先されるビュー
• orientation : 画面の向き
• Background_color : 背景色
display : 優先されるビューの設定
fullscreen standalone minimal-ui browser
戻るボタンのみ
4 種類の指定が可能
限定された UI
(読み取り専用のナビ
ゲーションバー)
ブラウザーのまま
デモ : Web Application Manifest
Progressive Web Apps on
Windows
Microsoft Store からの配布
• 自動インデックス • セルフパブリッシング
PWA を Microsoft Store で公開する 2 の方法
Bing に自動インデックスされる条件
• HTTPS, セキュアなエンドポイント
• 高品質の manifest
(names, screen shots, descriptions)
• オフラインサポート
• ストアの審査をパス
• デジタルグッズを販売しないこと
• アダルトコンテンツを含まないこと
• 不快なコンテンツは不可
• Windows ならではの差別化がされている
Microsoft Store で公開するための条件
Windows Store むけ PWA の検証
• PWA が Microsoft Store の準備ができていることを
検証
• パフォーマンスとユーザーエクスペリエンスの向上https://sonarwhal.com/
Bing に検出されないようにするには
• manifest なし、https なし、もしくは
オフラインで動作しない
• Robot.txt ファイルを設定
• display: browser
• アプリを削除するようサービスリクエストを
出す
(reportapp@microsoft.com)
Microsoft ストアでの公開
• dev.microsoft.com で開発者アカウントを
開設
PWABuilder.com で Appx を生成する
reportapp@microsoft.com
UWP アプリの提出とおなじ
PWA Builder での PWA の開始
https://www.pwabuilder.com/
ホストされている PWA をパッケージング
Windows Store App の価値
• デベロッパーセンターの分析
• アプリ内課金
• プロモーションの機会
• データストレージの上限がない
• Service Workers
• WinRT API へのアクセス
Progressive Web Apps をさらに Progressive
WinRT API にアクセス可能
//Windows にインストールされているかどうか
//セカンダリータイルをピン留めする
//有効化される場所
Progressive Web Apps の価値を高める API
• CSS3
• WebAssembly
• WebVR
• Web Payments
Progressive Web Apps の位置づけ
Web と Native の間を埋める
Progressive Web Apps の位置づけ
Web と Native の間を埋める
PWA
まとめ
=
• Service Worker
• Web Application Manifest
• Other..
Web
+
Native
Apps
This is
good one!
参考
• Progressive Web Apps on Windows
• Sonarwhal
• PWA BUILDER
• Building Progressive Web Apps
for Windows devices : Build 2018
• Cboard: A Progressive Web App for Everyone
© 2018 Microsoft Corporation. All rights reserved.
本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。

More Related Content

More from Osamu Monoe

Microsoft Bot Framework と Cognitive Services を活用した 業務サポートBOT 構築
Microsoft Bot Framework とCognitive Services を活用した業務サポートBOT 構築Microsoft Bot Framework とCognitive Services を活用した業務サポートBOT 構築
Microsoft Bot Framework と Cognitive Services を活用した 業務サポートBOT 構築Osamu Monoe
 
JS で Bot つくろうぜ! ~刮目せよ!、これがMSのBot Framewok だ!!~
JS で Bot つくろうぜ! ~刮目せよ!、これがMSのBot Framewok だ!!~JS で Bot つくろうぜ! ~刮目せよ!、これがMSのBot Framewok だ!!~
JS で Bot つくろうぜ! ~刮目せよ!、これがMSのBot Framewok だ!!~Osamu Monoe
 
For every people achieve more : マイクロソフトの Inclusive Design について
For every people achieve more : マイクロソフトの Inclusive Design についてFor every people achieve more : マイクロソフトの Inclusive Design について
For every people achieve more : マイクロソフトの Inclusive Design についてOsamu Monoe
 
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~Osamu Monoe
 
Microsoft Edge 最新アップデートとこれから
Microsoft Edge 最新アップデートとこれからMicrosoft Edge 最新アップデートとこれから
Microsoft Edge 最新アップデートとこれからOsamu Monoe
 
Visual Studio 2015 を使用した Cordova アプリの開発
Visual Studio 2015 を使用した Cordova アプリの開発Visual Studio 2015 を使用した Cordova アプリの開発
Visual Studio 2015 を使用した Cordova アプリの開発Osamu Monoe
 
html5j Webプラットフォームの紹介
html5j Webプラットフォームの紹介html5j Webプラットフォームの紹介
html5j Webプラットフォームの紹介Osamu Monoe
 
Microsoft edge deep dive
Microsoft edge deep diveMicrosoft edge deep dive
Microsoft edge deep diveOsamu Monoe
 
Edge と IE、来年からの Web 制作
Edge と IE、来年からの Web 制作Edge と IE、来年からの Web 制作
Edge と IE、来年からの Web 制作Osamu Monoe
 
マイクロソフトにおけるエバンジェリズム活動
マイクロソフトにおけるエバンジェリズム活動マイクロソフトにおけるエバンジェリズム活動
マイクロソフトにおけるエバンジェリズム活動Osamu Monoe
 
Windows 10 のあたらしい Web ブラウザーの F12 開発者ツール
Windows 10 のあたらしい Web ブラウザーの F12 開発者ツールWindows 10 のあたらしい Web ブラウザーの F12 開発者ツール
Windows 10 のあたらしい Web ブラウザーの F12 開発者ツールOsamu Monoe
 
Microsoft Edgeで サポートされる 新しい API について
Microsoft Edgeでサポートされる新しい API についてMicrosoft Edgeでサポートされる新しい API について
Microsoft Edgeで サポートされる 新しい API についてOsamu Monoe
 
Windows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー についてWindows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー についてOsamu Monoe
 
酒と泪と Edge と IE
酒と泪と Edge と IE酒と泪と Edge と IE
酒と泪と Edge と IEOsamu Monoe
 
for Developer、 Microsoft Edge とInternet Explorer で 新しくサポートされるAPI
for Developer、Microsoft Edge とInternet Explorer で新しくサポートされるAPI for Developer、Microsoft Edge とInternet Explorer で新しくサポートされるAPI
for Developer、 Microsoft Edge とInternet Explorer で 新しくサポートされるAPI Osamu Monoe
 
クリスマス直前! HTML5 で作る♥ はじめての iOS & Android アプリ開発
クリスマス直前!HTML5 で作る♥はじめての iOS & Android アプリ開発クリスマス直前!HTML5 で作る♥はじめての iOS & Android アプリ開発
クリスマス直前! HTML5 で作る♥ はじめての iOS & Android アプリ開発Osamu Monoe
 
Microsoft Azure 概要 (2015 年 4 月版)
Microsoft Azure 概要 (2015 年 4 月版)Microsoft Azure 概要 (2015 年 4 月版)
Microsoft Azure 概要 (2015 年 4 月版)Osamu Monoe
 
テストツールで効率化 Internet Explorerバージョンアップに伴う Webコンテンツの移行作業
テストツールで効率化 Internet Explorerバージョンアップに伴うWebコンテンツの移行作業テストツールで効率化 Internet Explorerバージョンアップに伴うWebコンテンツの移行作業
テストツールで効率化 Internet Explorerバージョンアップに伴う Webコンテンツの移行作業Osamu Monoe
 
Visual Studio を使用した Cordova 開発
Visual Studio を使用した Cordova 開発Visual Studio を使用した Cordova 開発
Visual Studio を使用した Cordova 開発Osamu Monoe
 

More from Osamu Monoe (20)

Microsoft Bot Framework と Cognitive Services を活用した 業務サポートBOT 構築
Microsoft Bot Framework とCognitive Services を活用した業務サポートBOT 構築Microsoft Bot Framework とCognitive Services を活用した業務サポートBOT 構築
Microsoft Bot Framework と Cognitive Services を活用した 業務サポートBOT 構築
 
JS で Bot つくろうぜ! ~刮目せよ!、これがMSのBot Framewok だ!!~
JS で Bot つくろうぜ! ~刮目せよ!、これがMSのBot Framewok だ!!~JS で Bot つくろうぜ! ~刮目せよ!、これがMSのBot Framewok だ!!~
JS で Bot つくろうぜ! ~刮目せよ!、これがMSのBot Framewok だ!!~
 
For every people achieve more : マイクロソフトの Inclusive Design について
For every people achieve more : マイクロソフトの Inclusive Design についてFor every people achieve more : マイクロソフトの Inclusive Design について
For every people achieve more : マイクロソフトの Inclusive Design について
 
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
 
Microsoft Edge 最新アップデートとこれから
Microsoft Edge 最新アップデートとこれからMicrosoft Edge 最新アップデートとこれから
Microsoft Edge 最新アップデートとこれから
 
Visual Studio 2015 を使用した Cordova アプリの開発
Visual Studio 2015 を使用した Cordova アプリの開発Visual Studio 2015 を使用した Cordova アプリの開発
Visual Studio 2015 を使用した Cordova アプリの開発
 
html5j Webプラットフォームの紹介
html5j Webプラットフォームの紹介html5j Webプラットフォームの紹介
html5j Webプラットフォームの紹介
 
Microsoft edge deep dive
Microsoft edge deep diveMicrosoft edge deep dive
Microsoft edge deep dive
 
Edge と IE、来年からの Web 制作
Edge と IE、来年からの Web 制作Edge と IE、来年からの Web 制作
Edge と IE、来年からの Web 制作
 
マイクロソフトにおけるエバンジェリズム活動
マイクロソフトにおけるエバンジェリズム活動マイクロソフトにおけるエバンジェリズム活動
マイクロソフトにおけるエバンジェリズム活動
 
Windows 10 のあたらしい Web ブラウザーの F12 開発者ツール
Windows 10 のあたらしい Web ブラウザーの F12 開発者ツールWindows 10 のあたらしい Web ブラウザーの F12 開発者ツール
Windows 10 のあたらしい Web ブラウザーの F12 開発者ツール
 
Microsoft Edgeで サポートされる 新しい API について
Microsoft Edgeでサポートされる新しい API についてMicrosoft Edgeでサポートされる新しい API について
Microsoft Edgeで サポートされる 新しい API について
 
Windows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー についてWindows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー について
 
酒と泪と Edge と IE
酒と泪と Edge と IE酒と泪と Edge と IE
酒と泪と Edge と IE
 
for Developer、 Microsoft Edge とInternet Explorer で 新しくサポートされるAPI
for Developer、Microsoft Edge とInternet Explorer で新しくサポートされるAPI for Developer、Microsoft Edge とInternet Explorer で新しくサポートされるAPI
for Developer、 Microsoft Edge とInternet Explorer で 新しくサポートされるAPI
 
About WinJS
About WinJSAbout WinJS
About WinJS
 
クリスマス直前! HTML5 で作る♥ はじめての iOS & Android アプリ開発
クリスマス直前!HTML5 で作る♥はじめての iOS & Android アプリ開発クリスマス直前!HTML5 で作る♥はじめての iOS & Android アプリ開発
クリスマス直前! HTML5 で作る♥ はじめての iOS & Android アプリ開発
 
Microsoft Azure 概要 (2015 年 4 月版)
Microsoft Azure 概要 (2015 年 4 月版)Microsoft Azure 概要 (2015 年 4 月版)
Microsoft Azure 概要 (2015 年 4 月版)
 
テストツールで効率化 Internet Explorerバージョンアップに伴う Webコンテンツの移行作業
テストツールで効率化 Internet Explorerバージョンアップに伴うWebコンテンツの移行作業テストツールで効率化 Internet Explorerバージョンアップに伴うWebコンテンツの移行作業
テストツールで効率化 Internet Explorerバージョンアップに伴う Webコンテンツの移行作業
 
Visual Studio を使用した Cordova 開発
Visual Studio を使用した Cordova 開発Visual Studio を使用した Cordova 開発
Visual Studio を使用した Cordova 開発
 

進化する Web ~ Progressive Web Apps の実装と応用 ~

  • 1. 進化する Web ~ Progressive Web Apps の実装と応用 ~ AD09
  • 3. • Progressive Web Apps について • Progressive Web Apps を実現する API • Progressive Web Apps on Windows アジェンダ
  • 5. Progressive Web Apps とは? ネイティブアプリのような UX を提供する Web アプリの概念 • Chrome Dev Summit 2015 • もともとは Alex Russell 氏(Google) のブログ記事 • Web によるネイティブアプリのような UX • クライアントの性能に合わせた機能提供 • アプリにおける Progressive Enhancement
  • 6. アプリにおける Progressive Enhancement 同じコンテンツ Web ページ アプリケーション Web サーバー
  • 7. Progressive Web Apps を実現する機能 これまでの Web になかった機能 オフラインサポート プッシュ通知 バックグラウンド処理 アイコンの追加 Cache API Push API Background Sync Web App Manifest Service Worker Web App Manifest
  • 8. Web のメリット •Secure (安全) •Linkable (リンク可能) •Indexable (インデックス可能) •Composable (再構成可能) •Ephemeral (一時的な利用) SLICE
  • 9. Progressive Web Apps が提供する価値 • FIRE = Fast Integrated Reliable Engage • Fast: パフォーマンスの良い、軽快な動作 • Integrated: OS と統合されたユーザー体験 • Reliable: オフラインでも動作する利便性と信頼性 • Engaging: Web サイトの価値向上 高速で信頼性の高いエンゲージメント
  • 10. Progressive Web Apps のメリット PWA = Web + アプリのメリット
  • 11. Progressive Web Apps を実現する API
  • 12. Service Worker • Web Worker のひとつ • DOM に直接アクセスできない • Web ページと異なるライフサイクル • ページのスクリプトから “登録” (インストール) • 再インストール : Service Worker の JS ファイルの更新 • HTTPS 必須 バックグラウンドで動作するネットワークプロキシ プログラミング可能な
  • 13. Service Worker が提供する機能 クライアントWeb サーバー • キャッシュ • リクエストのハンドリング • Push • バックグラウンド同期 これまでの Web になかった機能
  • 14. Service Worker が提供する機能 クライアントWeb サーバー • キャッシュ • リクエストのハンドリング • Push • バックグラウンド同期 これまでの Web になかった機能
  • 15. Service Worker が提供する機能 クライアントWeb サーバー • キャッシュ • リクエストのハンドリング • Push • バックグラウンド同期 これまでの Web になかった機能
  • 16. Service Worker が提供する機能 クライアントWeb サーバー • キャッシュ • リクエストのハンドリング • Push • バックグラウンド同期 これまでの Web になかった機能
  • 17. Service Worker が提供する機能 クライアントWeb サーバー • キャッシュ • リクエストのハンドリング • Push • バックグラウンド同期 これまでの Web になかった機能
  • 18. Service Worker が提供する機能 クライアントWeb サーバー • キャッシュ • リクエストのハンドリング • Push • バックグラウンド同期 これまでの Web になかった機能
  • 19. Service Worker が提供する機能 クライアントWeb サーバー • キャッシュ • リクエストのハンドリング • Push • バックグラウンド同期 これまでの Web になかった機能
  • 20. Service Worker の各 API 実装状況 Service Worker 〇 〇 〇 〇 Cache API 〇 〇 〇 〇 Push API 〇 〇 〇 × Background Sync API △ 〇 × × 17 5966 11.1 開発中
  • 21. Service Worker を使う準備 Service Worker 用の JS ファイルが必要 + sw.js JavaScript JavaScript 配下のアセットを制御
  • 22. Service Worker のライフサイクル Install Activate Idle Error Fetch / Message • ServiceWoker の登録 (Register メソッド) • 静的なアセットのキャッシュ
  • 23. Service Worker のライフサイクル Install Activate Idle Error Fetch / Message • ダウンロードの失敗 • キャッシュの失敗 • Activate されない
  • 24. Service Worker のライフサイクル Install Activate Idle Error Fetch / Message • 有効化された際に発生 • インストール直後 • 復帰時
  • 26. Service Worker のライフサイクル Install Activate Idle Error Fetch / Message • ネットワークリクエスト またはメッセージに対する処理
  • 27. Service Worker のライフサイクル Install Activate Idle Error Fetch / Message • 終了(メモリ節約のため)
  • 28. Step 1 : Service Worker の登録 Web コンテンツ側の JS
  • 29. Step 1 : Service Worker の登録 if ( navigator.serviceWorker ) { } Service Worker がサポートされているか検証 Web コンテンツ側の JS
  • 30. Step 1 : Service Worker の登録 if ( navigator.serviceWorker.controller ) { console.log('There’s an active service worker'); } すでに動作している Service Worker があるか検証することも可能 Web コンテンツ側の JS
  • 31. Step 1 : Service Worker の登録 else { navigator.serviceWorker.register('/sw.js') .then(function(reg) { } Service Worker を登録 Web コンテンツ側の JS
  • 32. Step 1 : Service Worker の登録 .then(function(reg) { console.log('SW registered for scope', reg.scope); }); Promise で結果が返される Web コンテンツ側の JS
  • 33. Step 1 : Service Worker の登録 if ( navigator.serviceWorker ) { navigator.serviceWorker.register('/sw.js'); } Web コンテンツ側の JS Service Worker 登録するだけならシンプルに書ける
  • 34. Step 2 : アセットのキャッシュ Service Worker 側の JS
  • 35. Step 2 : アセットのキャッシュ Self.addEventListener('install', function(event) Service Worker 側の JS Service Worker 登録時に install イベントが発生
  • 36. Step 2 : アセットのキャッシュ event.waitUntil( caches.open('キャッシュの名前') ) Service Worker 側の JS キャッシュを開く
  • 37. Step 2 : アセットのキャッシュ urlsToCache '/', '/index.html', '/css/index.css', '/script/index.js' caches.open('キャッシュの名前') .then(function(cache) { return cache.addAll(urlsToCache); Service Worker 側の JS キャッシュするアセットを登録する
  • 38. Step 3 : 有効化イベント 'キャッシュの名前' Service Worker 側の JS
  • 39. Step 3 : 有効化イベント self.addEventListener('activate', function(e) { 'キャッシュの名前' }); Service Worker 側の JS Service Worker のインストールが完了し有効化
  • 40. Step 3 : 有効化イベント e.waitUntil( caches.keys().then(function(keyList) { 'キャッシュの名前' }) ); Service Worker 側の JS 既存のキャッシュの一覧を取り出す
  • 41. Step 3 : 有効化イベント return Promise.all(keyList.map(function(key) { console.log('ServiceWorker の古いキーを削除しました。', key); if (key !== 'キャッシュの名前') { return caches.delete(key); } Service Worker 側の JS 今回開いたキャッシュと異なる名前のキャッシュを削除
  • 42. キャッシュについて コンテンツのキャッシュをオフラインで使用できるように管理 • App Shell • UI が機能するために必要な最小限のリソース • 要件にあったアセット なにをキャッシュするか? Service Worker の更新 • js ファイルを更新 • キャッシュがクリアされるわけではない • 有効になるのは一度ページを閉じた後
  • 43. Step 4 : リクエストのハンドリング Service Worker 側の JS
  • 44. Step 4 : リクエストのハンドリング self.addEventListener('fetch', function(e) { }) Service Worker 側の JS ネットワークリクエストがされると fetch イベントが発生
  • 45. Step 4 : リクエストのハンドリング caches.match(e.request) Service Worker 側の JS キャッシュからのデータが利用可能か どうかを確認
  • 46. Step 4 : リクエストのハンドリング e.request .then(function(response) { return response || fetch(e.request); } Service Worker 側の JS キャッシュか fetch でネットワークから取得した内容を返す
  • 47. Step 4 : リクエストのハンドリング e.respondWith( ) Service Worker 側の JS ページにレスポンスを返す
  • 48. デモ : Service Worker の実装
  • 49. Web App Manifest サイトのブックマークを端末のホーム画面に保存 <link rel="manifest" href="/manifest.manifest"> (※)Windows では現状 .appxmanifest(XML)形式に変換して使用
  • 50. { "lang": "ja", "short_name": "Spece Enemy", "name": "The Spece Enemy", "icons": [ { "src": "img/launcher-icon-2x.png", "sizes": "96x96", "type": "image/png" }, { "src": "img/launcher-icon-4x.png", "sizes": "512x512", "type": "image/png" } ], "start_url": "/pwa/?utm_source=homescreen", "display": "standalone", "orientation": "portrait", "background_color": "black" } Web Application Manifest の記述
  • 51. { "lang": "ja", "short_name": "Spece Enemy", "name": "The Spece Enemy", "icons": [ { "src": "img/launcher-icon-2x.png", "sizes": "96x96", "type": "image/png" }, { "src": "img/launcher-icon-4x.png", "sizes": "512x512", "type": "image/png" } ], "start_url": "/pwa/?utm_source=homescreen", "display": "standalone", "orientation": "portrait", "background_color": "black" } • name:アプリのフルネーム • short_name:ショートネーム
  • 52. { "lang": "ja", "short_name": "Spece Enemy", "name": "The Spece Enemy", "icons": [ { "src": "img/launcher-icon-2x.png", "sizes": "96x96", "type": "image/png" }, { "src": "img/launcher-icon-4x.png", "sizes": "512x512", "type": "image/png" } ], "start_url": "/pwa/?utm_source=homescreen", "display": "standalone", "orientation": "portrait", "background_color": "black" } • icons : ホーム画面の アイコンや起動画面に使用 されるアイコン
  • 53. { "lang": "ja", "short_name": "Spece Enemy", "name": "The Spece Enemy", "icons": [ { "src": "img/launcher-icon-2x.png", "sizes": "96x96", "type": "image/png" }, { "src": "img/launcher-icon-4x.png", "sizes": "512x512", "type": "image/png" } ], "start_url": "/pwa/?utm_source=homescreen", "display": "standalone", "orientation": "portrait", "background_color": "black" } • display : 優先されるビュー • orientation : 画面の向き • Background_color : 背景色
  • 54. display : 優先されるビューの設定 fullscreen standalone minimal-ui browser 戻るボタンのみ 4 種類の指定が可能 限定された UI (読み取り専用のナビ ゲーションバー) ブラウザーのまま
  • 55. デモ : Web Application Manifest
  • 56. Progressive Web Apps on Windows
  • 57. Microsoft Store からの配布 • 自動インデックス • セルフパブリッシング PWA を Microsoft Store で公開する 2 の方法
  • 58. Bing に自動インデックスされる条件 • HTTPS, セキュアなエンドポイント • 高品質の manifest (names, screen shots, descriptions) • オフラインサポート • ストアの審査をパス • デジタルグッズを販売しないこと • アダルトコンテンツを含まないこと • 不快なコンテンツは不可 • Windows ならではの差別化がされている Microsoft Store で公開するための条件
  • 59. Windows Store むけ PWA の検証 • PWA が Microsoft Store の準備ができていることを 検証 • パフォーマンスとユーザーエクスペリエンスの向上https://sonarwhal.com/
  • 60. Bing に検出されないようにするには • manifest なし、https なし、もしくは オフラインで動作しない • Robot.txt ファイルを設定 • display: browser • アプリを削除するようサービスリクエストを 出す (reportapp@microsoft.com)
  • 61. Microsoft ストアでの公開 • dev.microsoft.com で開発者アカウントを 開設 PWABuilder.com で Appx を生成する reportapp@microsoft.com UWP アプリの提出とおなじ
  • 62. PWA Builder での PWA の開始 https://www.pwabuilder.com/ ホストされている PWA をパッケージング
  • 63. Windows Store App の価値 • デベロッパーセンターの分析 • アプリ内課金 • プロモーションの機会 • データストレージの上限がない • Service Workers • WinRT API へのアクセス Progressive Web Apps をさらに Progressive
  • 64. WinRT API にアクセス可能 //Windows にインストールされているかどうか //セカンダリータイルをピン留めする //有効化される場所
  • 65.
  • 66. Progressive Web Apps の価値を高める API • CSS3 • WebAssembly • WebVR • Web Payments
  • 67. Progressive Web Apps の位置づけ Web と Native の間を埋める
  • 68. Progressive Web Apps の位置づけ Web と Native の間を埋める PWA
  • 69. まとめ = • Service Worker • Web Application Manifest • Other.. Web + Native Apps This is good one!
  • 70. 参考 • Progressive Web Apps on Windows • Sonarwhal • PWA BUILDER • Building Progressive Web Apps for Windows devices : Build 2018 • Cboard: A Progressive Web App for Everyone
  • 71. © 2018 Microsoft Corporation. All rights reserved. 本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。