前端资源版本控制的那些事儿

先来个最原始的页面,比如下面的index.html中,引入了css和js资源

<link rel="stylesheet" href="a.css"></link>
<script src="a.js"></script>

写完后,部署上线。然而我们要考虑充分利用浏览器缓存,我们的目标是资源文件直接读取浏览器缓存,于是给它设置 Cache-Control/Expires 和 Last-Modified/ETag。Cache-Control/Expires的作用是在缓存时间内,正常进入页面,浏览器不会发出请求,直接读取浏览器缓存资源。如果用户点击“刷新”按钮或缓存时间消失,浏览器会发送请求,并根据Last-Modified/ETag判断内容是否有更新,如果内容没更新,服务器返回304。

上线后,来了一大波需求。于是改完再发一次。依然是直接将html和资源文件丢到线上,直接访问页面地址,咦?怎么没生效?哦,原来是缓存作祟。html更新了,但是读取的a.css和a.js还是浏览器缓存里面的内容,没有更新到最新。怎样让浏览器缓存失效呢?于是我们想到了版本控制,加个版本号不就解决问题了嘛,so easy!于是代码变成了这样

<link rel="stylesheet" href="a.css?v=0.01"></link>
<script src="a.js?v=0.01"></script>

下次更新的时候,升级版本就行了。恩,浏览器缓存导致更新不生效的问题终于解决了。但是新的问题又来了:

  • 管理成本增加,每次发布要记得去升级版本号
  • 缓存丢失,只是修改了a.css,结果a.js的版本也要升级,a.js的缓存也跟着丢失

不能忍,继续寻找新的解决方案。最优的方案是根据文件内容,生成一串hash值。通过hash值来判断文件内容是否有产生变化。于是,代码成了这样:

<link rel="stylesheet" href="a.css?v=e0279"></link>
<script src="a.js?v=abb35"></script>

问题到这似乎解决了,终于可以歇口气。图样图森破,这里有个新的问题。

我们发布项目的时候,资源文件和主文件是分开发的,资源文件部署在CDN中,主文件部署在服务器,这时是先发CDN还是先发主文件呢?

  • 先发资源文件,之前的资源文件被覆盖,在主文件发布成功之前,没有缓存或强制刷新的用户,会导致页面错乱
  • 先发主文件,在资源文件发布成功之前,用户访问到得资源文件都是旧的

两种方式都有问题,继续调整。上面问题的原因是由于资源是覆盖式发布,如果将资源文件变成非覆盖式发布,新版和旧版资源文件共存,就可以有效解决了。代码再一次华丽转变:

<link rel="stylesheet" href="a.e0279.css"></link>
<script src="a.e0279.js"></script>

发布时先发资源文件,资源文件部署成功后,在发主文件,就可以有效避免上面问题了。

至此问题已经得到了一个比较好的解决方案。至于怎么去给资源名加上hash值,这个就是构建的事了。构建的时候需要注意任务顺序,通常需要加hash值的资源文件有js、css和img,而css和js是可以引入img的,所以需要先对img进行hash值处理,然后整站替换新的img路径。再对css和js hash值处理,处理完后,在html文件中替换新的资源路径。

时间: 2024-08-08 09:16:25

前端资源版本控制的那些事儿的相关文章

前端资源教程合集

综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v2.2 En类资源汇总 免费的编程中文书籍索引 前端书籍 前端免费书籍大全 前端知识体系 免费的编程中文书籍索引 智能社 - 精通JavaScript开发 重新介绍 JavaScript(JS 教程) 麻省理工学院公开课:计算机科学及编程导论 JavaScript中的this陷阱的最全收集--没有之一 JS函数式编程指南 JavaScript Promise迷你书

【汇总】前端资源汇总

Jsource 前端资源的收集 前端技能 @拔赤  浏览器 Chrome (Chrome Canary) Firefox Safari Opera Fucking IE 国外开源项目 jQuery prototype mootools Dojo YUI Modernizr express javascript-patterns 国内开源项目 淘宝:kissy 腾讯:JX 百度:Tangram 360:Qwrap 支付宝:Arale 一淘 UX brix 个人开源项目 司徒正美:Mass-Fram

