A Vue.js project
- webpack 升级到 4.x
- 上线后程序刷新一次浏览器,来使用新上线资源
- 将vue spa项目运行在docker的nginx容器中
https://juejin.im/post/5b0a6d366fb9a07aa213d16a
此解决方案不是最佳,请用最佳方案:nginx配置来实现:ant-design/ant-design-pro#1365 (comment)
- 解决了什么问题? spa项目新上线后,登陆有效期内用户,可以马上使用新上线资源。
- 原理: 路由切换时,判断如果是新上线,程序刷新下浏览器。
- 实现步骤:
- 打包时产生一个json文件:static/json/build_str.json
- localStorage中存入值:build_str
- 每个路由切换时,从接口获得新打包后json中的字符串,与localStorage中存的上次打包字符串比较,不相同时刷新
- 代码修改的地方:
- 相应目录下,新建文件:static/json/build_str.json
- build/build.js 修改:
// 将当前时间戳写入json文件
let json_obj = {"build_str": new Date().getTime().toString()}
fs.writeFile(path.resolve(__dirname, '../static/json/build_str.json'), JSON.stringify(json_obj), function (err) {
if (err) {
return console.error(err);
}
console.log("打包字符串写入文件:static/json/build_str.json,成功!");
realBuild()
})
- src/main.js 修改:
router.beforeEach((to, from, next) => {
axios.get('/static/json/build_str.json?v=' + new Date().getTime().toString())
.then(res => {
let newBuildStr = res.data.build_str
let oldBuildStr = localStorage.getItem('build_str') || ''
if (oldBuildStr !== newBuildStr) {
console.log('auto refresh')
localStorage.setItem('build_str', newBuildStr)
location.reload()
}
})
next()
})
- 安装docker
- 下载nginx镜像(
[:tag]
:是具体的nignx版本,比如::1.15.7
;默认从 https://hub.docker.com/ 下载镜像):
docker pull nginx[:tag]
- 运行命令打包项目:
npm run build
- 编写nginx的配置文件(文件在本项目中位置:
nginx/default.conf
) - 在当前目录下运行 docker 命令(
[:tag]
部分,需要替换成具体的值):
docker run -p 9081:80 -v $PWD/dist/:/usr/share/nginx/dist/ -v $PWD/nginx/default.conf:/etc/nginx/conf.d/default.conf -d nginx[:tag]
- 宿主机(就是本机)访问项目网址:http://localhost:9081/
参数 | 说明 |
---|---|
-v, --volume value:Bind mount a volume (default []) | 宿主机会覆盖容器内文件 |
-p, --publish value:Publish a container's port(s) to the host (default []) | 宿主机端口对应容器内端口 |
-d, --detach:Run container in background and print container ID | 保持容器在后台持续运行;后续可以使用`docker exec -it <容器名 |
- vue-cli 3.x 拉取 2.x 模板 (旧版本):https://cli.vuejs.org/zh/guide/creating-a-project.html#%E6%8B%89%E5%8F%96-2-x-%E6%A8%A1%E6%9D%BF-%E6%97%A7%E7%89%88%E6%9C%AC
# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build
# build for production and view the bundle analyzer report
npm run build --report
For a detailed explanation on how things work, check out the guide and docs for vue-loader.