在移动端,我们为了解决带宽限制或者网络缓慢等问题,常常会使用http协议缓存静态文件(http缓存简介),从而减少网络请求,加快首屏加载时间。缓存虽然给我们带来了性能上的优化,但是也会带来一些问题,如最常见的问题就是:系统升级后文件未更新,需要手动进行刷新。要解决这个问题,要分以下几种情况:

1、传统的多页面应用

我们一般使用时间戳或者版本号等标记html、css、js等文件,例如:原有的html文件为:index.html?v=1598443151546,系统升级后以时间戳为标志的html文件为:index.html?v=1599463092282,这样用户访问新的页面时,浏览器会返回新的文件。可以使用构建工具gulp、grunt等的对应的插件对静态文件进行自动化处理。

2、基于webpack单入口的单/多页面应用

现在流行的react、vue等框架都使用了虚拟DOM(virtual DOM)技术,html文件主要的作用是提供一个可以绑定的dom容器节点,所有的业务逻辑都在对应的编译后的js文件里面。所以单/多页面应用的html文件是利用html-webpack-plugin创建出来的,然后引入其他的js、css等文件。

webpack编译后的文件缓存策略和其hash有关,webpack有各种hash值,包括每次项目构建hash,不同入口的chunkhash、文件的内容contenthash,这么多hash,它们有什么区别呢?

hash

hash是跟整个webpack构建项目相关的,每次项目构建hash对应的值都是不同的,即使项目文件没有做“任何修改”。其实运行webpack打包都是有修改的,因为每次webpack打包编译都会注入webpack的运行时代码,导致整个项目有变化,所以每次hash值都会变化的。

chunkhash

chunkhash根据不同的入口文件(Entry)进行依赖文件解析、构建对应的chunk,生成对应的哈希值。在生产环境里把一些公共库和程序入口文件区分开,单独打包构建,接着我们采用chunkhash的方式生成哈希值,那么只要我们不改动公共库的代码,就可以保证其哈希值不会受影响。并且webpack4中支持了异步import功能,固chunkhash也作用于此,如下:

image

我们将各个模块的hash值 (除主干文件) 改为chunkhash,然后重新build一下,可得下图:

image

我们可以清晰地看见每个chunk模块的hash是不一样的了。

但是这样又有一个问题,因为我们是将样式作为模块import到JavaScript文件中的,所以它们的chunkhash是一致的,如test1.js和test1.css:

image

这样就会有个问题,只要对应css或则js改变,与其关联的文件hash值也会改变,但其内容并没有改变呢,所以没有达到缓存意义。固contenthash的用途随之而来。

contenthash

contenthash是针对文件内容级别的,只有你自己模块的内容变了,那么hash值才改变,所以我们可以通过contenthash解决上诉问题。如下:

image

2.1 js、css、图片等静态文件

由于webpack的特性,很容易配置好相关参数,使每次修改过js、css等文件后,引用的文件名称都会改变(例如上面的利用chunkhash设置文件名),浏览器请求对应的文件时都会重新获取,而不使用缓存。

2.2 html静态文件

因为html文件是通过html-webpack-plugin生成的,默认为index.html,一般情况下每次编译生成的文件名不会改变。所以有可能会出现,系统更新后,用户访问的index.html文件是缓存中保存的上次的文件,需要用户手动去刷新。

解决办法:

1、一般设置了静态文件的缓存,都会设置文件的协商缓存。所以每次请求下载文件时,都会返回一个http响应Last-Modified:文件修改时间1。用户访问文件会在http请求头带上If-Modify-Since:文件修改时间1,当后台发现文件在修改时间1之后都没有修改,会返回304,告诉客户端从缓存里面获取文件;当系统更新后,文件修改时间变为修改时间2,此时用户访问文件会在http请求头带上If-Modify-Since:文件修改时间1,后台会返回200,并且返回最新的文件,所以设置了协议缓存后,返回的html都是最新的文件。

2、按照协商缓存原则,设置了协议缓存后,不会出现修改后文件获取不到问题,但是由于移动端的客户端比较繁杂,内核不同,封装的方法千奇百怪,所有也可能会出现设置协商缓存后,更新文件后,还是获取缓存的文件问题。这时候可以尝试用强缓存去解决这个问题,在nginx配置,访问html文件时,强制不缓存:

设置所有的html文件强制不缓存:

location ~ .*.(htm|html)?$ {

add_header Cache-Control "no-store, no-cache";

}

设置某个目录下的html文件强制不缓存:

location /user {

if ($request_filename ~* .*\.(?:htm|html)$)

{

add_header Cache-Control "no-store, no-cache";

add_header Pragma no-cache;

add_header Expires 0;

}

}