前端资源教程

资源教程 综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v2.2 免费的编程中文书籍索引 前端书籍 前端免费书籍大全 前端知识体系 免费的编程中文书籍索引 智能社 - 精通JavaScript开发 重新介绍 JavaScript(JS 教程) 麻省理工学院公开课:计算机科学及编程导论 JavaScript中的this陷阱的最全收集–没有之一 JS函数式编程指南 JavaScript Promise迷你书(中文版

Web前端,HTML5开发,前端资源,前端网址,前端博客,前端框架整理 - 转

Web前端/H5开发,前端资源,前端网址,前端博客,前端框架整理 - 转 综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v2.2 免费的编程中文书籍索引 前端书籍 前端免费书籍大全 前端知识体系 免费的编程中文书籍索引 智能社 - 精通JavaScript开发 重新介绍 JavaScript(JS 教程) 麻省理工学院公开课:计算机科学及编程导论 JavaScript中的this陷阱的最全收集--没有之一 JS

优秀前端资源备忘录

1.前端开发仓库 比较基础的前端资源,包含html css javascript及常用在线工具. 属于国内个人(诨名:小叉)的前端资源整理,是github上的开源项目. 一些常见效果较为实用,如jQuery展示类插件,Unicode在线编码,代码在线压缩等. 前端开发仓库 优秀前端资源备忘录,布布扣,bubuko.com

WEB前端资源集

原出处:http://www.cnblogs.com/zhengjialux/archive/2017/01/16/6291394.html 资源网站篇 CSDN:全球最大中文IT社区,为IT专业技术人员提供最全面的信息传播和服务平台伯乐在线:专业的IT互联网职业社区V2EX:创意工作者们的社区.这里目前汇聚了超过 75000 名主要来自互联网行业.游戏行业和媒体行业的创意工作w3school:提供基础中文 Web 技术教程前端观察:关注国内外前端设计资源和前端开发技术的专业博客前端乱炖:最专业

前端资源多个产品整站一键打包&amp;包版本管理(一)

来新公司工作的第五个月.整站资源打包管理也提上了日程. 问题: 首先.什么是整站的打包管理呢? 我们公司的几个重要产品都在同一个webapp里面,但是,不同的开发部门独立开发不同的产品,长期以来,我们就不知道其他部门的在做什么,或许我们正在头疼的问题,隔壁部门已经早早解决了呢? 各个部门的前端资源也是到处都是.难以管理.于是就提出了整站资源共享.整站资源共享的前提就是资源打包能统一.在几个产品里面.既有使用grunt的也有使用glup的,各个产品引入的包的版本也不一样. 目标: 统一打包工具 对

前端资源汇总

前端网:http://www.w3cfuns.com/ 前端网址导航:http://whycss.com/ 前端里:http://www.yyyweb.com/ 张鑫旭博客:http://www.zhangxinxu.com/php/ 迷渡:http://justjavac.com/ 梦想天空博客:http://www.cnblogs.com/lhb25/ 前端知识体系:http://ecomfe.duapp.com/ 前端资源分享:https://github.com/hacke2    ht

基于Laravel开发博客应用系列 —— 使用Bower+Gulp集成前端资源

本节我们将讨论如何将前端资源集成到项目中,包括前端资源的发布和引入.本项目将使用 Bower 和 Gulp 下载和集成jQuery.Bootstrap.Font Awesome 以及 DataTables. 1.“偷”别人的代码 开发 web 应用最快的方式就是借鉴别人的项目.换句话说,“偷”他们的代码. 当然,不是真偷. 举个例子吧,Twitter Bootstrap 的许可证声明允许任何人可以免费使用 Bootstrap 框架. 现在的 web 站点包含很多东西:框架.库.前端资源,等等.如