根据this question express.static每次都从硬盘驱动器中读取文件。我想将服务文件缓存在内存中,因为它们不会改变,没有很多,我有足够的内存来执行此操作。
所以对于像这样的代码:
null
如何确保通过express.static和res.sendFile在内存中提供快速缓存文件?
答案 0 :(得分:1)
简短的回答是,你不能,至少不是express.static()
。您需要使用第三方模块或编写自己的模块。此外,您可以在相应的问题跟踪器上打开功能请求问题,要求使用某种钩子拦截调用以从磁盘读取请求的文件。
答案 1 :(得分:1)
这通常不值得,因为操作系统会为您处理这个问题。
所有现代操作系统都将使用未使用的RAM作为"buffer cache" or "page cache"。最近使用的文件系统数据将存储在RAM中,因此一旦文件被加载到内存中,任何后续读取都将从内存中提供,而不是实际从磁盘读取。
依赖于此的优势在于,当流程中的内存消耗量增加时,操作系统将自动从缓冲区缓存中清除数据,从而不会冒这些进程内存不足的风险(因为您可能拥有当你在用户空间中实现某些东西时。)
答案 2 :(得分:0)
一种方法是在 Node 启动时读取 HTML 文件并从变量提供 HTML 字符串。这是一个使用 Express 的示例。将 MY_DIST_FOLDER 替换为您的文件夹位置。
//using Express
const fs = require('fs');
const express = require('express');
const app = express();
//get page HTML string
function getAppHtml() {
let html = '';
try {
html = fs.readFileSync(`${MY_DIST_FOLDER}/index.html`, 'utf8');
} catch (err) {
console.error(err);
}
return html;
}
let html = getAppHtml();
//serve dist folder catching all other urls
app.get(/.*/, (req, res) => {
if (html) {
res.writeHead(200, {'Content-Type': 'text/html','Content-Length':html.length});
} else {
html = "Node server couldn't find the index.html file. Check to see if you have built the dist folder.";
res.writeHead(500, {'Content-Type': 'text/html','Content-Length':html.length});
}
res.write(html);
res.end();
});