参考目录:

app中html静态页面缓存,移动端index.html被缓存问题相关推荐

  1. 客户端相关知识学习(一)之混合开发,为什么要在App中使用H5页面以及应用场景、注意事项...

    混合开发 随着移动互联网的高速发展,常规的开发速度已经渐渐不能满足市场需求.原生H5混合开发应运而生,目前,市场上许多主流应用都有用到混合开发,例如支付宝.美团等.下面,结合我本人的开发经验,简单谈一 ...

  2. app 中嵌入H5页面,H5跳转H5页面的跳转实现

    app 中嵌入H5页面,H5跳转H5页面的跳转实现 模拟创建a标签,并将href给到a标签点击实现: 模拟创建a标签,并将href给到a标签点击实现: var a = document.createE ...

  3. uni 在app中引入h5页面(uni编写)

    关于在app中引入网页,使用的webview标签 相对于uniapp 官网给出的webview使用方法在这里https://uniapp.dcloud.io/component/web-view 但是 ...

  4. asp.net中关于静态页面生成的代码实例

    目前网页html静态化是利用其它的动态技术生成html静态页面,还不是静态网站.因为的确是这样的,生成html静态网页有一定的好处.      一.加快页面打开浏览速度,静态页面无需连接数据库教程打开 ...

  5. app 404 html,静态页面错误404(Flask框架)

    这是你准备好的代码索引.html在站点的根目录(例如http://example.com/):from flask import Flask # set the project root direct ...

  6. 微信小程序页面静态页是html,制作一个微信小程序中的静态页面

    要求: 1. 进入开发者工具并且创建一个测试小程序, 选择建立快速模板 2. 在pages目录底下新建一个first的文件夹,其中包括指定的四个文件,并且设置第一个页面为first页面 3.在firs ...

  7. app中我的页面头像及背景效果实现

    以上图片中含有2个动态效果:     1.蓝色背景有动画     2.头像中下部分的波浪也是动画 完整 html 页面代码如下: 注:头像中的笔是 iconfont,在此并未传入 iconfont 的 ...

  8. Hybrid App中原生页面 VS H5页面(分享)

    本文部分转自  http://www.jianshu.com/p/00ff5664e000 现有3类主流APP,分别为:Web App.Hybrid App(混合模式移动应用,Hybrid有" ...

  9. Android精华篇 - App中原生页面 VS H5页面

    现有3类主流APP,分别为:Web App.Hybrid App(混合模式移动应用,Hybrid有"混合的"意思). Native App(原生app,后面都用"原生ap ...

最新文章

  1. bigdecimal 设置_BigDecimal
  2. CMake基础 第5节 安装项目
  3. SHA256算法原理详解
  4. qdir 自动创建多级目录_QDir 类 - 目录信息类
  5. 蓝光三维扫描仪用于钢板焊接变形全尺寸测量
  6. html ol标签用罗马数字,HTML重点标签总结
  7. IIS部署,发布网站
  8. 用数据说话:北京房价数据背后的数据
  9. php生成分子式,php 转化smiles为分子式
  10. Linux 打印机移植说明
  11. 无限极分类JAVA 实现—查子孙树、家谱树
  12. 2021-10-01 REDIS全网最超级详细
  13. 强化学习之自然梯度法
  14. 工作中要怎么与同事相处呢?
  15. 深夜里学妹竟然问我会不会C?我直接把这篇文章甩她脸上(C Primer Plus 第六版基础整合)
  16. HDU3785寻找大富翁~~真真切切的水题
  17. 51单片机(九)LED点阵屏
  18. 哪位高手能帮小弟找个没有病毒能用的穿越火线自动准备刷分挂呀?
  19. 【树状数组or线段树】中山纪念中学暑期游Day5——开花
  20. k-prototypes聚类

热门文章

  1. 樱桃键盘驱动在哪下_手感还是信仰?樱桃Cherry MX8.0与MC 8.1军火箱键鼠套装体验点评...
  2. java在所选路径中找到分号,classpath
  3. python创建变量过程_Python 变量的创建过程详解
  4. yota3墨水屏设置_【YotaPhoneYOTA3评测】外观:没有全面屏但有墨水屏_YotaPhone YOTA 3_手机评测-中关村在线...
  5. python mysql批量更新_Python批量删除mysql中千万级大量数据的脚本分享
  6. SimUDuck 策略模式
  7. 二十九、电子商务服务推荐项目基本描述
  8. 最真实的办公自动化案例!
  9. 直接用IP访问知乎,我发现了一个秘密···
  10. python定积分_python定积分