首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >"module.exports“和"exports.methods”在NodeJS / Express中是什么意思?

"module.exports“和"exports.methods”在NodeJS / Express中是什么意思?
EN

Stack Overflow用户
提问于 2011-05-25 05:13:55
回答 5查看 42.3K关注 0票数 56

查看用于NodeJSexpress框架的随机source file,有两行代码我不理解(这两行代码是几乎所有NodeJS文件的典型)。

代码语言:javascript
复制
/**
 * Expose `Router` constructor.
 */

exports = module.exports = Router;

代码语言:javascript
复制
/**
 * Expose HTTP methods.
 */

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

我知道第一段代码允许向NodeJS应用程序公开文件中的其余函数,但我不能确切地理解它是如何工作的,也不明白这一行中的代码意味着什么。

exportsmodule.exports到底是什么意思?

我相信第二段代码允许文件中的函数访问methods,但同样,它到底是如何做到这一点的。

基本上,这些神奇的词是什么:moduleexports

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-25 06:03:16

更具体地说:

module是文件中的全局作用域变量。

因此,如果您调用require("foo"),那么:

代码语言:javascript
复制
// foo.js
console.log(this === module); // true

它的工作方式与window在浏览器中的工作方式相同。

还有另一个名为global的全局对象,您可以在任何想要的文件中对其进行读写,但这涉及到改变全局范围,这就是EVIL

exports是一个存在于module.exports上的变量。它基本上就是您在需要文件时导出的内容。

代码语言:javascript
复制
// foo.js
module.exports = 42;

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

exports本身有一个小问题。_global作用域context+和module不是同一个。(在浏览器中,全局范围上下文和window是相同的)。

代码语言:javascript
复制
// 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

Read more about exports

票数 79
EN

Stack Overflow用户

发布于 2011-05-26 09:04:45

扩展一下Raynos的答案..。

exports基本上是一个用于module.exports别名-我建议不要使用它。您可以通过在 module.exports,上设置来自模块的公开方法和属性,如下所示:

代码语言:javascript
复制
//file 'module1.js'
module.exports.foo = function () { return 'bar' }
module.exports.baz = 5

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

代码语言:javascript
复制
var module1 = require('module1')
console.log(module1.foo())
console.log(module1.baz)

您还可以完全使用覆盖 module.exports,以便根据需要提供单个对象:

代码语言:javascript
复制
//glorp.js
module.exports = function () {
  this.foo = function () { return 'bar' }
  this.baz = 5
  return this // need to return `this` object here
}

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

代码语言:javascript
复制
var g1 = new require('glorp')()
console.log(g1.foo())
console.log(g1.baz)

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

备注

为了让下面的方法起作用,

代码语言:javascript
复制
var g1 = new require('glorp')()
console.log(g1.foo())
console.log(g1.baz) 

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

代码语言:javascript
复制
console.log(g1.foo())
          ^
TypeError: Cannot read property 'foo' of undefined
票数 34
EN

Stack Overflow用户

发布于 2012-11-29 17:25:08

您可以在node.js源代码中找到最佳答案。如果有人需要你的js模块,你的脚本会按节点转换成一个函数,如下所示(参见src/node.js)。

代码语言:javascript
复制
// require function does this..
(function (exports, require, module, __filename, __dirname) {
    ... your javascript contents...
});

节点将包装您的脚本。然后执行上述脚本,如下所示:

代码语言:javascript
复制
//module.js
var args = [self.exports, require, self, filename, dirname];
return compiledWrapper.apply(self.exports, args);

所以在你的脚本中,

代码语言:javascript
复制
exports is just module.exports.

在脚本中,您可以向该导出对象添加一些内容(函数..)。require函数将返回此对象。这是node.js的模块系统(commonJS规范)。

但要注意不要修改module.exports。否则,您当前的导出将毫无意义。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6116960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档