NodeJS中的全局变量与require.cache

Ale*_*lle 6 global-variables require node.js

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

  1. 使用全球
  2. 直接使用require缓存来存储对象,即

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

我怀疑选项2更糟糕,因为需要缓存旨在用于模块.

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

Bil*_*ill 14

为什么不创建一个内存缓存,然后您的所有其他代码都可以引用?

var memoryCache = module.exports = function () {
    var cache = {};
    return {
        get: function (key) { return cache[key]; },
        set: function (key, val) { cache[key] = val; }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过要求从任何地方使用缓存.

var cache = require('../cache/memoryCache')();
cache.set('1234', 'value I want to share');
cache.get('1234');  // 'value I want to share'
Run Code Online (Sandbox Code Playgroud)


jox*_*jox 10

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

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

// cache/memoryCache.js
module.exports = function () {
    var cache = {};
    return {
        get: function (key) { return cache[key]; },
        set: function (key, val) { cache[key] = val; }
    }
}();
Run Code Online (Sandbox Code Playgroud)

......然后每次都需要这个实例.

// some other file
var cache = require('../cache/memoryCache');
cache.set('1234', 'value I want to share');
cache.get('1234');  // 'value I want to share'
Run Code Online (Sandbox Code Playgroud)

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