中文文档: 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);
用sendFile需要自己针对每个文件定义路由,serve-static直接给一个路径就不用管了 性能方面我就不清楚了~ http://stackoverflow.com/questions/31425284/express-static-vs-res-sendfile
呃。。我也去看了看代码,你看看我的理解对不对。
在开发过程中,可以使用 res.sendFile() 提供静态文件。但是,请勿在生产环境中执行此函数,因为它必须针对每次文件请求读取文件系统,所以会产生严重的延迟,影响应用程序的总体性能。 建议使用 serve-static 中间件(或者等效项),该中间件经过优化,用于为 Express 应用程序提供文件。
这句应该说的是,serve-static
中间件对于文件有缓存方面的逻辑。
请注意,res.sendFile() 并非通过效率要高很多的 sendfile 系统调用来实现的。
因为 res.sendFile
的名字有歧义,怕人家误认为是 linux 那个系统调用。这句话的意思不是说 serve-static
是通过 sendFile 实现的。
@alsotang 这里的缓存,应该指的是通过设置 header, 通知 nginx 去缓存某个文件。 如果外面不套一层 nginx,那么两个方法的性能应该是完全一样的;套了之后,static中间件会让压力小一些。
不知道这么理解对不对。