express.static()会将文件缓存到内存中吗?

39
在NodeJS的ExpressJS中,我们可以这样做:
app.use(express.static(__dirname + '/public'));

为了提供所有静态CSS、JS和图像文件的服务。我的问题如下:

1)这样做时,Express是否会自动将文件缓存到服务器内存中,还是每次提供其中一个资源时都从硬盘读取?

2)这样做时,Express默认使用ETag,在客户端硬盘上保存资源,还是仅保存在客户端内存中?


1
请注意,即使 Express 不这样做(我不确定),您的操作系统实际上可能会这样做。 - Sven van de Scheur
1个回答

70
  1. 静态中间件不进行服务器端缓存。它让你可以使用两种客户端缓存方法:ETag 和 Max-Age:

如果浏览器看到该页面的 ETag ,它会将其缓存。下次浏览器加载页面时,检查 ETag 编号是否有变化。如果文件完全相同,其 ETag 也相同,则服务器响应 HTTP 304(“未修改”)状态码,而不是重新发送所有字节,并节省大量带宽。 默认情况下启用 Etag,但可以像下面这样关闭:

app.use(express.static(myStaticPath, {
  etag: false
}))

Max-age 会将最大年龄设置为一定的时间,这样浏览器在一天过去后才会请求该资源。

app.use(express.static(myStaticPath, {
  maxAge: '5000' // uses milliseconds per docs
}))

要了解更多详细信息,您可以阅读此文章

  1. 默认情况下它在硬盘上,但有人可以使用类似这样的方法

每次它都试图从服务器硬盘读取...那浏览器呢?当浏览器关闭后,浏览器还会记住资源吗? - Chong Lip Phang
如果缓存持久存在。 - Dan D.
丹·D. ......我猜你是在说资源确实存储在客户端的硬盘上...缓存在什么情况下会持久存在,而不是持久存在? - Chong Lip Phang
@ChongLipPhang 用户是否清除了浏览器历史记录?他们是否在使用私人/无痕模式(即没有缓存)?他们是否使用禁用缓存的开发工具?缓存文件是否已过期?这取决于用户。客户端如何处理缓存超出了服务器的控制范围(除了设置过期时间)。 - Evan Plaice
哈哈,他用了老旧的Ram Disk方法。我多年前也用过这种方法来加速MSSQL数据库。如果你采用这种方法,你需要一个监视器来在Ram Disk和持久存储之间进行同步。 - Evan Plaice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接