PWA: 渐进式网络开发应用程序,离线可访问
安装插件workbox-webpack-plugin
npm i workbox-webpack-plugin -D
server.js
const express = require('express');
const app = express();
app.use( express.static('dist', { maxAge: 10000 * 3600}));
app.listen(3000);
// http://127.0.0.1:3000
修改 webpack.config.js
//引用Node.js中的path模块,处理文件路径的小工具
const path = require("path");
//引入插件
const HtmlwebpackPlugin = require("html-webpack-plugin")
const WorkboxWebpackPlugin = require("workbox-webpack-plugin")
// 导出一个webpack具有特殊属性配置的对象
module.exports = {
mode: "development" ,
//多入口
entry: "./src/js/index.js" ,
//出口是对象
output: {
//path是一个绝对路径,__dirname 是当前js的绝对路径
path: path.join(__dirname , "./dist/"), //打包的结果文件存储目录
filename : "[name].[hash:10].js" //打包的结果文件名
},module:{ //模块
rules: [ // 规则
]
},
//配置插件
plugins: [
new HtmlwebpackPlugin({
//此插件作用是将 index.html打包到bundle.js所在目录中
//同时会在 index.html中自动的在<script>引入 bundle.js
template : "./src/index.html"
}),
new WorkboxWebpackPlugin.GenerateSW({
/*
1. 帮助 serviceworker快速启动
2. 删除就的serviceworker
生成一个servicewoker 配置文件
*/
clientsClaim: true,
skipWaiting: true
})
]
// 可以将node_modeles中代码单独打包成一个chunk最终输出
, optimization: {
splitChunks: {
chunks: "all"
}
}
}
修改 index.js
console.log("--- load index.js ---");
//import {add2, sub} from "./test"
document.getElementById("btn").onclick = function(){
// 懒加载
// 预加载
import( /* webpackChunkName: 'test' , webpackPrefetch: true */'./test')
.then( ({add2}) => {
console.log( add2(2,3))
});
}
if('serviceWorker' in navigator){
window.addEventListener('load', () => {
navigator.serviceWorker
.register('/service-worker.js')
.then( () => {
console.log('sw 注册成功了');
})
.catch( () => {
console.log('sw 注册失败了');
});
}) ;
}
运行 npm run build
,然后运行 node server.js
访问 http://127.0.0.1:3000
离线访问
关于作者
王硕,网名信平,十多年软件开发经验,业余架构师,精通Java/Python/Go等,喜欢研究技术,著有《PyQt 5 快速开发与实战》《Python 3.* 全栈开发》,多个业余开源项目托管在GitHub上,欢迎微博交流。