在NodeJS/Express中,“module.export”和“exports.method”是什么意思?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (55)

看着一个随机的源文件中的express为框架NodeJS,有我不理解的代码的两行(这行代码是典型的几乎所有文件的NodeJS)。

/**
 * Expose `Router` constructor.
 */

exports = module.exports = Router;

/**
 * Expose HTTP methods.
 */

var methods = exports.methods = require('./methods');

我知道第一段代码 允许将文件中的其余功能暴露给NodeJS应用,但我不明白如何工作的,或者线路中代码的含义。

什么exportsmodule.exports实际意味着什么?

我相信第二段代码允许访问文件中的函数methods,但是它又是如何执行此操作的。

提问于
用户回答回答于

module 是文件内的全局范围变量。

所以,如果你打电话给require("foo")

// foo.js
console.log(this === module); // true

它的行为window与浏览器中的行为相同。

还有另一个全局对象global,你可以在你想要的任何文件中写入和读取,但涉及到全局范围的变异,这是EVIL

exports是一个生活在其上的变量module.exports。这基本上是在需要文件时导出的内容。

// foo.js
module.exports = 42;

// main.js
console.log(require("foo") === 42); // true

自己有一个小问题exports。在_global范围上下文+和module一样的。(在浏览器中全局范围的上下文window是相同的)。

// foo.js
var exports = {}; // creates a new local variable called exports, and conflicts with

// living on module.exports
exports = {}; // does the same as above
module.exports = {}; // just works because its the "correct" exports

// bar.js
exports.foo = 42; // this does not create a new exports variable so it just works
用户回答回答于

exports基本上是一个别名module.exports-我建议只是不使用它。你可以通过设置模块module.exports暴露模块中的方法和属性,如下所示:

//file 'module1.js'
module.exports.foo = function () { return 'bar' }
module.exports.baz = 5

然后你可以在代码中访问它:

var module1 = require('module1')
console.log(module1.foo())
console.log(module1.baz)

你也可以 module.exports完全覆盖,只需要提供一个单一的对象:

//glorp.js
module.exports = function () {
  this.foo = function () { return 'bar' }
  this.baz = 5
  return this // need to return `this` object here
}

现在你已经有了一个很好的原型:

var g1 = new require('glorp')()
console.log(g1.foo())
console.log(g1.baz)

还有很多其他的方式可以玩module.exportsrequire。请记住,即使您多次调用它,也require('foo') 总是返回相同的实例

var g1 = new require('glorp')()
console.log(g1.foo())
console.log(g1.baz) 

this必须在分配给的函数中返回module.exports。否则,你会得到一个TypeError

console.log(g1.foo())
          ^
TypeError: Cannot read property 'foo' of undefined

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励