NodeJS中的全局变量与require.cache有何区别?

6

我知道在node中使用global变量是不被鼓励的,但假设我需要全局存储一些数据,哪种方法更差:

  1. 使用global

  2. 直接使用require cache来存储对象,如下所示:

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

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

更多细节: 我考虑过使用require("myLibrary").myGlobalVar,但这将要求所有调用它的文件都可以访问到myLibrary,这在实践中可能是不可能的。我正在制作一个代码覆盖工具,因此可以期望用户在其dev/test模块中安装“myLibrary”,但不一定在其src node_modules目录中安装,“myLibrary”将被用于仪器化的代码文件。

3个回答

14

为什么不创建一个内存缓存,让你的其他代码可以引用它呢?

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

你可以通过 require 命令来从任何地方使用缓存。

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

我认为Express的示例只是将源文件重新映射到插装文件。Mocha(用于运行Express测试)使用全局node变量,如果我没记错的话,我只是在寻找那种方法的替代方案,因为我知道使用全局变量并不被推荐。https://github.com/visionmedia/mocha/blob/master/lib/reporters/json-cov.js#L45 - Alex Seville
我感到困惑,因为在Node中的代码覆盖率问题已经有了解决方案。使用工具来对代码进行仪器化处理并将其转储到文件夹中。代码开发人员使用“index.js”文件在不同版本(仪器化或非仪器化)之间进行切换。运行测试并收集代码覆盖数据。请参见http://tjholowaychuk.com/post/18175682663/mocha-test-coverage。为什么你不会遵循类似的流程呢? - Bill
我有一种感觉,这可能是那种使用全局变量是可以的用例之一(我已经看到其他基于js的覆盖工具也使用它,所以至少我会有好的公司)。 - Alex Seville
在测试工具中这样使用 global 是完全可以的。 - Bill
因为node-jscoverage是jscoverage的一个移植版本(它是c++/js编写的),我想要编写一个纯JS版本(也已经有了,例如yahoo/istanbul),并加入一些新颖的特性。 - Alex Seville
显示剩余3条评论

13

对我来说,Bill的答案不起作用,因为实际上不能通过"在任何地方require它"来使用它。这是因为它导出的是一个函数,每次调用都会创建一个新的空缓存。

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

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


1
每次需要缓存文件时,都会触发函数并重新初始化缓存对象。
为了解决这个问题,我们可以按照下面的方式实现缓存:

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());


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接