uniapp打包H5的时候 清楚缓存(不安装依赖的前提下)

问题

在写项目的时候,打包好一个H5 发布成功,后来又重新打包新的包进行更新迭代,但是用户手机上还是上一个版本,本地缓存还是没有清除。

解决问题

步骤一:html不缓存

在html中,解决缓存的方法主要是依赖以下标签的属性:

html 复制代码
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

这几个标签是什么意思呢:

js 复制代码
这几个标签的作用是禁用浏览器缓存,确保每次访问页面时都从服务器加载最新的内容。具体解释如下:

(1)<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />:
		这个标签设置了HTTP响应头中的Cache-Control属性,告诉浏览器不要缓存页面的任何部分,包括图片、脚本等。同时,要求浏览器在每次请求时都必须向服务器验证资源的新鲜度。
(2)<meta http-equiv="Pragma" content="no-cache" />:
		这个标签设置了HTTP响应头中的Pragma属性,它与Cache-Control类似,但主要用于HTTP/1.0协议。同样表示不缓存页面的任何部分。
(3)<meta http-equiv="Expires" content="0" />:
		这个标签设置了HTTP响应头中的Expires属性,它指定了页面的过期时间。设置为0表示页面立即过期,即每次都需要重新从服务器获取。

综合这三个标签,可以确保浏览器不会缓存页面的任何内容,从而确保用户总是看到最新的页面内容。

所以要保证打包时候生成的html具备这几个标签,就能保证用户每次请求的都是服务器是上最新版本的html文件

uniapp官方提供了一个东西叫做:index.html模板

就在manifest.json =>> web配置 =>> index.html模板路径:

在manifest.json同级目录下创建一个名为 :template.h5.html 的文件

文件内容如下所示:

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <!-- 由于自定义了meta标签想要实现自动化打包添加该标签,需要添加自定义html模板 -->
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <!-- 这个标签设置了HTTP响应头中的Cache-Control属性,告诉浏览器不要缓存页面的任何部分,包括图片、脚本等。同时,要求浏览器在每次请求时都必须向服务器验证资源的新鲜度。 -->
        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
		<!-- 这个标签设置了HTTP响应头中的Pragma属性,它与Cache-Control类似,但主要用于HTTP/1.0协议。同样表示不缓存页面的任何部分。 -->
        <meta http-equiv="Pragma" content="no-cache" />
		<!-- 这个标签设置了HTTP响应头中的Expires属性,它指定了页面的过期时间。设置为0表示页面立即过期,即每次都需要重新从服务器获取。 -->
        <meta http-equiv="Expires" content="0" />
        <title>
            <%= htmlWebpackPlugin.options.title %>
        </title>
        <script>
            var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
            document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')
        </script>
        <link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" />
    </head>
    <body>
        <!-- <noscript>
            <strong>Please enable JavaScript to continue.</strong>
        </noscript> -->
        <div id="app"></div>
        <!-- built files will be auto injected -->
    </body>
</html>

打包以后的index.html文件如下所示:已经包含了刚刚说的三行代码

步骤二:js不缓存

步骤一是解决了html不缓存的问题,但是解决不了js缓存的问题,就需要使用vue的打包机制来解决问题了。

vue.config.js文件是Vue项目的配置文件,用于自定义项目的配置选项。在这个文件中,你可以设置各种与构建、开发和部署相关的配置项,例如:

(1)修改webpack配置:可以对webpack进行个性化配置,如修改入口文件、输出目录、插件等。
	(2)开发服务器配置:可以配置开发服务器的端口号、代理设置等。
	(3)生产环境优化:可以开启代码压缩、分割等优化选项。
	(4)单元测试配置:可以配置单元测试工具(如Jest)的相关选项。
	(5)集成第三方库或插件:可以添加一些第三方库或插件的配置信息。
总之,vue.config.js文件可以让你更灵活地控制Vue项目的构建和运行过程。

所以,再项目的根目录下面创建一个vue.config.js文件:具体代码如下:

js 复制代码
let filePath = '';   // 默认文件路径
let TimeStamp = '';  // 时间戳
let Version = '-V1.0.0-'; // 版本号
//编译环境判断,可以根据不同环境来做相应的配置
if (process.env.UNI_PLATFORM === 'h5') {
  filePath = 'static/js/'
  TimeStamp = new Date().getTime();
  process.env.VUE_APP_INDEX_CSS_HASH=`${Version}${TimeStamp}`   //给css文件也使用该时间戳
}
 
module.exports = {
  configureWebpack: {
    output: { //重构文件名
      filename: `${filePath}[name].${Version}${TimeStamp}.js`, // index文件重命名为带有版本号+时间戳的格式
      chunkFilename: `${filePath}[name].${Version}${TimeStamp}.js` // static/js/pages-home-index.-V1-754654657.js  
    },
  },
}

这样配置保证每次打包后的js文件名和之前的文件名字都不一样,此时找不到文件名就会到服务器请求最新的文件,即可每次不会使用缓存文件

相关推荐
记得开心一点嘛24 分钟前
高并发处理 --- Caffeine内存缓存库
缓存·caffeine
栗子~~11 小时前
集成 jacoco 插件,查看单元测试覆盖率
缓存·单元测试·log4j
洗发水很好用13 小时前
uniApp打包H5发布到服务器(docker)
uni-app
YUJIAN。13 小时前
使用uniapp开发微信小程序-框架搭建
微信小程序·小程序·uni-app
Hello.Reader20 小时前
Redis热点数据管理全解析:从MySQL同步到高效缓存的完整解决方案
redis·mysql·缓存
麦香--老农1 天前
windows 钉钉缓存路径不能修改 默认C盘解决方案
缓存·钉钉
还这么多错误?!1 天前
uniapp微信小程序,使用fastadmin完成一个一键获取微信手机号的功能
微信小程序·小程序·uni-app
C++忠实粉丝1 天前
Redis 介绍和安装
数据库·redis·缓存
丰云1 天前
一个简单封装的的nodejs缓存对象
缓存·node.js
Oneforlove_twoforjob1 天前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存