6

我知道global在节点中不鼓励使用该变量,但假设我需要全局存储一些数据,这是一种更糟糕的方法:

  1. 使用全局

  2. 直接使用require缓存来存储一个对象,即

    require.cache["myGlobalVar"] == {};

我怀疑选项 2 更糟,因为 require 缓存旨在用于模块。

更多细节:我考虑过使用 require("myLibrary").myGlobalVar 但这需要让所有调用它的文件都可以访问 myLibrary,这在实践中可能是不可能的。我正在制作一个代码覆盖工具,因此我可以期望用户在他们的开发/测试模块中安装“myLibrary”,但不一定在他们的 src node_modules 目录中,检测代码文件将引用该目录。

4

3 回答 3

14

为什么不直接创建一个所有其他代码都可以引用的内存缓存呢?

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'
于 2012-10-18T16:00:09.043 回答
11

比尔的答案对我不起作用,因为它实际上不能“通过要求从任何地方”使用。这是因为它导出了一个在每个要求上调用的函数,因此每次都创建一个空白的新(空)缓存。

解决方案是导出函数的实例......

// 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'

(注意区别:括号“()”现在位于模块中函数定义的末尾,而不是在 require 之后。)

于 2016-11-03T22:01:18.387 回答
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());

于 2019-05-06T05:12:39.800 回答