模块.在nodejs中导出- fn vs object

module.exports in nodejs - fn vs object

本文关键字:fn vs object nodejs 模块      更新时间:2023-09-26

我试图理解以下两种我认为是相同功能的替代表示之间的区别。

apiRegistry1.js

module.exports = function () {
    var apiRegistry = {};
    var files = fs.readdirSync('./apis');
    for (var index in files) {
        var fileName = files[index];
        var module = fileName.split('.')[0];
        apiRegistry[module] = require('../apis/' + module);
    }
    // console.log(apiRegistry) --> Prints {key: moduledef ..}
    return apiRegistry;
};

apiregistry2.js

var apiRegistry = {};
var files = fs.readdirSync('./apis');
for (var index in files) {
    var fileName = files[index];
    var module = fileName.split('.')[0];
    apiRegistry[module] = require('../apis/' + module);
}
// console.log(apiRegistry) --> Prints {key: moduledef ..}
module.exports = apiRegistry;

server.js

var apiRegistry1 = require('./includes/apiregistry1')(); // returns {key: moduledef ..}
var apiRegistry2 = require('./includes/apiregistry2'); //returns {}

apiRegistry1的行为如我所期望的,但2没有。在某种程度上,它是有意义的,1是一个函数,并在调用时进行评估,这就是为什么它工作,但我不明白为什么在模块内打印值总是工作,但在它之外引用却没有。我是否遗漏了一些关于如何要求工作的基本内容?

var module = fileName.split('.')[0];

是罪魁祸首。

因为作用域在JavaScript中是如何工作的,module变量不是局部的for循环,而是整个文件。因此,当您在末尾使用它时:

module.exports = apiRegistry;

您在自己的module变量上设置了exports属性,而不是期望您使用的一个节点。更改为使用另一个变量名可以解决您的问题:

var apiRegistry = {};
var files = fs.readdirSync('./apis');
for (var index in files) {
    var fileName = files[index];
    var myModule = fileName.split('.')[0];
    apiRegistry[myModule] = require('../apis/' + myModule);
}
// console.log(apiRegistry) --> Prints {key: moduledef ..}
module.exports = apiRegistry;