ホーム DoRuby ServiceWorkerを使う
ServiceWorkerを使う
 

ServiceWorkerを使う

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Service Workerは、ブラウザ上でWebページを表示していない時にでも実行できるスクリプトです。 GoogleのPWA(Progressive Web Apps)の実装に不可欠な技術ですが、ブラウザでスマホアプリのようなPush通知を実装したWeb Push機能に必須の機能です。 今回は簡単にServiceWorkerを試してみます。

ServiceWorkerが使えるか確認してみる

対応しているブラウザ: Chrome、Firefox、Opera
対応しているOS: Windows、macOS、Android

現段階では、WindowsのIEやEdge、iOSの全てのブラウザで使うことができません。
日本のシェアを考えるとiOS非対応なのはとてもネック・・・

ちなみに、対応しているブラウザかを調べるには、
navigator.serviceWorker
が定義されているかを確認します。

さて、ブラウザの開発ツールのコンソールから次のコマンドを実行してみます。

対応しているブラウザ(Chrome)だと
enter image description here

ServiceWorkerContainerというオブジェクトを返します。
このオブジェクトはサービスワーカの登録・解除・状態の取得などの機能を提供しています。

対応していないブラウザ(Safari)だと
enter image description here

undefinedが返ってしまいました。ダメだこりゃ。

ServiceWorkerを使うまでの準備

必要なもの

  • ServiceWorkerのJavaScriptスクリプト
  • インストールするためのJavaScriptコードを含んだHTMLページ
  • SSLまたはlocalhostでアクセス可能なWebサーバ

ServiceWorkerの実体

単なるJavaScriptスクリプトですが、
決められたイベントのうち扱いたいものを追加するだけ、というシンプルなものです。

対応している主なイベントは

  • install
  • activate
  • fetch
  • message
  • push

今回は、GlobalFetch.fetch メソッドが呼ばれたときに、コンソールにメッセージを出すというプログラムです。

self.addEventListener("fetch", function(event) {
   console.log("fetchメソッドが呼ばれたよ!");
});

今回はこのファイルを serviceworker.js という名前で保存します。

ServiceWorkerをインストールする

次に、ServiceWorkerをコントロールしたいサイトでインストールします。

ServiceWorkerContainerregister()メソッドを使います。

navigator.serviceWorker.register("serviceworker.js").then(function(registration) {
  console.log("登録されたよ!");
});

これを含んだHTMLファイル(index.html)を置いて、localhostにサーバをたてて試してみましょう。

簡単なwebサーバならば nodejsで動作する node-web-server が便利です。

インストールは

npm install -g node-web-server

で、起動はHTMLのおいてあるディレクトリで

nws

そして起動します。

http://localhost:8080/

enter image description here

無事インストールが完了しました。

ServiceWorkerがインストールされているかは、開発者ツールでも確認できます。

Firefoxの場合は、 ツール>ウェブ開発>Service Worker または about:debugging#workers
Chromeの場合は、 chrome://serviceworker-internals/

enter image description here

ServiceWorkerにイベントを処理してもらう

fetch リクエストのハンドラをかいたので、実際にfetchを呼び出してみます。

navigator.serviceWorker.register("serviceworker.js").then(function(registration) {
  console.log("登録されたよ!");
  fetch("sample.txt");
});

sample.txtは適当に作成してください。

enter image description here

ServiceWorkerが処理していますね。

記事を共有

最近人気な記事