LoginSignup
16
16

More than 5 years have passed since last update.

ServiceWorkerを使った非同期通信のテスト

Posted at

非同期通信のテストをする方法はいろいろありますが
今回はServiceWorkerを使った方法を紹介します

ServiceWorkerとは

  • ブラウザのバックグラウンドで動くJavaScript環境
  • サーバへのリクエストをキャッチしてゴニョゴニョできる
  • localhost、https環境でしか動かない

クライアント側にプロキシサーバがある感じです

ChromeのBeta版で使えるようになったプッシュ通知も
ServiceWorkerを使うことで実現してます
http://updates.html5rocks.com/2015/03/push-notificatons-on-the-open-web

まだ対応してるブラウザが少ないので使う時は注意
http://caniuse.com/#search=serviceworker

テスト方法

1.ServiceWorkerの登録

navigator.serviceWorker.registerで登録

index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <button id="btn-ajax">Ajax</button>
        <script>
            document.addEventListener('DOMContentLoaded', function() {
                var btnAjax = document.getElementById('btn-ajax');
                btnAjax.addEventListener('click', function() {
                    var xhr = new XMLHttpRequest();
                    xhr.open('GET', '/test');
                    xhr.responseType = 'application/json';
                    xhr.send();

                    xhr.onload = function(e) {
                        switch (xhr.status) {
                            case 200:
                                console.log(xhr.responseText);
                                break;
                            default:
                                console.log(xhr.statusText);
                                break;
                        }
                    };
                }, false);

                navigator.serviceWorker.register(
                    'service-worker.js',
                    { scope: '/' }
                )
                .then(function(result) {
                    // 登録成功
                })
                .catch(function(result) {
                    // 登録失敗
                });
            }, false);
        </script>
    </body>
</html>

2.ServiceWorkerの処理を設定

service-worker.js
self.onfetch = function(event) {
    var requestURL = new URL(event.request.url);
    // ↓指定のリクエストが来た時だけ処理する
    if (requestURL.pathname.match('/test')) {
        var result = [
            { id: 1, name: 'aaaaa', mail: 'aaaaa@gmail.com' },
            { id: 2, name: 'bbbbb', mail: 'bbbbb@gmail.com' },
            { id: 2, name: 'ccccc', mail: 'ccccc@gmail.com' },
        ];

        var response = new Response(JSON.stringify(result), {
            status: 200,
            statusText: 'OK',
            headers: {
                'Content-Type': 'application/json'
            }
        });
        event.respondWith(response);
    }
};

上記の例で言うと、http://localhost/test にアクセスが来た時だけ
処理するようになってます

3.テスト

Ajaxボタンを押すとhttp://localhost/test にリクエストがいって
ServiceWorkerからレスポンスが返ってきます
レスポンスを作る際にJSON形式の文字列で渡さないと
うまくいかないので注意

result.png

デバッグ方法

chrome://serviceworker-internals/を開くと下記のページが表示されるので

setting.png

赤で囲んだ部分をチェックする
あとは、通常のWebページと同じようなインスペクタのウィンドウが開くので
ServiceWorkerのデバッグが可能です

inspector.png

こんな感じでサーバなしで非同期通信のテストが可能です

16
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
16