上周一位客户改了首页的活动横幅,上线半小时后电话就来了:怎么我手机上还是旧的?技术查了一圈,改动本身没问题,是缓存没处理干净,他自己刷新了十几遍也没看到新图。网页前端开发里,缓存是个看不见的环节,处理好了没人注意,处理不好天天有人打电话。
缓存存在好几层
用户看到的旧页面,可能旧在哪一层:浏览器自己存了一份,图省事直接用本地的;CDN节点也存了一份,离用户近的那台服务器还在发旧货;有的主机还套了一层服务端缓存。任何一层没更新,用户就看到旧内容。所以问题从来不是刷新不刷新,而是每一层的旧货什么时候换新。排查时从离用户最近的一层开始问,顺序对了效率高。
前端正解:文件名带版本
行业标准做法是给静态资源起会变的名字:样式文件更新后不叫style.css,改叫style-a3f5.css。名字一变,浏览器和CDN都当全新文件对待,不存在旧缓存的问题。构建工具自动干这件事,代码改一次名字换一次,这是大站天天更新也不出缓存问题的原因。反过来,手动维护文件名的项目,漏一次就炸一次。
策略上还有个分工:带版本号的资源可以放心设长缓存,一年都行,反正名字会变;页面本身设短缓存或不缓存,保证内容更新及时可见。两把钥匙开两把锁,混着用必然出事。下面这张清单,改版上线时值得过一遍:
- 新发布的样式和脚本文件名是否变了;
- 页面里引用的链接是不是指向新文件名;
- CDN上对应的旧文件要不要清理或刷新;
- 改完用无痕窗口或另一台设备验证,别用自己的常用浏览器。
那位客户的横幅问题,就是构建工具没配版本号又手动传的文件,补上自动版本化后再没复发。缓存策略一旦配好就基本不用再管,属于典型的前期半天、后期一劳永逸的投入。
强刷不是长久之计
客服话术里最爱说的按Ctrl加F5强刷一下,本质是把问题推给用户。你的客户里懂强刷的不到一成,剩下九成只会觉得你的网站有问题。网页前端开发的缓存策略,目标是不依赖任何人的操作,更新自动生效。做到这一点,客服少接一半的电话。
两条建议:问一下你的站点静态资源有没有自动版本化,没有的让技术方补配置,半天的事;上线新内容后用手机流量再加无痕窗口各验证一次,基本能模拟出真实访客的状态。比格网络的构建流程里版本化是默认项,客户改完上线,所有访客看到的就是最新的。