前回の続きです。
今回は、Vue.dart を紹介する予定でしたが、
※ 当初はBuildRunner を 紹介して、 同等のものが作れる知識を得てもらった上で、Vue.dart の コードを解説しようと思っていたのですが..
PWA.dart解説のキリが良さそうなので、PWAの解説をします。
一応、これが、 最後の予定
Index
(1) Hello World PWA
(2) Add to Home
(3) Standard Web Notification
(4) Hook request and Do original processing
(5) Post message
Code
https://github.com/kyorohiro/memo_pwa_2018
今回は、 Background で動作している ServiceWorker と、 Front で動作している JavaScript と 通信する方法について紹介します。
Worker
Workder を使うことで、 Background Task を 簡単に作ることができます。 Front と通信して、別Thread でアレコレすることができます。
ServiceWorker も Worker なので、 Front ろと通信することが可能です。
通信してみる
ボタンを押すと、Backgroundにメッセージを送信する
import 'package:service_worker/window.dart' as sw;
import 'dart:html' as html;
main() async {
if(!sw.isSupported) {
print(">> service worker is not support ");
return;
}
print(">> service worker is support ");
await sw.register("sw.dart.js");
sw.onMessage.listen((sw.MessageEvent e) {
print(">> receive: ${e.data} ");
});
html.querySelector("#btn").onClick.listen((html.MouseEvent e){
sw.controller.postMessage("Hello,World");
});
}
ECHOサーバーを作成する
import 'package:service_worker/worker.dart' as sw;
void main() {
String cacheName = "v0.0.1";
sw.onInstall.listen((sw.InstallEvent e) async {
e.waitUntil(sw.skipWaiting()); // Activate worker immediately
});
sw.onActivate.listen((sw.ExtendableEvent e){
print("##>> activate");
// https://stackoverflow.com/questions/38168276/navigator-serviceworker-controller-is-null-until-page-refresh
e.waitUntil(sw.clients.claim()); // Become available to all pages
});
//
// message
//
sw.onMessage.listen((sw.ExtendableMessageEvent e){
sw.clients.matchAll().then((List<sw.ServiceWorkerClient> cls) {
cls.forEach((sw.ServiceWorkerClient cl){
print("receive: ${e.data} : ${e.source.toString()}");
cl.postMessage(e.data);
});
});
});
}
確認
サーバーを起動
webdev serve --release
ブラウザーでアクセス
ボタンを押す
Ref
2018年12月の時点の、動くように改造した物を、以下に起きましたしました。
https://github.com/kyorohiro/memo_pwa_2018
https://github.com/kyorohiro/pwa
https://github.com/kyorohiro/service_worker
PS
https://github.com/isoos/pwa が masterブランチで、
一部、動かなかったので、フォークして修正しています。
https://github.com/kyorohiro/pwa
今回は、修正したものを使用しています。
次回
Firebase とか WASMとの連携とか
Web Bluetooth とか
PWA用のStorage とか
おわり