Node.js 全局变量vs.NodeJS中的require.cache

Node.js 全局变量vs.NodeJS中的require.cache,node.js,global-variables,require,Node.js,Global Variables,Require,我知道在节点中不鼓励使用global变量,但假设我需要全局存储一些数据,这是一种更糟糕的方法: 使用 使用直接存储对象,即 require.cache[“myGlobalVar”]=={} 我怀疑选项2更糟糕,因为require缓存用于模块 更多详情: 我曾考虑过使用require(“myLibrary”).myGlobalVar,但这需要所有调用它的文件都能访问myLibrary,这在实践中可能是不可能的。我正在制作一个代码覆盖工具,这样我就可以期望用户在他们的开发/测试模块中安装“myL

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

  • 使用

  • 使用直接存储对象,即

    require.cache[“myGlobalVar”]=={}

  • 我怀疑选项2更糟糕,因为require缓存用于模块

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

    为什么不创建一个内存缓存,让所有其他代码都可以引用

    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'
    

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

    // some other file
    var cache = require('../cache/memoryCache');
    cache.set('1234', 'value I want to share');
    cache.get('1234');  // 'value I want to share'
    
    解决方案是导出函数的实例

    // 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之后。)

    每次需要缓存文件时,它都会再次触发函数并再次初始化缓存对象

    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
    }
    

    谢谢你的快速回复。这种方法的问题(因为它类似于只使用require(“myLibrary”)我正在检测代码以获得代码覆盖率。因此,我将获取src文件,添加额外的代码行,然后保存修改后的副本。使用require引用这样的本地文件需要调整require语句中的所有相对路径以指向正确的文件。虽然这并非不可能,但可能会很混乱。人们通过使用
    index.js
    文件来解决这个问题,这些文件在进行代码覆盖率构建时指向适当版本的文件。然后每个文件都引用导出适当版本的引用的
    index.js
    文件。这样,您就不必更改任何require语句。请看一个例子例如,代码覆盖工具本身的index.js?我考虑过这个问题,但是如果这个人的测试和src有单独的node_模块,那么它将失败,除非他们将覆盖工具安装在src node_modules文件夹中,没有,即/test/node_modules/cover/index.js runner.js-调用该工具ent library/src/node_modules srcfiles.js在本例中,我认为从srcfiles.js引用index.js是不可行的。我认为来自express的示例只是将源文件重新映射到插入指令的文件。Mocha(用于运行express测试)使用全局节点变量,如果我记性好的话,我只是在寻找该方法的替代方法,因为我知道不建议使用全局变量。我很困惑,节点中的代码覆盖率是一个已解决的问题。使用工具插入代码并将其转储到文件夹中。代码开发人员使用
    index.js
    file可在不同版本之间切换(是否插入指令)。运行测试并收集代码覆盖率数据。请参阅。为什么不遵循类似的过程?