taro框架转的h5,想在无网络状态下能够控制展现给用户的界面,使用客户端离线缓存能够达到目的,而且能够将静态资源进行缓存,从而减小白屏时间,加快页面相应速度。javascript
service worker是一段脚本,在后台运行。做为一个独立的线程,不会对页面形成阻塞。本质上充当Web应用程序与浏览器之间的代理服务器。native app能够作到离线使用、消息推送、后台自动更新,service worker的出现是正是为了使得web app也能够具备相似的能力。在线上必须在 HTTPS 环境下才能工做,或者本地localhost域名也是能够的。css
第一步选择npm包,我用的是sw-precache-webpack-plugin
这个包,基于webpack的插件,操做简单使用方便,详情请看文档
而后进行基于webpack的配置,下面例子是taro框架h5部分的配置内容java
h5: { publicPath: '/', staticDirectory: 'static', webpackChain(chain, webpack) { chain.plugin('sw') .use(require('sw-precache-webpack-plugin'), [{ cacheId: 'name', filename: 'service-worker.js', filepath: path.resolve(__dirname, '../src/service-worker.js'), // importScripts: [], // 需缓存的文件配置, 需动态缓存的放到runtimeCaching中处理 staticFileGlobs: [], mergeStaticsConfig: true, minify: true, verbose: true, runTimeCaching: [ // 页面动态文件 { urlPattern: /pages\/.*/, handler: 'networkFirst' }, { urlPattern: /api\/.*/, handler: 'networkFirst' } ] }] ); }, module: { postcss: { autoprefixer: { enable: true } } } }
ok,如今已经配置完了,下一步只要在入口文件里注册service-worker就行啦,我是在HTML里加的,代码以下:webpack
<script> (function () { if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./service-worker.js').then(function (registration) { // 注册成功 console.log('ServiceWorker registration successful with scope: ', registration.scope); }).catch(function (err) { // 注册失败 console.log('ServiceWorker registration failed: ', err); }); } })(); </script>
大功告成,如今能够在本地调试了,本地若是启动了webpack-dev-server,则须要:webpack添加配置:git
module.exports = { devServer: { setup: function (app) { app.get('/service-worker.js', function (req, res) { res.set({ 'Content-Type': 'application/javascript; charset=utf-8' }); res.send(fs.readFileSync('build/service-worker.js')); }); } } }
此时访问localhost就能够启用service-worker啦,若是配置了这些内容service-worker尚未注册成功的话,可能的缘由以下:github