SlideShare a Scribd company logo
Service Workerとの戦い

実装編
ヤフー株式会社
マーケティングソリューションカンパニー

開発本部エクスペリエンスデザイン部テクニカルデザイン

柴田 和祈
photo by halfrain
2015.3.10 SCRIPTY#3 ∼フロントエンド紳士・淑女のための勉強会∼
柴田 和祈
@shibe97
Web Designer / Frontend Engineer
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Service Workerとは
‣ ブラウザのバックグラウンドで動作する
JavaScript環境
‣ フォアグラウンドとは別スレッド
‣ サーバへのリクエストをキャッチできる
‣ 動かせる環境は今のところ限られている

https://jakearchibald.github.io/isserviceworkerready/
‣ localhost、またはhttps環境でのみ動く
画面 サーバ画面 サーバ
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
画面 サーバ画面 サーバ
Service
Worker
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
画面 サーバ
Service
Worker
クライアントサイド サーバサイド
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
今日やりたいこと
‣ データのキャッシュ
‣ Ajax通信のモックテスト
‣ 値のバリデーションチェック
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
今日やりたいこと
‣ データのキャッシュ
‣ Ajax通信のモックテスト
‣ 値のバリデーションチェック
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Ajax通信のモックテストの流れ
1. Service Workerの登録
2. Ajax通信
3. Service Workerがリクエストをキャッチ
4. ダミーJsonを返す
5. 画面に表示
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Ajax通信のモックテスト
1. Service Workerの登録
navigator.serviceWorker.register(	
  
	
   "service-­‐worker.js",	
  
	
   {scope:	
  "./"}	
  
)	
  
.then(function(result){	
  
	
   //	
  登録成功	
  
})	
  
.catch(function(result){	
  
	
   //	
  登録失敗	
  
});
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
つまずきポイント#1
root
├── index.html
└── sw
└── test.json
test.jsonへのリクエストをキャッチしたいから

スコープを「/sw」にする
test.jsonへのリクエストをindex.htmlから行なうので

スコープを「/」にする
○
【スコープ】
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
つまずきポイント#1
‣ Service Workerはスコープ内からのリクエストを
キャッチする
‣ リクエスト先がスコープ内にあるかどうかは関係ない
‣ スコープを指定していない場合はルート以下

すべてがスコープとなる
【スコープ】
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Ajax通信のモックテスト
$.ajax({	
  
	
   url:	
  "/success",	
  
	
   dataType:	
  "json"	
  
})	
  
.done(function(result){	
  
	
   //	
  成功処理	
  
})	
  
.fail(function(result){	
  
	
   //	
  失敗処理	
  
});
2. Ajax通信
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Ajax通信のモックテスト
self.onfetch	
  =	
  function(event){	
  
	
   var	
  requestURL	
  =	
  new	
  URL(event.request.url);	
  
	
   if(requestURL.pathname.match("/success")){	
  
!
	
   	
   //	
  success以外のリクエストは素通りさせる	
  
!
	
   }	
  
};
3. Service Workerがリクエストをキャッチ
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
つまずきポイント#2
‣ リクエストのキャッチが可能な状態になるのは

ロードのタイミング
‣ ワーカーが登録されても、

リロードしなければリクエストはキャッチされない
‣ リロードすると、index.htmlのリクエストが

キャッチされ、本物のindex.htmlが取得できない
- URL判定でindex.htmlは素通りさせる必要がある
【リクエストのキャッチ】
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Ajax通信のモックテスト
var	
  result	
  =	
  [	
  
	
   {id:	
  1,	
  name:	
  "柴田",	
  mail:	
  "shibata@scripty.com"},	
  
	
   {id:	
  2,	
  name:	
  "小川",	
  mail:	
  "ogawa@scripty.com"},	
  
	
   {id:	
  3,	
  name:	
  "森本",	
  mail:	
  "morimoto@scripty.com"}	
  
];	
  
var	
  response	
  =	
  new	
  Response(JSON.stringify(result),	
  {	
  
	
   status:	
  200,	
  
	
   statusText:	
  "OK",	
  
	
   headers:	
  {	
  
	
   	
   "Content-­‐Type":	
  "application/json"	
  
	
   }	
  
});	
  
event.respondWith(response);
4. ダミーJSONを返す
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
つまずきポイント#3
‣ JSON形式で引数に渡してしまうと上手くいかない
ので、文字列に変換する
‣ ヘッダー情報を与える必要がある
‣ レスポンス処理が行なわれない場合は、予定通りの

