相关文章推荐
满身肌肉的高山  ·  vue 报错 ...·  3 月前    · 
谈吐大方的电池  ·  Vue的methods方法中调用另一个方法及 ...·  1 月前    · 
爱吹牛的香烟  ·  vue使用quill编辑器自定义附件上传方法 ...·  1 月前    · 
神勇威武的滑板  ·  android studio 执行adb命令-掘金·  2 年前    · 
深沉的鸡蛋面  ·  Content type ...·  2 年前    · 
文质彬彬的大象  ·  javascript - CSS mask ...·  2 年前    · 
Code  ›  Vue 打包上线后的缓存问题开发者社区
软件 浏览器缓存 缓存服务器 vue
https://cloud.tencent.com/developer/article/1819746
性感的桔子
2 年前
作者头像
前端逗逗飞
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 报错 ReferenceError: exports is not defined - 兔&&大梅
3 月前
谈吐大方的电池  ·  Vue的methods方法中调用另一个方法及this指向问题_vue中实现methods一个方法调用另外一个方法
1 月前
爱吹牛的香烟  ·  vue使用quill编辑器自定义附件上传方法,并根据上传附件名称生成链接_quill 上传附件
1 月前
神勇威武的滑板  ·  android studio 执行adb命令-掘金
2 年前
深沉的鸡蛋面  ·  Content type ‘multipart/form-data;boundary=------57031299820747271;charset=UTF-8‘ not supported的解决方案_No8g攻城狮的博客-CSDN博客
2 年前
文质彬彬的大象  ·  javascript - CSS mask 实现鼠标跟随镂空效果 - 前端侦探 - SegmentFault 思否
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号