我知道在节点中不鼓励使用global
变量,但假设我需要全局存储一些数据,这是一种更糟糕的方法:
直接使用require cache存储对象,即
require.cache["myGlobalVar"] == {};
我怀疑选项2更糟糕,因为需要缓存旨在用于模块。
更多细节: 我想过使用require(“myLibrary”)。myGlobalVar但是要求myLibrary可以访问所有调用它的文件,这在实践中可能是不可能的。我正在制作一个代码覆盖工具,所以我可以期望用户在他们的开发/测试模块中安装“myLibrary”,但不一定在他们的src node_modules目录中,检测代码文件将引用该目录。
答案 0 :(得分:13)
为什么不创建一个内存缓存,然后所有其他代码都可以引用?
var memoryCache = module.exports = function () {
var cache = {};
return {
get: function (key) { return cache[key]; },
set: function (key, val) { cache[key] = val; }
}
}
然后,您可以通过要求来使用任何地方的缓存。
var cache = require('../cache/memoryCache')();
cache.set('1234', 'value I want to share');
cache.get('1234'); // 'value I want to share'
答案 1 :(得分:7)
比尔的答案对我没有用,因为事实上 "来自任何地方" 。这是因为它导出了每个需要调用的函数,因此每次都创建一个空白的新(空)缓存。
解决方案是导出函数的实例...
// cache/memoryCache.js
module.exports = function () {
var cache = {};
return {
get: function (key) { return cache[key]; },
set: function (key, val) { cache[key] = val; }
}
}();
......然后每次都要求那个实例。
// some other file
var cache = require('../cache/memoryCache');
cache.set('1234', 'value I want to share');
cache.get('1234'); // 'value I want to share'
(注意区别:括号对#34;()"现在位于模块中函数定义的末尾,而不是在require之后。)
答案 2 :(得分:0)
每次,当您需要缓存文件时,它将再次触发该函数并再次初始化缓存对象。
var cache = {}
为解决此问题,我们可以实现如下所述的缓存:
//cache.js
module.exports = {
cache: {},
get: function (key) { return this.cache[key]; },
set: function (key, val) { this.cache[key] = val; },
dumpCache: function () { return this.cache } // this just for testing purpose
}
// index.js
var cache = require('./cache');
cache.set('12', 'Hey');
console.log(cache.get('12'));
console.log(cache.dumpCache());