javascript 嵌套模块.exports的说明

sxpgvts3  于 2023-03-11  发布在  Java
关注(0)|答案(3)|浏览(127)

我有一段代码在一个旧的代码库中,它包含嵌套的module.exports,如下所示。我以前从未见过这种形式的导出。有人能解释一下吗?或者至少给我指一下正确的文章。

module.exports = function something(options) {

   someMethod = new func1(options);

   module.exports.anotherFunc = function (req, res) {
       someMethod.anotherFunc1(req, res);
   };

   module.exports.func1 = someMethod.func3;

   return function func4(req, res, next) {
       someMethod.anotherFunc1(req, res);
       next();
   };
};
yhived7q

yhived7q1#

这可能是为了在整个应用程序中共享全局状态而动态生成模块的尝试,但是我不清楚如何导入这样的模块,我认为这可能是糟糕的设计;从外观上看,这些内部的exports语句看起来完全没有必要。

xurqigkl

xurqigkl2#

我来到这里是因为我遇到了一些类似下面例子的代码,在我的例子中,exports实际上并没有在其他导出中被更改--它被用来调用其他导出的函数--但它仍然令人困惑。

exports.sumTwoNumbers = function sumTwoNumbers(a, b) {
  return a + b
}

exports.addOne = function addOne(n) {
  return exports.sumTwoNumbers(n, 1) // nested `exports`?
}

exports.foo = function foo(n) {
  if(exports.sumTwoNumbers(n, 2) === 3) {
    return "bar"
  }
}

我通过将函数与导出任务分离,对其进行了重构,使其更加清晰:

// exports.sumTwoNumbers = function sumTwoNumbers(a, b) {
//   return a + b
// }

const sumTwoNumbers = (a, b) =>   a + b
exports.sumTwoNumbers = sumTwoNumbers;

由于属性和函数名相同,因此可以使用对象简写法编写

exports = {
  sumTwoNumbers,
}

最终重构代码

const sumTwoNumbers = (a, b) =>   a + b
const addOne = (n) => sumTwoNumbers(n, 1)
const foo = (n) => {
  if(sumTwoNumbers(n, 2) === 3) {
    return "bar"
  }
}

exports = {
  sumTwoNumbers,
  addOne,
  foo
}
yduiuuwa

yduiuuwa3#

这看起来像是一次写IIFE的尝试,但却出了严重的错误。

// module-local variable
const someMethod = new func1(options);

module.exports = function func4(req, res, next) {
    someMethod.anotherFunc1(req, res);
    next();
};

module.exports.anotherFunc = function (req, res) {
    someMethod.anotherFunc1(req, res);
};

module.exports.func1 = someMethod.func3;

相关问题