当您向客户端发送HTML
文件时,会对其进行解析并对其他任何内容进行GET
调用,例如<SCRIPT>
或<LINK>
(<IMG>
包括在内?我认为是。)
执行此过程非常昂贵:
当服务器启动时,无论如何都要在Node中缓存文件内容以便完成
我有这个功能来浏览Scripts/
文件夹中的所有脚本并阅读文件:
var gatherFiles = function () {
fs.readdir('/Scripts', function (err, files) {
files.filter(function (file) {
return path.extname(file) == '.js';
}).forEach(function (file) {
// read files here
});
});
};
记住这些要点
我认为,因为服务器应该只启动一次,如果所有文件在开始时都缓存在节点中,那么如果需要它们,那么它们可以从内存中提供。这些文件是脚本文件,因此它们不是很大,100Kb
最大值(在缩小之后可能更少)。
我问这个,因为当我完成Chrome
和Firefox
网络监视器以查看提供文件所需的时间,并且需要很长时间,超过{{ 1}} ...
我猜测服务器的许多部分都存在延迟:以太网,SD卡,代码。
所以我认为我希望通过预缓存来实现它,它应该最小化100ms
滞后。
*我的解决方案*
100ms
需要注意的要点是:
用法:
var fs = require ("fs"),
path = require("path"),
async = require("async"),
scriptFiles = {};
function gatherFiles(callback, folder) {
fs.readdir(folder, function (err, files) {
var filteredFiles = files.filter(function (file) {
var ext = path.extname(file);
return ext == '.js' || ext == '.html';
});
aync.each(filteredFiles, function (file, asynCallback) {
if (!scriptFiles[file])
fs.readFile(folder + '/' + file, function (err, data) {
scriptFiles[file] = data;
asyncCallback();
});
}, function (err) {
callback(scriptFiles);
});
});
};
exports.gatherFiles = gatherFiles;
答案 0 :(得分:3)
我认为这样的事情会满足你的目标,这就是试图消除磁盘读取。
function Files = function () {
var files = {};
return function (filepath, callback) {
// If cache is available, return that
if (files[filepath]) return callback(null, files[filepath]);
// Otherwise, get it, then store it
fs.readFile(filepath, function (err, data) {
if (err) return callback(err);
files[filepath] = data;
callback(null, data);
});
}
}();
然后将其称为
Files('/scripts/whatever.js', function (err, data) {
// Do something
});
如果您愿意,可以添加其他功能,例如文件监视或缓存过期。
如果你想在开始时将它们全部缓存,你可以遍历任何目录并且不对回调做任何事情。
为此我会修改它:
//...
if (files[filepath]) return callback && callback(null, files[filepath]);
//...
callback && callback(null, data);
//...
callback && callback(...)
将被视为与if (false && alert("Nothing"))
相同,因为永远不会达到警报,因为虚假条件会阻止进一步执行。因此,如果您没有传递回调,它将永远不会尝试执行回调。排除故障安全。