查看用于NodeJS
的express
框架的随机source file,有两行代码我不理解(这两行代码是几乎所有NodeJS文件的典型)。
/**
* Expose `Router` constructor.
*/
exports = module.exports = Router;
和
/**
* Expose HTTP methods.
*/
var methods = exports.methods = require('./methods');
我知道第一段代码允许向NodeJS应用程序公开文件中的其余函数,但我不能确切地理解它是如何工作的,也不明白这一行中的代码意味着什么。
exports
和module.exports
到底是什么意思?
我相信第二段代码允许文件中的函数访问methods
,但同样,它到底是如何做到这一点的。
基本上,这些神奇的词是什么:module
和exports
发布于 2011-05-25 06:03:16
更具体地说:
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作用域context+和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
发布于 2011-05-26 09:04:45
扩展一下Raynos的答案..。
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.exports
和require
的方式有很多种。请记住,require('foo')
总是返回相同的实例,即使您多次调用它。
备注
为了让下面的方法起作用,
var g1 = new require('glorp')()
console.log(g1.foo())
console.log(g1.baz)
在分配给module.exports
的函数中必须返回this
。否则,您将获得一个TypeError
console.log(g1.foo())
^
TypeError: Cannot read property 'foo' of undefined
发布于 2012-11-29 17:25:08
您可以在node.js源代码中找到最佳答案。如果有人需要你的js模块,你的脚本会按节点转换成一个函数,如下所示(参见src/node.js)。
// require function does this..
(function (exports, require, module, __filename, __dirname) {
... your javascript contents...
});
节点将包装您的脚本。然后执行上述脚本,如下所示:
//module.js
var args = [self.exports, require, self, filename, dirname];
return compiledWrapper.apply(self.exports, args);
所以在你的脚本中,
exports is just module.exports.
在脚本中,您可以向该导出对象添加一些内容(函数..)。require函数将返回此对象。这是node.js的模块系统(commonJS规范)。
但要注意不要修改module.exports。否则,您当前的导出将毫无意义。
https://stackoverflow.com/questions/6116960
复制相似问题