资讯专栏INFORMATION COLUMN

工程化——前端静态资源缓存策略

cheng10 / 2970人阅读

摘要:增量更新是目前大部分团队采用的缓存更新方案,能让用户在无感知的情况获取最新内容。那我们需要考虑的就是如何确保加载的是最新的了,其他的静态资源就充分利用浏览器缓存以减少网络请求提高性能。

增量更新是目前大部分团队采用的缓存更新方案,能让用户在无感知的情况获取最新内容。具体实现方式通常是(一般我们通过构建工具来实现,比如webpack):

构建产出文件hash(如:index.d94f83fac22c203b788c.css)

更新html文件里静态资源的引用URL

由于其他资源是由html文件直接或间接引用才可以被加载,如果html里的静态资源URL更新了,那请求的肯定就是最新资源了。那我们需要考虑的就是如何确保加载的html是最新的了,其他的静态资源就充分利用浏览器缓存以减少网络请求提高web性能。浏览器缓存实质就是HTTP缓存,而HTTP缓存分为强缓存协商缓存

强缓存

强缓存不会发送请求,直接从浏览器加载资源。是否命中强缓存根据HTTP Response头部ExpiresCache-Controlmax-age)来判断。

Expires通过返回一个过期时间来判断是否过期,在此时间之前浏览器直接从缓存加载资源。但其缺点是返回的过期时间为服务器时间,而比较是同客户端时间比较,如果服务端和客户端存在时间误差就不准了。

max-age返回的时间过期时间跨度,比如max-age=3600告诉浏览器接下来的1小时内使用缓存。这样就解决了Expires时间误差导致的问题。

强缓存命中优先判断max-agemax-age优先级大于Expires,判断流程如下:

协商缓存

EtagIf-None-Match Etag的值是根据一定算法生成的字符串,用以判断文件是否更改,类似于文件hash。在第一次访问时,服务会返回该文件的Etag值,在之后的访问通过在请求头增加If-None-Match参数,把Etag的值带过去,服务器通过比较Etag的值来判断是否需要重新返回最新资源(200 or 304)。

Last-ModifiedIf-Modified-Since Last-Modified为该资源文件的最后修改时间。同样在第一次返回,之后通过If-Modified-Since带过去,服务器通过比较值来判断是否需要返回最新资源。

如果 If-None-MatchIf-Modified-Since 都有,则必须一次性都发给服务器,没有优先级,实际中比较ETag就够了。如果请求头里没有,则每次都会返回最新的资源200

缓存判断流程

为了确保html每次都是最新的,我们这里不能使用强缓存。可以在服务器(nginx、tomact)设置访问html文件时Cache-Control为no-cache。(这个需要在服务器配合设置,前端是处理不了的)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/53761.html

相关文章

  • 利用 webpack 处理开发与线上环境静态资源切换问题

    摘要:但在产品模式下,我们非常有必要在的属性里的里配置一个来变向的为静态资源注入版本号,如下,以便上线之后页面可以引入版本更新后的代码。通过给静态资源注入值来作为版本号的好处主要有两个实现策略。 前言 webpack,作为一个处理模块加载、资源依赖管理、构建化的工具,已经逐渐成为了前端工程化领域的新贵。其创造性的把每个静态资源归为一个 module(模块)并能被其强大的 loader 所加载...

    RyanHoo 评论0 收藏0
  • 前端性能优化

    摘要:端优谈谈关于前端的缓存的问题我们都知道对页面进行缓存能够有利于减少请求发送,从而达到对页面的优化。而作为一名有追求的前端,势必要力所能及地优化我们前端页面的性能。这种方式主要解决了浅谈前端中的过早优化问题过早优化是万恶之源。 优化向:单页应用多路由预渲染指南 Ajax 技术的出现,让我们的 Web 应用能够在不刷新的状态下显示不同页面的内容,这就是单页应用。在一个单页应用中,往往只有一...

    Dean 评论0 收藏0
  • 如何构建前端代码

    摘要:首先散文件是有害处的,第一是,散文件可能没有版本号的区分,这样因为缓存导致第二是散文件会严重拖慢性能,因为很多散文件不仅消耗请求资源,而且是在串行消耗。 基本认识 开发环境和线上环境的区别 在很久以前,前端的部署其实比较简单,开发环境下,静态资源往服务器上面一扔就ok了,如果考虑下优化或者代码保护,也只是加一个代码压缩和混淆。没错,刚入行的时候我就是这么干的。。。 但是随着前...

    jhhfft 评论0 收藏0
  • webpack4大结局:加入腾讯IM配置策略,实现前端程化环境极致优化

    摘要:或者的,都会对其进行分析。舒适的开发体验,有助于提高我们的开发效率,优化开发体验也至关重要组件热刷新热刷新自从推出热刷新后,前端开发者在开环境下体验大幅提高。实现热调试后,调试流程大幅缩短,和普通非直出模式调试体验保持一致。 showImg(https://segmentfault.com/img/bVbtOR3?w=1177&h=635); webpack,打包所有的资源 不知道不...

    李增田 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<