- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 webpack 来捆绑我的所有资源文件,所以我得到了这样的东西。
bundle.7fb44c37b0db67437e35.js
vendor.495e9142a1f8334dcc8c.js
styles.bc5b7548c97362b683f5582818914909.css
我在名称中使用 chunkhash,因此当浏览器缓存某些内容时,它不会再次缓存,直到哈希值发生更改。例如,如果我更改样式中的某些内容,捆绑文件并部署,则只有样式的哈希值会更改,其他的不会更改,因此浏览器将再次从服务器请求样式文件,其余部分将从内存缓存中使用。
在响应 header 中,我还有 Etag 和 Last-Modified,每次我为每个文件部署应用程序时它们都会更改。我应该从回复中删除它们吗?即使哈希值仍然相同,这是否会迷惑浏览器联系服务器并查看文件是否已更改?
最佳答案
很好的问题。这很大程度上取决于后端如何实现以及如何计算 header 值。文件是由我们的服务器提供的,还是其他服务器(例如 s3)提供的?我们使用 CDN 吗?我们是否为应用程序服务器使用框架?谁计算这些 header ,Web 服务器还是应用程序服务器?
出于本答案的目的并为了简单起见,我们假设我们正在使用流行的服务器框架 Express没有 CDN 或第 3 方托管。与大多数应用程序服务器一样,Express 根据所提供的文件的内容(而不是文件名称)来计算 ETag
和 Last-Modified
。
浏览器第一次请求我们的文件时,它将收到资源的 ETag
和 Last-Modified
。下次请求相同的资源时,浏览器会将缓存的 ETag 和 Last-Modified header 发送到服务器。然后,服务器根据这些 header 决定浏览器是否需要下载资源的新版本,或者缓存的版本是否是最新版本。如果缓存的资源是最新的,服务器将使用 304 - Not Modified
状态代码进行响应。状态代码是整个缓存系统的关键 - 它是浏览器决定是否应该使用缓存资源的方式。
为了生成 ETag
header ,Express 将响应正文的二进制 Buffer
表示形式传递给 etag
模块,该模块计算 SHA-1基于缓冲区内容的哈希( source: generating ETag header 和 source: generating hash )。为了生成 Last-Modified
header ,Express 使用文件系统的上次修改时间 ( see lastModified
in docs )。
当 webpack 构建一个新的包时,即使 chunkhash 相同,文件的二进制文件也会改变。这会导致 Express 输出不同的 Etag
和 Last-Modified
,这意味着它下次不会响应 304
请求资源。如果没有 304
状态代码,浏览器将不必要地重新下载 bundle 。
我认为这里最好的做法是禁用这些 Assets 的 ETag
和 Last-Modified
header ,而是使用 Expires
或 Cache-Control: max-age
header 设置为遥远的 future 日期(通常为 1 年)。这样,浏览器只会在过期或缓存中不存在的情况下重新下载 bundle 。
关于caching - 在 webpack 中使用 CommonsChunkPlugin 时需要 Etag 和 Last-Modified header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44936723/
我有一个系统,我需要在其中显示记录列表,这样我们可以使用三个选项 上周 上个月 去年 我的表结构有一个名为 createdate 的字段,它是 BIGINT 类型并保存从 PHP 的 time() 函
假设,我对某些功能使用哪一个并不重要,是否使用它会在性能方面产生任何差异 $('div:last'); 或 $('div').last(); 谢谢! 最佳答案 last() 在大型 DOM 集上明显比
有人可以解释 .last() 和 :last 之间的区别吗?我似乎找不到明确的解释。 为什么 $('td.cellsOfSpecificClass:last', '.table tr') 返回每个 t
我想用 li:last 做点什么: var p = $("li:last"); 我需要它的位置:position.left 通过该位置,我可以对齐一些元素。问题是,在某些情况下,最后一个 li 被 e
请看这张图片: 谁能解释一下其中的区别吗? 编辑 让我指出什么让我困惑。请注意: $row.is('tr.items:last') === false $row[0].id === $('tr.ite
我注意到 $( 'filter:last' ) 与 jQuery 中的 $( 'filter:last-child' ) 不同。 我尝试了 jQuery 文档,但很难理解 :last 的额外用途以及它
我正在尝试使用 CSS 选择最后一个 col-xs-12 div 中包含的最后一个元素。关键是元素是动态的,所以它可以是 h2 或 h3 等。
当我使用 :last-child 定位 div 时,它不起作用。使用 :first-child 没关系。 :last-of-type 也可以。有任何想法吗?谢谢。 HTML Lorem
HTML: ... ... ... ... CSS: .plan-box:last-of-type { ... } 在上面的 CSS 代码中,如果我在
我想知道 .filter(':last') 和 .last() 之间是否有任何区别? 对我来说,他们似乎也在做同样的事情,但我是 jQuery 的新手。如果结果没有差异,推荐使用哪一种还是只是个人喜好
std::adjacent_find searches the range [first, last) for two consecutive identical elements. Return v
这个问题在这里已经有了答案: How can I select the last element with a specific class, not last child inside of pa
目标 创建一个辅助列,将单元格的值从 Last, First 转换至First Last 下面的公式工作正常。 A1包含 Last, First下面的公式转换为所需的输出。 A2 = MID(A1,
我需要获取歌曲的发行日期。 在 last.fm API 中,如文档中所述,足以向服务器发出 HTTP 请求,它将使用包含字段“”的 XML(或 JSON)进行回复(如示例响应中所示在网站上)。 问题是
类似于 .Last.value有什么办法可以访问上次通话吗?低于预期的潜在结果.Last.call . sum(1, 2) # [1] 3 str(.Last.call) # language su
在 Perl 中调用 last 而不是在 C 中调用 break 的历史原因是什么? Perl 的设计受到 C 的影响(此外还有 awk、sed 和 sh - 请参阅下面的手册页),因此不采用熟悉的
我正在尝试交换字符串中的两个单词。我目前有一个 txt 文件,其中有一列用户格式为 last.first。我如何将它交换为 first.last? 最佳答案 -split 字符串并连接: $Last,
我有以下 html 代码: Text1 Text2 Text3 使用: nav :last-child { text-transform: upperca
我主要是一名Python程序员,正在学习一些Java。我需要一个函数将包含“First Last”形式的名称的字符串转换为“Last, First”(我还需要它能够处理单个名称:“Cher”=>“Ch
难以尝试将集合中的特定元素作为最后一个匹配的选择器。 this is today this is today
我是一名优秀的程序员,十分优秀!