【问题标题】:Node.js : module exports, only objectNode.js:模块导出,只有对象
【发布时间】:2012-05-17 17:55:39
【问题描述】:

我不明白为什么只有对象可以很好地导出。看那个:

第一个文件

var a = exports.a = {};
var b = exports.b = 0;

exports.xxxxx = function(){

    a.hello = 'help';
    b = 104;

};

第二个文件

var a = require('firstfile').a;
var b = require('firstfile').b;

module.exports = function(){

    console.log(a); // {hello:'help'}
    console.log(b); // 0

};

为什么?

出口 b 的解决方案是这样的:

第一个文件:

...
a.hello = 'help';
exports.b = 104; // (add exports)
...

第二个文件:

...
var b = require('firstfile');
...
console.log(b.b); // 104

为什么?

编辑

我想我明白了。

变量a只是一个参考! 我给不懂的人解释一下:

  • 读取第一个文件时,a = {}, b = 0
  • 当我们更改 b 时,b 已更改,但不是模块(导出)!!
  • 这很正常,exports.b = 104 // 我们改变了模块的值!谁是必需的。

现在,为什么对象不同?

  • 因为在执行文件 2 时。 (执行一次),a = {} 的值。
  • 但它显示 {xxx:xxx}
  • 这是因为文件执行时a的值不是{},而是这个对象的引用。
  • 所以,当我们需要获取这个对象时,我们会搜索所有引用。

记住两件事很重要:

  • 函数所需的模块被读取一次!需要在函数中要求查看更改。
  • 对象库存参考。

再见! 希望对您有所帮助!

【问题讨论】:

    标签: node.js


    【解决方案1】:

    当您将0 分配给exports.b 时,它本质上被分配为一个常量值。您可以更新b 变量指向的值,但不会重新导出。

    例如,我通过添加getB 函数稍微修改了您发布的内容:

    var a = exports.a = {};
    var b = exports.b = 0;
    
    exports.xxxxx = function(){
    
        a.hello = 'help';
        b = 104;
    
    };
    
    exports.getB = function() { return b; };
    

    然后,你可以通过在 REPL 中玩弄这个文件来明白我的意思:

    > var example = require('./example.js');
    undefined
    > example
    { a: {},
      b: 0,
      xxxxx: [Function],
      getB: [Function] }
    > example.xxxxx()
    undefined
    > example.getB()
    104
    > example.b
    0
    >
    

    编辑:您对引用的评论有些正确。当你最初说

    var b = exports.b = 0;
    

    你是说两个变量指向同一个值。这不同于指向同一个引用的两个变量(一个对象,就像您对a 所做的那样)。当您修改一个值时,不会修改另一个值。换句话说,当您将值 0 更改为 1 时,您不希望代码中的每个 0 实例也都是 1。那可不好。

    如果您希望b 成为一个值并在每次修改该值时更新,您应该重新分配exports.b。这就是为什么您会看到大多数代码被导出为一个对象的部分原因......然后,您的导出被视为引用,并且您的所有 b 都会按预期更新。

    【讨论】:

    • 是的,这就是我理解的成功。但是你的函数 getB 很好!它避免了重新输出吃的时间。谢谢!我不知道
    • 那么您认为功能之外的stock require 模块(例如“fs”)对性能更好吗?我听说那个模块被捕获了,所以不需要存储一个变量并弄乱内存?看这个:stackoverflow.com/questions/10636599/…
    • 这些模块被 NodeJS 缓存。您很可能不会看到性能差异,因为初始化只完成了一次。问题是如果您在函数中执行这些模块,您是否希望在每个函数调用中都需要这些模块。我不会。您的整个文件已经被包装在一个函数中。
    • 嗯,我明白但不是结束:“你的整个文件已经被包装在一个函数中”(我是法国人)。 (我编辑了我的帖子:stackoverflow.com/questions/10636599/…)谢谢! (我知道我们可以说这是微小的优化,但我宁愿有一个好的基础。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多