在nodejs中,为什么要导出返回对象的函数

时间:2017-08-16 10:27:28

标签: javascript node.js

我在某些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');
};

2 个答案:

答案 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)

主要原因是缓存

根据Node js documentation

  

模块在第一次加载后进行缓存。这意味着   (除此之外)每次调用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;