我在某些nodejs代码中看到这种模块导出
module.exports = () => {
return {
doSomething: function doSomething() {
console.log('doing something');
}
};
};
所以这是导出一个返回一个对象的函数,它本身有一个函数doSomething
。这项技术有什么意义?为什么不直接导出对象(而不是返回对象的函数)?
module.exports = {
doSomething: function doSomething() {
console.log('doing something');
}
};
为什么不直接导出doSomething
函数?
module.exports = function doSomething() {
console.log('doing something');
};
答案 0 :(得分:1)
这取决于用例。两种方法都是正确的。第一个用例之一是能够定义私有方法而不暴露它们。这种常见模式用于创建API。
module.exports = () => {
// private method
privateMethod () {
// This method is private to this module
}
return {
doSomething: function doSomething() {
// use privateMethod() here
console.log('doing something');
}
};
更新:
但是,此方法返回一个可以在以后调用的函数。因为这是一个功能,它可以在呼叫站点接收参数。
module.exports = (args1, args2) => {
return {
doSomething: function doSomething() {
console.log(`This is argument ${args1} and argument ${args2}`);
}
}
};
//然后,在通话现场,我们可以
const module = require('<path to file>')('Rowland', 'Ekemezie');
module.doSomething() // -> This is argument Rowland and argument Ekemezie
答案 1 :(得分:0)
主要原因是缓存。
模块在第一次加载后进行缓存。这意味着 (除此之外)每次调用require('foo')都会得到 返回完全相同的对象,如果它将解析为相同 文件。
多次调用require('foo')可能不会导致模块代码 多次执行。这是一个重要的特征。用它, 可以返回“部分完成”的对象,从而允许传递 即使它们会导致循环,也要加载依赖项。
让模块多次执行代码,导出函数,然后 叫那个功能。
在每个require
上执行的代码示例:
function HelloWorld() {
this.greeting = "Hello, World";
return this;
}
module.exports = HelloWorld;
缓存并仅在第一个require
上执行的代码示例:
var HelloWorld = (function () {
this.greeting = "Hello, World";
return this;
})();
module.exports = HelloWorld;