fetchが行なわれる
【レスポンスの生成】
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Ajax通信のモックテスト
5. 画面に表示
$.ajax({	
  
	
   url:	
  "/success",	
  
	
   dataType:	
  "json"	
  
})	
  
.done(function(result){	
  
	
   //	
  成功処理	
  
})	
  
.fail(function(result){	
  
	
   //	
  失敗処理	
  
});
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
今日やりたいこと
‣ データのキャッシュ
‣ Ajax通信のモックテスト
‣ 値のバリデーションチェック
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
値のバリデーションチェックの流れ
1. Service Workerの登録
2. Ajax通信
3. Service Workerがリクエストをキャッチ
4. リクエストのパラメータをチェック
5. チェック結果を返す
6. 画面に表示
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
値のバリデーションチェック
1. Service Workerの登録
navigator.serviceWorker.register("service-­‐worker.js")	
  
.then(function(result){	
  
	
   //	
  登録成功	
  
})	
  
.catch(function(result){	
  
	
   //	
  登録失敗	
  
});
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
値のバリデーションチェック
$.ajax({	
  
	
   type:	
  "POST",	
  
	
   url:	
  "/success",	
  
	
   dataType:	
  "json",	
  
	
   data:	
  {	
  
	
   	
   name:	
  $("#input_name").val(),	
  
	
   	
   tel:	
  $("#input_tel").val()	
  
	
   }	
  
})	
  
.done(function(result){	
  
	
   //	
  成功処理	
  
})	
  
.fail(function(result){	
  
	
   //	
  失敗処理	
  
});
2. Ajax通信
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
値のバリデーションチェック
3. Service Workerがリクエストをキャッチ
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
self.onfetch	
  =	
  function(event){	
  
	
   var	
  requestURL	
  =	
  new	
  URL(event.request.url);	
  
	
   if(requestURL.pathname.match("/success")){	
  
!
	
   	
   //	
  処理	
  
!
	
   }	
  
};
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
値のバリデーションチェック
event.request.text().then(function(data){	
  
	
   var	
  jsonData	
  =	
  getConverted(data);	
  //	
  JSON形式に変換	
  
	
   var	
  errors	
  =	
  validate(jsonData);	
  //	
  バリデーション	
  
});	
  
!
var	
  validate	
  =	
  function(data){	
  
	
   var	
  errors	
  =	
  [];	
  
	
   if(data.name	
  ===	
  ""){	
  
	
   	
   errors.push("name:empty");	
  
	
   }	
  
	
   if(data.tel.match(/[^0-­‐9]+/)){	
  
	
   	
   errors.push("tel:notNumber");	
  
	
   }	
  
	
   //	
  等々	
  
	
  	
  	
  return	
  errors;	
  
};
4. リクエストのパラメータをチェック
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
つまずきポイント#4
‣ リクエストパラメータは event.request.text()
で取得する
‣ console.log で event の中身を見ても

パラメータが入っていない
【パラメータのチェック】
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
値のバリデーションチェック
5. チェック結果を返す
event.respondWith(	
  
	
   event.request.text().then(function(data){	
  
	
   	
   var	
  jsonData	
  =	
  getConverted(data);	
  
	
   	
   var	
  errors	
  =	
  validate(jsonData);	
  
	
   	
   return	
  new	
  Response(JSON.stringify(errors),	
  {	
  
	
   	
   	
   status:	
  200,	
  
	
   	
   	
   statusText:	
  "OK",	
  
	
   	
   	
   headers:	
  {	
  
	
   	
   	
   	
   "Content-­‐Type":	
  "application/json"	
  
	
   	
   	
   }	
  
	
   	
   });	
  
	
   })	
  
)	
  
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
つまずきポイント#5
‣ Promise後に respondWith() すると動かない
‣ respondWith() してからPromise処理
‣ respondWith() はonfetch内で1度しか使えない
【Promise処理とレスポンス作成】
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
まとめ
‣ スコープの指定には注意が必要

スコープ内では特定のリクエストのみキャッチさせる
‣ リクエストのキャッチが可能な状態になるのは

ロードのタイミング
‣ リクエストパラメータは event.request.text() 

で取得する
‣ Promise処理は respondWith() の後で行なう
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
参考資料
‣ Google Chromeサンプル

https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker
‣ Service Workerの紹介

http://www.html5rocks.com/ja/tutorials/service-worker/introduction/
‣ Service Workerを使ったXHRのモックテスト

