当前位置: 首页 > 网络应用技术

微信迷你程序Web视图缓存问题和解决方案

时间:2023-03-08 18:47:19 网络应用技术

  微信中的Web视图嵌入了H5页面中。更新H5页面并重新设计后,Web视图访问仍然是上一页。

  在本地调试中,我们可以清除开发人员工具的缓存功能。如果是移动访问权限,我们可以重新输入小程序以实现清除缓存的效果,但是不可能让我们的用户以这种方式运行,因此我们将分析接下来的这种情况的原因和相应的解决方案。

  如果您想直接看到解决方案,可以拉到底部

  此类页面已更新,但是当访谈仍然是旧版本时,我们可以轻松地关联页面缓存的影响:当第一次访问页面时,客户端会减慢cache.us中的页面contentContent。我们的单页应用程序缓存通常是两个方面。

  入口HTML文件缓存的缓存是我们的HTML本身的内容已被缓存,包括引入的静态资源路径。由于在单个页面应用程序中,我们所有的内容均由入口HTML介绍的JS文件加载。如果html被缓存,那么即使我们更改页面内容,它仍然是之前的。LET验证我们的猜想。

  验证1.首先通过Web视图访问我们的H5页面,并通过Web-View调试工具检查入口HTML文件的内容,如下:

  2.修改入口HTML文件的内容

  例如:在HTML的头部添加元标签

  3.重新出版H5

  此时,请访问通过Applet Web-Video的页面,并通过调试工具检查页面代码。我发现头部没有新的Meta标签。

  通过Web-View调试工具,我们还可以发现第二页访问是直接的本地缓存。

  在这一点上,我们可以得出结论,入口HTML文件已被缓存。?

  进一步验证1.修改任何组件中的内容(将导致JS或CSS文件中的更改),然后重新发布H5 2.访问Chrome浏览器中的访问(确保我们访问最新代码),检查HTML文件互动的内容;或直接查看新包装file.compare最后一个版本。

  可以发现我们引入的app.js文件的名称已更改

  app.js文件名从原始app.6dca15e7.js更改为app.a68f992c.js

  3.请访问小程序网络视图中的H5页面,发现APPLET中HTML页面引入的App.js文件地址仍然是原始App.6DCA15E7.JS,它进一步验证了我们上面说的HTML文件是否是缓存。

  目前,该页面引入的静态资源目前已被缓存,考虑了一个问题:因为我们的静态资源已在服务器上发布并已发布。发布新的H5页面后,整个新软件包将被原始的旧包替换为App.6dca15e7.js此文件是上一个版本中的静态资源。发布H5后,该文件不再存在于服务器上。那么,为什么小程序仍然可以正常访问它呢?

  我们可以直接在浏览器中测试旧应用程序的资源,以查看是否可以访问它。

  上面的测试显示旧文档已被删除。但是为什么仍可以正常引入小程序中的旧文件。这是我们上面提到的第二个缓存,并且页面引入的静态资源被缓存。

  我们仍然看一下Web视图的调试工具,发现本地缓存也直接使用了小程序中引入的静态资源。

  根据上述测试,我们可以发现,为了解决缓存问题,我们必须首先求解入口HTML页面的缓存。我们的入口将不会更改,并且我们的单页应用程序是根据入口引入的JS文件渲染的,因此无论我们如何更改内容,在applet,applet中,look,look,look,页面都是上一个版本。第二个是解决缓存静态资源的问题。您可以看到页面引入的静态资源也可以缓存。

  条目HTML页面缓存1.设置元标记(无效)我们首先通过简单的解决方案来查看是否可以实现它。想到的第一件事是在HTML的头部设置元标记。如下:

  告诉浏览器不要缓存当前页面,该页面等同于HTTP的请求标题。查看一些文章说,在Chrome浏览器中,它可以生效,但是测量的,无论是在Chrome浏览器中还是在Wechat中,没有生效。相关无缓存参数

  2.将时间戳参数(无效)添加到页面访问地址(无效)。我们的普通页面方法地址(https://www.baidu.com),添加t = 165266666323379此地址之后的当前时间戳参数,以确保第二次访问期间的每个t参数的每个值都不同。仍然无效。

  3.服务器配置页面不在服务器中的缓存(有效),而是将响应头添加到访问HTML页面,例如将缓存控制为无存储器,no-cache.in thise,当浏览器访问时页面,页面不会被缓存。

  如下所示,在配置了服务器后,我们在页面请求的响应标头中有一个无法设计的参数,并且客户端不会缓存页面。随后的请求每次将从服务器中获取最新的页面文件。在这里,我们的入口html页面的缓存问题已解决

  静态资源是从上述分析过程中缓存的,我们可以看到静态资源也将被客户端捕获。

  例如,app.js,如果我们不使用静态资源版本编号,则在我们修改内容之前和之后,文件名是app.js。目前,即使我们请求最新的HTML页面,但是HTML页面引入的JS文件仍然是JS文件仍然介绍了App.js,此时,客户端将使用本地缓存直接使用该文件,以便我们的内容仍未更新。

  我们应该如何解决此缓存?

  1.在静态资源的添加版本编号(建议)的分析过程中,我们使用了此解决方案。根据文件内容,版本号自动生成。当更改文件的内容时,版本号将自动更改。大多数现有脚手架都具有此处理。如果没有,您也可以自己配置。

  添加版本编号后,App.js文件名将使用app.hash.js的格式。每个文件内容将被更改以生成一个新文件。例如,我们首先访问了该页面,该文件为app.6dca15e7.js,在修改文件re -release之后,文件名已更改为app.a68f992c。js.file名称,以便我们可以确保每次访问最新的静态资源。其他静态资源没有更改,并且文件名不会更改。您可以继续使用本地缓存文件。

  这样,我们可以确保您访问的资源是最新的,我们可以使用缓存来改善用户体验并减轻服务器压力。

  两种常见方法的静态资源版本:

  请注意,需要第二种方法,因为对于第一个方法,某些浏览器可能会直接忽略后续参数,并且不能确保它可以生效。第二种方法在修改文件内容后与新文件相当,这可以确保每种用途都是最新的。

  2.服务器配置为无需缓存的静态资源。不建议这样做。它与页面缓存相同。客户端不会在服务器中缓存静态资源。但是在这种情况下,每个请求页面都将再次从服务器获得,以便用户体验(打开页面的速度,宽带的职业),以及服务器非常不友好。因此,不建议使用此方法。仅使用版本编号方法。

  根据上述分析以及各种解决方案的尝试,我们可以发现解决此缓存问题需要我们做以下两个方面:

  实际上,Web-Video不仅适合微信系列。微信浏览器中的缓存也可以以相同的方式处理。当开发微信公共帐户时,在微信浏览器中遇到了同样的问题。包括其他浏览器也适用,但是微信中的缓存特别固执,因此微信中遇到了更多问题

  原始:https://juejin.cn/post/7098522027291574280