# PWA 打包

PWAProgressive Web App 的英文缩写, 翻译过来就是 渐进式增强 WEB 应用, 是 Google 在2016年提出的概念,2017年落地的 web 技术。目的就是在移动端利用提供的标准化框架,在网页应用中实现和原生应用相近的用户体验的渐进式网页应用。

因为 PWA 涉及到知识点多,今天我们就简单讲一下 PWA 的在 webpack 中的打包,让大家有一个了解。

# 举个例子

当我们访问网页的时候,只有在有网的时候才能刷出相应的页面:

如果我们的服务器在某段时间奔溃或者我们断网了了,那么用户的页面也会刷新不出来东西,如下图:

有没有什么办法可以在这种情况下也可以正常的显示页面的,这个时候就可以用到 server-worker了。

# 写点代码

我们修改 index.js 文件,在页面中打印出 hello, this is darrell

const root = document.getElementById('root');
root.innerHTML = 'hello, this is darrell';

# 本地起一个服务

接着我们进行一次线上打包 npm run build,会生成一个 dist 目录,接着我们通过 http-server 来给我们本地起一个服务器

# 安装

npm install http-server -D

# 修改 package.json

我们在 scripts 下增加一个命令,以 dist 为目录起一个服务器。

...

"scripts": {
  "start": "http-server dist",
  "dev": "webpack-dev-server --config ./config/webpack.dev.js",
  "build": "webpack --config ./config/webpack.prod.js"
},

...

我们运行一下 npm start,可以看到我们本地起了一个服务器,页面也成功跑了起来:

# 配置 service-worker

PWA 底层用到的一个知识点就是 service-worker,我们可以使用谷歌提供的 workbox-webpack-plugin 一个插件,能非常方便的帮助我们实现 PWA

npm install workbox-webpack-plugin -D

接着修改线上配置文件 webpack.prod.js

...
const WorkboxPlugin = require('workbox-webpack-plugin');
...

const prodConfig = {
  ...
  plugins: [
    new WorkboxPlugin.GenerateSW({
      clientsClaim: true,
      skipWaiting: true
    })
  ],
  ...
}

...

接着我们重新打包一下,可以看到 dist 目录下多出了几个文件 service-worker.jsworkbox-***.js

说明已经帮助我们生成了相应的 service-worker 文件,接着我们在入口文件中进行相应的使用:

const root = document.getElementById('root');
root.innerHTML = 'hello, this is darrell';

if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/service-worker.js')
      .then(registration => {
        console.log('service-worker registed');
      }).catch(error => {
        console.log('service-worker register error');
    })
  })
}

我们重启服务 npm start,我们可以在浏览器中看到我们的配置已经起作用了,并且我们可以点开 chomreApplication 下的 Service Workers 选项,可以看到当前域名下的 service-worker 正在工作。

这个时候我们停止 http-server 服务,我们的页面还可以正常运行:

这是一个非常简单的例子,更多的 PWA 知识,我会贴几个网址,大家可以去相关网站学习。

# 框架中

现在主流的一些脚手架会自动帮我们集成 service-worker 这个功能,比如我们通过 create-react-app 初始化的项目,会自带 serviceWorker.js

# 相关链接

# 示例代码

示例代码可以看这里: