PWA网页通过Service Worker缓存网页资源,达到离线也能使用的效果。目前,Android WebView已经支持Service Worker。
不过,Service Worker技术存在一个问题,需要运行过一次,才能得到缓存效果。
如何让PWA网页首次启动,也有缓存效果?
我想到的一个方案是,在服务端预先执行Service Worker,获得缓存的资源,打成离线包,下发到客户端。
实现服务端执行Service Worker,首先想到使用 Node.js。Service Worker是基于js的,用Node来实现最合适。
其中,模拟 importScript
接口是一个难点。Service Worker用 importScript
,调用到外面的模块。
解决的办法是,采用node的 vm
作为Service Worker的容器。通过 runInContext
接口,执行Service Worker,或者注入 importScript
的模块。
// 初始化 vm context
global.swContext = vm.createContext(swGlobalScope);
...
// 执行Service Worker,或者注入 `importScript` 的模块
const script = new vm.Script(scriptContent);
script.runInContext(global.swContext);
service-worker-node
service-worker-node 已经开发完成,并发布到 npm。service-worker-node
提供了node的Service Worker执行环境。可以在服务端预先获取缓存列表,或者做一些自动化测试。
npm install service-worker-node
具体API使用参考:service-worker-node
网友评论