老旧的项目,日复一日的缝缝补补,没有大的动荡,其实一直维持着原有的样子也是可以的...
不过就这样子的话也太没意思了。
眼看着当前各种炫酷的框架操作,好生羡慕,旧项目积重难返,但心里却早已种草《大公司里怎样开发和部署前端代码》,想动手实现一番。文章里的思路,在评论里有人指出 Ruby on Rails 其实早就有这样的实现了,即 Asset Pipeline,这两都可以拜读一番。
趁着手上工作告一段落,暂时有空闲时间,跟后端小伙伴商量着怎么处理这个缓存问题,因每次发版都会引发缓存问题,运营人员、用户每次都要强刷,确实蛋疼。
期间找了现有的方案,找来找去还是百度出的 fis 满足一切需求,但是项目已经停滞了许久,便作罢。后面想着与其这样动找西找的,不如自己动手拼凑个!!!
通过上述暴露的问题,就着手一个一个拆分解决了。
针对第一个问题,后端通过修改原有的加载方式,在加载的时候都去读取由前端这边生成的资源表,匹配资源,在表上的就替换上去,不在的就回退到备用(原有)的资源那边。
可以看到关键词:资源表、匹配、替换,肯定不可能是人肉去搞这个了,这样神都救不了你。项目本身使用的 gulp 去做一些重复的操作的(压缩、混淆、复制搬运这些),那就继续在这上面捣鼓好了(webpack只是浅尝辄止)。
这个可以通过 gulp-rev 和 gulp-rev-collector 插件来生成、替换内容,因学艺不精所以里面有些是人肉写的,未通过插件去实现。
生成文件指纹:
创建时间(有隐患:本地 git 删除,重新拉取,其创建时间、修改时间、访问时间都是一样的)文件内容借助于 node 的 crypto 模块,我们可以通过以下方式简单的了解下指纹的生成(代码来自 npm 包插件:rev-hash):
'use strict';
const crypto = require('crypto');
module.exports = input => {
if (typeof input !== 'string' && !Buffer.isBuffer(input)) {
throw new TypeError('Expected a Buffer or string');
}
return crypto.createHash('md5').update(input).digest('hex').slice(0, 10);
};
喏,这就是指纹生成啦。
指纹的生成简单,但是替换上就比较麻烦了,因为路径都是写在后端模板内的,你前端也操作不了。所以这里就需要生成资源表给到后端,后端通过读取该资源表去匹配替换了。
后端处理好该问题,那么上述的第二、第三、第四的问题也就解决了。后端发版时,拉取新的资源表即可,无需再去手动修改版本号,前端可以更好的控制资源了。
因为项目中用到了 requirejs,所以其配置文件也需要替换,没有用到 gulp-rev-collector,人肉简单的使用了 replace 方法去替换资源表上的内容。
期间就遇到这样的问题:每次更新资源时,删除整个版本目录,生成新的版本资源还是保留原有资源,生成新的资源。
整个删除(覆盖式发布):在资源发版后会有短暂的资源找不到的问题(有可能来不及刷新资源表),但是好处是不会有冗余的文件存在。
保留旧文件,生成新文件(非覆盖式发布):随着时间的推移,版本化的文件内容会日积月累,变得愈加庞大,单是我们这边设想的起码保留3+1份(上上次、上次、当前 + 回退用的未版本化的文件)。
当然,为了避免前者带来的短暂问题,我们选择了后者,通过定时任务去清理过期文件(git 重新拉取到本地的话,所有文件的创建时间、修改时间、访问时间都是一样的,所以不能在本地对其进行操作)。
上面有提到过该问题,我们采用的重命名文件的形式,为什么不使用附带查询字符串的形式呢?
其实前面的知乎大神已解释了该原因,《高性能网站建设指南》的作者也在书中提到了,这是他博文上的观点:Revving Filenames: don’t use querystring,博文是10年前的了...10年前的...10年前...10年...10...1...。
通过查看 chrome 的 network 面板,可以看到 size栏显示了第二次访问的资源,有些显示的是 from memory cache,有些则是 from disk cache,status栏显示的状态码都是 200
而在 firefox 下显示的却是 304 已缓存的状态,这又是为什么呢?
相关知识
雪莲:老树开新花文创助推品牌发展
三步走让历史城区“老树开新花”!青岛市北区的这场答辩“知识点”很足
开源项目的持续发展——治理模型
养生休闲项目的探讨.ppt
鲜花商城同城速递项目的技术实现与探索
绿化项目的管理要点.docx
鲜花商场管理系统(Java毕业设计)
花店合作合同简易模板11篇
花管家互联网+农业项目的介绍书
新花文化投资(北京)有限公司
网址: 老树新花:旧有项目的简易前端资源缓存处理 https://m.huajiangbk.com/newsview104411.html
上一篇: SQL根据分隔的字符串,查询并组 |
下一篇: 关于mysql字符串的存储之ch |