http://jxck.hatenablog.com/entry/response-injection
‣ スペシャルアドバイザー @nhiroki_氏
!

More Related Content

PDF
20201111 AWS Black Belt Online Seminar AWS CodeStar & AWS CodePipeline
PDF
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
PDF
ドメイン駆動設計のための Spring の上手な使い方
PDF
20190514 AWS Black Belt Online Seminar Amazon API Gateway
PDF
関数型プログラミングのデザインパターンひとめぐり
PDF
フリーでやろうぜ!セキュリティチェック!
PDF
AWS初心者向けWebinar AWS上でのDDoS対策
PDF
20200826 AWS Black Belt Online Seminar AWS CloudFormation
20201111 AWS Black Belt Online Seminar AWS CodeStar & AWS CodePipeline
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
ドメイン駆動設計のための Spring の上手な使い方
20190514 AWS Black Belt Online Seminar Amazon API Gateway
関数型プログラミングのデザインパターンひとめぐり
フリーでやろうぜ!セキュリティチェック!
AWS初心者向けWebinar AWS上でのDDoS対策
20200826 AWS Black Belt Online Seminar AWS CloudFormation

What's hot (20)

PDF
20200422 AWS Black Belt Online Seminar Amazon Elastic Container Service (Amaz...
PPTX
イベント・ソーシングを知る
PDF
AWS Black Belt Online Seminar 2017 Amazon DynamoDB
PDF
Infrastructure as Code (IaC) 談義 2022
PDF
年間1,000万件のアラートを自動処理してみた
 
PPTX
テストコードの DRY と DAMP
PDF
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
PPTX
Azure Api Management 俺的マニュアル 2020年3月版
PDF
JJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty
PDF
AWSのセキュリティについて
PDF
TDD のこころ
PDF
解説!30分で分かるLEAN ANALYTICS
PDF
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
PDF
マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017
PDF
IoT時代到来における「薬事法」
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
20190220 AWS Black Belt Online Seminar Amazon S3 / Glacier
PPTX
Azure AD による Web API の 保護
PDF
Burp Suite 2.0触ってみた
PDF
大規模レガシー環境に立ち向かう有機的な開発フォーメーション #devsumi #devsumic
20200422 AWS Black Belt Online Seminar Amazon Elastic Container Service (Amaz...
イベント・ソーシングを知る
AWS Black Belt Online Seminar 2017 Amazon DynamoDB
Infrastructure as Code (IaC) 談義 2022
年間1,000万件のアラートを自動処理してみた
 
テストコードの DRY と DAMP
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
Azure Api Management 俺的マニュアル 2020年3月版
JJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty
AWSのセキュリティについて
TDD のこころ
解説!30分で分かるLEAN ANALYTICS
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017
IoT時代到来における「薬事法」
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
20190220 AWS Black Belt Online Seminar Amazon S3 / Glacier
Azure AD による Web API の 保護
Burp Suite 2.0触ってみた
大規模レガシー環境に立ち向かう有機的な開発フォーメーション #devsumi #devsumic
Ad

Similar to Service Workerとの戦い ~ 実装編 ~ #scripty03 (20)

PDF
API通信周りの継続的なテストの仕組み~SideCIでの実践~
PDF
Pro aspnetmvc3framework chap19
PDF
Ajax 応用
PDF
Visualforce + jQuery
PDF
Service worker が拓く mobile web の新しいかたち
PPTX
【A2iセミナー】できることからやってみたスマートフォン・Twitterのアクセス解析
PDF
Angularreflex20141210
PPTX
オフラインファーストの思想と実践
PDF
Google Apps Scirpt勉強会 #1
PDF
フレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃう
PDF
SeleniumE2Eテストフレームワークを使用したテスト自動化事例 #Seleniumjp
PDF
経営を支えるIT部門実現の記録2005
PPTX
徳丸本に載っていないWebアプリケーションセキュリティ
PDF
【17-B-6】RIAの性能テストとアプリケーション品質向上のための管理手法
PDF
SocialWeb Conference vol.5 OpenSocial Night #2
PDF
RESTful開発フロントエンド編(SPA・AltJS・フレームワーク)
PDF
Ajax basic
PDF
大(中)規模Java script開発について
PDF
Using Ext Direct with SenchaTouch2
API通信周りの継続的なテストの仕組み~SideCIでの実践~
Pro aspnetmvc3framework chap19
Ajax 応用
Visualforce + jQuery
Service worker が拓く mobile web の新しいかたち
【A2iセミナー】できることからやってみたスマートフォン・Twitterのアクセス解析
Angularreflex20141210
オフラインファーストの思想と実践
Google Apps Scirpt勉強会 #1
フレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃう
SeleniumE2Eテストフレームワークを使用したテスト自動化事例 #Seleniumjp
経営を支えるIT部門実現の記録2005
徳丸本に載っていないWebアプリケーションセキュリティ
【17-B-6】RIAの性能テストとアプリケーション品質向上のための管理手法
SocialWeb Conference vol.5 OpenSocial Night #2
RESTful開発フロントエンド編(SPA・AltJS・フレームワーク)
Ajax basic
大(中)規模Java script開発について
Using Ext Direct with SenchaTouch2
Ad

More from Yahoo!デベロッパーネットワーク (20)

PDF
ゼロから始める転移学習
PDF
継続的なモデルモニタリングを実現するKubernetes Operator
PDF
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
PDF
オンプレML基盤on Kubernetes パネルディスカッション
PDF
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
PDF
Persistent-memory-native Database High-availability Feature
PDF
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
PDF
eコマースと実店舗の相互利益を目指したデザイン #yjtc
PDF
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
PDF
ビッグデータから人々のムードを捉える #yjtc
PDF
サイエンス領域におけるMLOpsの取り組み #yjtc
PDF
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
PDF
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
PDF
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PDF
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PDF
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
PDF
「新しいおうち探し」のためのAIアシスト検索 #yjtc
PDF
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ゼロから始める転移学習
継続的なモデルモニタリングを実現するKubernetes Operator
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Persistent-memory-native Database High-availability Feature
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
eコマースと実店舗の相互利益を目指したデザイン #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
ビッグデータから人々のムードを捉える #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc

Service Workerとの戦い ~ 実装編 ~ #scripty03

  • 2. 柴田 和祈 @shibe97 Web Designer / Frontend Engineer Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 3. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 Service Workerとは ‣ ブラウザのバックグラウンドで動作する JavaScript環境 ‣ フォアグラウンドとは別スレッド ‣ サーバへのリクエストをキャッチできる ‣ 動かせる環境は今のところ限られている
 https://jakearchibald.github.io/isserviceworkerready/ ‣ localhost、またはhttps環境でのみ動く
  • 4. 画面 サーバ画面 サーバ Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 5. 画面 サーバ画面 サーバ Service Worker Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 6. 画面 サーバ Service Worker クライアントサイド サーバサイド Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 7. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 今日やりたいこと ‣ データのキャッシュ ‣ Ajax通信のモックテスト ‣ 値のバリデーションチェック
  • 8. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 今日やりたいこと ‣ データのキャッシュ ‣ Ajax通信のモックテスト ‣ 値のバリデーションチェック
  • 9. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 Ajax通信のモックテストの流れ 1. Service Workerの登録 2. Ajax通信 3. Service Workerがリクエストをキャッチ 4. ダミーJsonを返す 5. 画面に表示
  • 10. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 Ajax通信のモックテスト 1. Service Workerの登録 navigator.serviceWorker.register(     "service-­‐worker.js",     {scope:  "./"}   )   .then(function(result){     //  登録成功   })   .catch(function(result){     //  登録失敗   }); Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 11. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 つまずきポイント#1 root ├── index.html └── sw └── test.json test.jsonへのリクエストをキャッチしたいから
 スコープを「/sw」にする test.jsonへのリクエストをindex.htmlから行なうので
 スコープを「/」にする ○ 【スコープ】
  • 12. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 つまずきポイント#1 ‣ Service Workerはスコープ内からのリクエストを キャッチする ‣ リクエスト先がスコープ内にあるかどうかは関係ない ‣ スコープを指定していない場合はルート以下
 すべてがスコープとなる 【スコープ】
  • 13. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 Ajax通信のモックテスト $.ajax({     url:  "/success",     dataType:  "json"   })   .done(function(result){     //  成功処理   })   .fail(function(result){     //  失敗処理   }); 2. Ajax通信 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 14. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 Ajax通信のモックテスト self.onfetch  =  function(event){     var  requestURL  =  new  URL(event.request.url);     if(requestURL.pathname.match("/success")){   !     //  success以外のリクエストは素通りさせる   !   }   }; 3. Service Workerがリクエストをキャッチ Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 15. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 つまずきポイント#2 ‣ リクエストのキャッチが可能な状態になるのは
 ロードのタイミング ‣ ワーカーが登録されても、
 リロードしなければリクエストはキャッチされない ‣ リロードすると、index.htmlのリクエストが
 キャッチされ、本物のindex.htmlが取得できない - URL判定でindex.htmlは素通りさせる必要がある 【リクエストのキャッチ】
  • 16. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 Ajax通信のモックテスト var  result  =  [     {id:  1,  name:  "柴田",  mail:  "shibata@scripty.com"},     {id:  2,  name:  "小川",  mail:  "ogawa@scripty.com"},     {id:  3,  name:  "森本",  mail:  "morimoto@scripty.com"}   ];   var  response  =  new  Response(JSON.stringify(result),  {     status:  200,     statusText:  "OK",     headers:  {       "Content-­‐Type":  "application/json"     }   });   event.respondWith(response); 4. ダミーJSONを返す Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 17. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 つまずきポイント#3 ‣ JSON形式で引数に渡してしまうと上手くいかない ので、文字列に変換する ‣ ヘッダー情報を与える必要がある ‣ レスポンス処理が行なわれない場合は、予定通りの
 fetchが行なわれる 【レスポンスの生成】
  • 18. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 Ajax通信のモックテスト 5. 画面に表示 $.ajax({     url:  "/success",     dataType:  "json"   })   .done(function(result){     //  成功処理   })   .fail(function(result){     //  失敗処理   }); Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 19. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 今日やりたいこと ‣ データのキャッシュ ‣ Ajax通信のモックテスト ‣ 値のバリデーションチェック
  • 20. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 値のバリデーションチェックの流れ 1. Service Workerの登録 2. Ajax通信 3. Service Workerがリクエストをキャッチ 4. リクエストのパラメータをチェック 5. チェック結果を返す 6. 画面に表示
  • 21. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 値のバリデーションチェック 1. Service Workerの登録 navigator.serviceWorker.register("service-­‐worker.js")   .then(function(result){     //  登録成功   })   .catch(function(result){     //  登録失敗   }); Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 22. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 値のバリデーションチェック $.ajax({     type:  "POST",     url:  "/success",     dataType:  "json",     data:  {       name:  $("#input_name").val(),       tel:  $("#input_tel").val()     }   })   .done(function(result){     //  成功処理   })   .fail(function(result){     //  失敗処理   }); 2. Ajax通信 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 23. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 値のバリデーションチェック 3. Service Workerがリクエストをキャッチ Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 self.onfetch  =  function(event){     var  requestURL  =  new  URL(event.request.url);     if(requestURL.pathname.match("/success")){   !     //  処理   !   }   };
  • 24. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 値のバリデーションチェック event.request.text().then(function(data){     var  jsonData  =  getConverted(data);  //  JSON形式に変換     var  errors  =  validate(jsonData);  //  バリデーション   });   ! var  validate  =  function(data){     var  errors  =  [];     if(data.name  ===  ""){       errors.push("name:empty");     }     if(data.tel.match(/[^0-­‐9]+/)){       errors.push("tel:notNumber");     }     //  等々        return  errors;   }; 4. リクエストのパラメータをチェック Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 25. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 つまずきポイント#4 ‣ リクエストパラメータは event.request.text() で取得する ‣ console.log で event の中身を見ても
 パラメータが入っていない 【パラメータのチェック】
  • 26. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 値のバリデーションチェック 5. チェック結果を返す event.respondWith(     event.request.text().then(function(data){       var  jsonData  =  getConverted(data);       var  errors  =  validate(jsonData);       return  new  Response(JSON.stringify(errors),  {         status:  200,         statusText:  "OK",         headers:  {           "Content-­‐Type":  "application/json"         }       });     })   )   Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
  • 27. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 つまずきポイント#5 ‣ Promise後に respondWith() すると動かない ‣ respondWith() してからPromise処理 ‣ respondWith() はonfetch内で1度しか使えない 【Promise処理とレスポンス作成】
  • 28. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 まとめ ‣ スコープの指定には注意が必要
 スコープ内では特定のリクエストのみキャッチさせる ‣ リクエストのキャッチが可能な状態になるのは
 ロードのタイミング ‣ リクエストパラメータは event.request.text() 
 で取得する ‣ Promise処理は respondWith() の後で行なう
  • 29. Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 参考資料 ‣ Google Chromeサンプル
 https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker ‣ Service Workerの紹介
 http://www.html5rocks.com/ja/tutorials/service-worker/introduction/ ‣ Service Workerを使ったXHRのモックテスト
 http://jxck.hatenablog.com/entry/response-injection ‣ スペシャルアドバイザー @nhiroki_氏 !