我不明白为什么只有对象可以很好地导出。看一下:
第一个文件
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的值不是{},而是这个对象的引用。
- 因此,当我们需要获取这个对象时,我们会搜索所有引用。
记住两件事很重要:
- 函数所需的模块被读取一次!需要在函数中进行 require 才能看到更改。
- 对象库存引用。
再见! 希望这有帮助!
最佳答案
当您将 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
都会按预期更新。
关于Node.js : module exports, 唯一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10640951/