V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Mark24
V2EX  ›  问与答

微信内置的浏览器缓存了入口文件( SPA),导致总能访问到上个版本网站,怎么办?

  •  
  •   Mark24 · 2017-10-19 22:01:47 +08:00 · 6847 次点击
    这是一个创建于 2587 天前的主题,其中的信息可能已经有所发展或是发生改变。
    虽然老生常谈了,看了好久,也没看到一个靠谱的方法。
    可是,难道不上线,不更新了么?显然不能。这么多网站都能正常访问,所以还是想再问一遍。

    我们的具体情况是,Vue 做了一个 SPA 的触屏页面系统,接入微信公众号,给业务员使用。
    第一个版本很好,没有问题。然后改进了很多,的第二版在测试服务器上没有问题。(测试服务和线上服务一样的配置,一台机器 Nginx 一样的配置,分仅仅是不同文件夹分开储存)

    上传到线上,我们还在公众号的按钮链接给首页加了 ?v=xxx 版本控制。初次能够正常的跳转,载入,但是把页面叉掉,重新进入,页面就是老的状态。由于线上代码已经被干掉,所以访问不正常。

    网上的策略,比如添加不缓存的 meta 头,js,css 已经用 webpack 使用 hash 命名方式,Nginx 配置 不采用缓存,公众号链接使用域名+版本号,更改服务器上 index.html 入口文件的名字,让 Nginx 重新指定。好了,能做的,我们都做了。

    现在依然有部分机器,还会在以往的上版本页面出现加载问题。

    我现在觉得只能是用户手机微信的本地缓存,但是无论是刷新,还是清缓存,取消关注公众账号再重新关注,还是退出登录微信再重新登陆,都是部分有效,貌似没有看到一个 100% 的方法。

    现在有两个想法:
    1.有没有一种方式,能够主动清理掉缓存。

    2.突然想到的,是不是内部所有的 url 都要加上 ?v=xxx 版本,那 SPA 的路由跳转。。。。
    突然想到内部授权的是 vue-router 的跳转。但是这样的话,其不是很烦么?

    ----

    感觉很烦躁,时间不是花在解决有价值的问题上。。。而是在这儿死磕微信。。
    我真心的觉得,每个 App 内置一个 Chrome 就好了,别搞这些没用的。业界毒瘤啊。
    微信的文档,客服,均没有找到有价值的信息。
    8 条回复    2018-04-04 18:18:09 +08:00
    isbase
        1
    isbase  
       2017-10-20 01:14:07 +08:00 via Android   ❤️ 1
    可以在 Nginx 里对 html 启用 etag 和发送 cache-control no-store
    phy25
        2
    phy25  
       2017-10-20 01:57:37 +08:00 via Android
    debugx5.qq.com 可清缓存。
    Mark24
        3
    Mark24  
    OP
       2017-10-20 08:28:16 +08:00
    @phy25 这个安卓和苹果并不能同时打开。而且也不指望用户能用这个。体验太差了。
    ctx331
        4
    ctx331  
       2017-10-20 09:11:52 +08:00 via Android
    我也遇到这个问题 改了 webpack 配置 ,js 的 chunkhash 不加在文件名后,而是加在 search 后了。至少先保证页面能正常访问,不会因为 js 文件名改变导致找不到 js 文件而出错。

    其实用户点右上角三个点,再点刷新,多刷几次也就好了,可惜不是根本的解决办法。

    最后这个问题似乎只出现在部分微信版本中,,只有个别用户遇到。
    node
        5
    node  
       2017-10-20 09:18:04 +08:00   ❤️ 1
    你在公众号的按钮里给链接加上?v=xxx,这个 xxx 是固定的吗?我是做成一个 302 跳转链接,每次跳转到一个随机数的 xxx,用到现在貌似没有再被缓存过,这个动态跳转可以用 js 实现,也可以直接在 nginx 或者 openresty 里用 lua 写一下
    Mark24
        6
    Mark24  
    OP
       2017-12-15 16:59:50 +08:00
    也不需要去除服务器缓存之类的。
    归根结底是微信缓存了页面。
    -----
    每个页面,跳转的时候,加上 ?v=xx 的时间戳有效
    但是微信也对,诸如 v,t 常用名字,做了一些缓存策略,要起个特别的名字 比如 ?vt=<timestamp>

    如果是单页面,很方便,只要入口跳转的时候,加

    如果是多页面,麻烦点,进入每个页面都要加

    总之,让你下次的页面,看起来和上次的 url 不一样就对了
    亲测,有效。已经上线。

    时间太久,都忘了终结这个帖子。
    Mark24
        7
    Mark24  
    OP
       2017-12-15 17:00:13 +08:00
    @node #5 感谢,感谢币已发
    luojiyin87
        8
    luojiyin87  
       2018-04-04 18:18:09 +08:00   ❤️ 2
    如果是用 Nginx 控制缓存 可以加上
    expires -1;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1015 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 20:20 · PVG 04:20 · LAX 12:20 · JFK 15:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.