相关文章推荐
坏坏的海龟  ·  Vue中用v-for遍历数据和使用axios ...·  昨天    · 
温暖的剪刀  ·  vue ...·  昨天    · 
高大的消防车  ·  vue ...·  昨天    · 
无聊的长颈鹿  ·  Vue3使用axios请求数据后使用v-fo ...·  昨天    · 
打篮球的煎饼  ·  渲染 Vue 组件列表 - 学习 Web ...·  昨天    · 
有腹肌的啄木鸟  ·  GPT-4 版“贾维斯”诞生,国外小哥用它 ...·  1 年前    · 
豪爽的酱肘子  ·  在sns.jointplot和plt.his ...·  1 年前    · 
玩手机的甜瓜  ·  c++中的void* - corineru ...·  1 年前    · 
调皮的草稿纸  ·  pyqt5-拖拽_51CTO博客_pyqt5 ...·  1 年前    · 
个性的木耳  ·  数据分析 - 决策树模型 - 掘金·  2 年前    · 
Code  ›  Vue 打包上线后的缓存问题开发者社区
软件 浏览器缓存 缓存服务器 vue
https://cloud.tencent.com/developer/article/1819746
性感的桔子
1 年前
作者头像
前端逗逗飞
0 篇文章

Vue 打包上线后的缓存问题

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 前端逗逗飞 > Vue 打包上线后的缓存问题

Vue 打包上线后的缓存问题

作者头像
前端逗逗飞
发布 于 2021-04-30 10:24:59
4.1K 0
发布 于 2021-04-30 10:24:59
举报

问题描述

大家用vue脚手架搭建前端工程时,常被缓存问题所困扰,具体的表现就是,当程序版本升级时,用户因为缓存访问的还是老的页面,然后很多同学很暴力的直接在index.html中加入了这几行代码:

<meta http-equiv="Expires" content="0">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Cache" content="no-cache">

升级时缓存问题倒解决了,但直接导致了用户每次访问你的程序时都要重新请求服务器,所有的静态资源都无法用缓存了,浪费流量,网络压力变大。

需求澄清

我们真正需要解决的问题,不是单纯的要缓存或者不要缓存,而是期望视情况而定:

  • 程序每次升级后,用户都不会因为缓存问题而执行的仍然是老的程序。
  • 若程序没升级,用户对静态资源的请求则能用到缓存。

解决原理

由于vue脚手架每次打包时,都会将打出的静态资源文件名加个哈希后缀,且index.html中引入时也加了对应的哈希后缀,所以每个版本的静态资源都是全新的,不用担心因升级导致的缓存问题。那么只需让index.html不缓存,且让其他静态资源缓存,就能实现要求。

让静态资源有缓存好办,问题在于怎么只让index.html不缓存。这里我们已经不能单单靠前端代码来实现了,需要用到服务器配置。通过服务器配置,来单独设置请求index.html时的header,以达到控制缓存的目的。

具体实现

如果你是Nginx:

Ngnix还是比较容易实现的,只需增加以下配置:

location = /index.html {
 add_header Cache-Control "no-cache, no-store";

修改webpack的配置文件

 configureWebpack: { // webpack 配置
        output: { // 输出重构  打包编译后的 文件名称  【模块名称.版本号.时间戳】
            filename: `static/js/[name].${process.env.VUE_APP_Version}.${Timestamp}.js`,
            chunkFilename: `static/js/[name].${process.env.VUE_APP_Version}.${Timestamp}.js`
onst Timestamp = new Date().getTime();
// Vue.config.js 配置选项
module.exports = {
    // publicPath:process.env.NODE_ENV === 'production' ? '/vue_workspac/aihuhuproject/' : '/',
    //基本路径
    publicPath: '/',//默认的'/'是绝对路径,如果不确定在根路径,改成相对路径'./'
    // 输出文件目录
    outputDir: 'dist',
    assetsDir: 'static',
    indexPath: 'index.html',
    // eslint-loader 是否在保存的时候检查
    lintOnSave: true,
    // 生产环境是否生成 sourceMap 文件
    productionSourceMap: false,
    // css相关配置
    css: {
        // 是否使用css分离插件 ExtractTextPlugin
        // extract: true,
        // 开启 CSS source maps?
        sourceMap: false,
    // webpack-dev-server 相关配置
    devServer: {
        open: true,//open 在devServer启动且第一次构建完成时,自动用我们的系统的默认浏览器去打开要开发的网页
        host: 'localhost',//默认是 localhost。如果你希望服务器外部可访问,指定如下 host: '0.0.0.0',设置之后之后可以访问ip地址
        port: 8080,
        hot: true,//hot配置是否启用模块的热替换功能,devServer的默认行为是在发现源代码被变更后,通过自动刷新整个页面来做到事实预览,开启hot后,将在不刷新整个页面的情况下通过新模块替换老模块来做到实时预览。
        https: false,
        hotOnly: false,// hot 和 hotOnly 的区别是在某些模块不支持热更新的情况下,前者会自动刷新页面,后者不会刷新页面,而是在控制台输出热更新失败
        proxy: {
            '/api': {
                target: 'http://localhost:8080', //目标接口域名
                secure: false, //false为http访问,true为https访问
                changeOrigin: true, //是否跨域
                pathRewrite: {
                    '^/api': '' //重写接口
        }, // 设置代理
        before: app => { }
    configureWebpack: { // webpack 配置
        output: { // 输出重构  打包编译后的 文件名称  【模块名称.版本号.时间戳】
            filename: `static/js/[name].${process.env.VUE_APP_Version}.${Timestamp}.js`,
            chunkFilename: `static/js/[name].${process.env.VUE_APP_Version}.${Timestamp}.js`
 
推荐文章
坏坏的海龟  ·  Vue中用v-for遍历数据和使用axios请求数据并遍历_vue3请求到接口数据如何遍历
昨天
温暖的剪刀  ·  vue v-for遍历获取对象的中文键值_vue key为中文怎么获取
昨天
高大的消防车  ·  vue v-for循环数据列表,点击获取循环列表当前项的某一项的数据,例如id_vuefor循环点击事件
昨天
无聊的长颈鹿  ·  Vue3使用axios请求数据后使用v-for显示不出数据_vue3 v-for 循环[object object]显示不出来写死就可以显示
昨天
打篮球的煎饼  ·  渲染 Vue 组件列表 - 学习 Web 开发 | MDN
昨天
有腹肌的啄木鸟  ·  GPT-4 版“贾维斯”诞生,国外小哥用它 4 分钟创建网站、聊天就能创建 GitHub repo…… - 腾讯云开发者社区-腾讯云
1 年前
豪爽的酱肘子  ·  在sns.jointplot和plt.hist2d内部实现plt.colorbar(plot colorbar inside the jointplot)_jaredyam的博客-CSDN博客
1 年前
玩手机的甜瓜  ·  c++中的void* - corineru - 博客园
1 年前
调皮的草稿纸  ·  pyqt5-拖拽_51CTO博客_pyqt5 combobox
1 年前
个性的木耳  ·  数据分析 - 决策树模型 - 掘金
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号