res.sendFile()的性能和express.static()是一样的。
发布于 8 年前 作者 ctmakro 13951 次浏览 来自 分享

中文文档: http://expressjs.com/zh-cn/advanced/best-practice-performance.html

使用中间件提供静态文件 在开发过程中,可以使用 res.sendFile() 提供静态文件。但是,请勿在生产环境中执行此函数,因为它必须针对每次文件请求读取文件系统,所以会产生严重的延迟,影响应用程序的总体性能。请注意,res.sendFile() 并非通过效率要高很多的 sendfile 系统调用来实现的。 因此,建议使用 serve-static 中间件(或者等效项),该中间件经过优化,用于为 Express 应用程序提供文件。 还有一个更好的选项,就是使用逆向代理提供静态文件;请参阅使用逆向代理以了解更多信息。

实际上两种方法内部实现是一致的。

serve-static/index.js

var stream = send(req, path, opts)
...
stream.pipe(res)

router/response.js

var file = send(req, pathname, opts);
...
sendfile(res, file, opts,callback)
// sendfile 函数内部
file.pipe(res);
8 回复

版本是express 4.13.3

用sendFile需要自己针对每个文件定义路由,serve-static直接给一个路径就不用管了 性能方面我就不清楚了~ http://stackoverflow.com/questions/31425284/express-static-vs-res-sendfile

@SinalVee 大大之下,必有菜逼跟着装逼

呃。。我也去看了看代码,你看看我的理解对不对。

在开发过程中,可以使用 res.sendFile() 提供静态文件。但是,请勿在生产环境中执行此函数,因为它必须针对每次文件请求读取文件系统,所以会产生严重的延迟,影响应用程序的总体性能。 建议使用 serve-static 中间件(或者等效项),该中间件经过优化,用于为 Express 应用程序提供文件。

这句应该说的是,serve-static 中间件对于文件有缓存方面的逻辑。

请注意,res.sendFile() 并非通过效率要高很多的 sendfile 系统调用来实现的。

因为 res.sendFile 的名字有歧义,怕人家误认为是 linux 那个系统调用。这句话的意思不是说 serve-static 是通过 sendFile 实现的。

反正怎么都是被ng踩着,不如ng做脏活。

@MiguelValentine 诺大个CNODE居然到5楼才出现正解。

@captainblue2013 资源是动态的。

@alsotang 这里的缓存,应该指的是通过设置 header, 通知 nginx 去缓存某个文件。 如果外面不套一层 nginx,那么两个方法的性能应该是完全一样的;套了之后,static中间件会让压力小一些。

不知道这么理解对不对。

回到顶部