在nodejs中require()会加载一个模块副本还是多个副本? 我问这个问题的原因是因为我想使用以下代码加载一些文件并将其缓存在内存中。
var fs = require('fs');
var htmlString = '';
var cssString = '';
var jsString = '';
if(!htmlString) {
htmlString = fs.readFileSync(__dirname + '/invoiceTpl/default/invoice.html', 'utf8');
}
if(!cssString) {
cssString = fs.readFileSync(__dirname+ '/invoiceTpl/default/css/invoice.css', 'utf8');
}
if(!jsString) {
jsString = fs.readFileSync(__dirname + '/invoiceTpl/default/js/invoice.js', 'utf8');
}
module.exports = {
html: htmlString,
css: cssString,
js: jsString
};
我想创建一个闭包。 因此,如果字符串为空,则仅从磁盘加载文件。
许多其他地方都需要此模块。你认为nodejs会使用模块的一个副本,因此只需要从磁盘读取一次,或者多次加载多次,就像我需要这个模块一样多,因此缓存不起作用吗?
答案 0 :(得分:1)
它们是位于全局对象(require.cache
)中的缓存,因此如果您有一个名为a.js
的文件位于当前目录中。
然后多次调用:
require('./a');
require('./a');
在尝试加载之前会从require.cache
签入,因此在这些需求语句之间的任何内容中的更改都不会对当前进程产生任何影响。
因此,它将为每个进程保留一个副本。
亲自尝试一下。打开节点shell,需要一个模块,然后更改文件中的内容,然后再次需要它,然后再次调用该函数。什么都不会改变。