通江文峰直升机场图片有没有想学会计,学电脑或者想升学历的

module.exports与exports??关于exports的总结 - CNode技术社区
积分: 1320
这家伙很懒,什么个性签名都没有留下。
API文档是枯燥的,下面本人收集了一些论坛经常有人疑问和开源代码中经常遇到的案例供大家研究一下。
排版更佳。。
##module.exports与exports的区别
每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}
module.exports = {};
Node.js为了方便地导出功能函数,node.js会自动地实现以下这个语句
exports.a = function(){
console.log('a')
exports.a = 1
var x = require('./foo');
console.log(x.a)
看到这里,相信大家都看到答案了,exports是引用 module.exports的值。module.exports 被改变的时候,exports不会被改变,而模块导出的时候,真正导出的执行是module.exports,而不是exports
再看看下面例子
exports.a = function(){
console.log('a')
module.exports = {a: 2}
exports.a = 1
var x = require('./foo');
console.log(x.a)
exports在module.exports 被改变后,失效。
是不是开始有点廓然开朗,下面将会列出开源模块中,经常看到的几个使用方式。
##module.exports = View
function View(name, options) {
options = options || {};
this.name =
this.root = options.
var engines = options.
this.defaultEngine = options.defaultE
var ext = this.ext = extname(name);
if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no
extension was provided.');
if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') +
this.defaultEngine);
this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express);
this.path = this.lookup(name);
module.exports = V
javascript里面有一句话,函数即对象,View 是对象,module.export =View, 即相当于导出整个view对象。外面模块调用它的时候,能够调用View的所有方法。不过需要注意,只有是View的静态方法的时候,才能够被调用,prototype创建的方法,则属于View的私有方法。
function View(){
View.prototype.test = function(){
console.log('test')
View.test1 = function(){
console.log('test1')
module.exports = View
var x = require('./foo');
console.log(x) //{ [Function: View] test1: [Function] }
console.log(x.test) //undefined
console.log(x.test1) //[Function]
x.test1() //test1
##var app = exports = module.exports = {};
其实,当我们了解到原理后,不难明白这样的写法有点冗余,其实是为了保证,模块的初始化环境是干净的。同时也方便我们,即使改变了 module.exports 指向的对象后,依然能沿用 exports的特性
exports = module.exports = createA
* Expose mime.
exports.mime = connect.
例子,当中module.exports = createApplication改变了module.exports了,让exports失效,通过exports = module.exports的方法,让其恢复原来的特点。
##exports.init= function(){}
这种最简单,直接就是导出模块 init的方法。
##var mongoose = module.exports = exports = new M
集多功能一身,不过根据上文所描述的,大家应该不能得出答案。
通俗易懂,好理解,深入浅出
一般我们这里是这样写的:
function view(){};
function view2(){};
module.exports = {
view: view,
view2: view2
你们写法是否不同。。。。。
自己模拟实现exports和module.exports导出功能,原理同Node的实现原理一致
创建一个foo.js文件,内容如下:
exports.foo = 'bar';
创建index.js文件,内容如下:
// 1. 在Node中,每个文件模块都是一个对象,我们模拟一个
function Module() {
this.exports = {};
// 2. Node在定位到具体的文件后,Node会新建一个模块对象
var module = new Module();
// 3. 如果是.js文件。Node会通过fs模块同步读取文件
var fs = require('fs');
var foo_js = fs.readFileSync('./foo.js');
// 4. 读取出文件内容后,将文件进行头尾包装,这里只是简单的模拟
var packStr = '(function(exports,module){' + foo_js + ' return module. })';
// 注:这样每个模块之间都进行了作用域隔离
// 5. 包装之后的代码通过一个类似eval(Node中并不是eval)的函数执行返回一个具体的function对象
var packObj = eval(packStr);
// 6. 执行该函数,将module对象的exports属性以及module对象本身作为参数传递进去
// 而内部是通过return module. 的方式返回的
var foo = packObj(module.exports, module);
// 在第6点中,就是为什么通过exports = ‘bar’; 赋值,但是外部却拿不到
// 这是因为在JavaScript中,引用传递的是引用的副本,而不是引用本身,这叫做共享传递
// 所以exports = ‘bar’ 改变的是形参的引用()而并没有影响到外部的实参exports对象
// 而通过exports.foo = ‘bar’;
确实可以得到,这是因为虽然引用传递的是引用副本,但他们指向的是同一个对象
// 自然而然的,通过module.exports = ‘bar’;
就是成功的
// 7. 所以在外部我们最终得到了被引用模块中导出的变量、函数或对象
console.log(foo);
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的nodejs中exports与module.exports的区别详细介绍
看了好多篇关于exports与module.exports的区别的介绍,好多感觉讲的都不够准确,最后才明白两者用法的区别为:如果你想你的模块是一个特定的类型就用Module.exports。如果你想的模块是一个典型的&实例化对象&就用exports。
你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块。例如:(假设这是rocker.js文件)&
exports.name = function() {&
console.log('My name is Lemmy Kilmister');&
在另一个文件中你这样引用&
var rocker = require('./rocker.js');&
rocker.name(); // 'My name is Lemmy Kilmister'&
那到底Module.exports是什么呢?它是否合法呢?&
其实,Module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是Module.exports而不是exports。
所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是Module.exports本身不具备任何属性和方法。如果,Module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。
修改rocker.js如下:&
module.exports = 'ROCK IT!';&
exports.name = function() {&
console.log('My name is Lemmy Kilmister');&
再次引用执行rocker.js&
var rocker = require('./rocker.js');&
rocker.name(); // TypeError: Object ROCK IT! has no method 'name'&
发现报错:对象&ROCK IT!&没有name方法&
rocker模块忽略了exports收集的name方法,返回了一个字符串&ROCK IT!&。由此可知,你的模块并不一定非得返回&实例化对象&。你的模块可以是任何合法的javascript对象--boolean, number, date, JSON, string, function, array等等。
你的模块可以是任何你设置给它的东西。如果你没有显式的给Module.exports设置任何属性和方法,那么你的模块就是exports设置给Module.exports的属性。
下面例子中,你的模块是一个类:&
module.exports = function(name, age) {&
this.name =&
this.age =&
this.about = function() {&
console.log(this.name +' is '+ this.age +' years old');&
可以这样应用它:&
var Rocker = require('./rocker.js');&
var r = new Rocker('Ozzy', 62);&
r.about(); // Ozzy is 62 years old&
下面例子中,你的模块是一个数组:&
module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];&
可以这样应用它:&
var rocker = require('./rocker.js');&
console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio&
现在你明白了,如果你想你的模块是一个特定的类型就用Module.exports。如果你想的模块是一个典型的&实例化对象&就用exports。
给Module.exports添加属性类似于给exports添加属性。例如:&
module.exports.name = function() {&
console.log('My name is Lemmy Kilmister');&
同样,exports是这样的&
exports.name = function() {&
console.log('My name is Lemmy Kilmister');&
请注意,这两种结果并不想同。前面已经提到module.exports是真正的接口,exports只不过是它的辅助工具。推荐使用exports导出,除非你打算从原来的&实例化对象&改变成一个类型。本文英文链接:/node-js-exports-vs-module-exports.html 你肯定熟悉nodejs模块中的exports对象,可以在你的模块中用它创建函数(假设文件名为rocker.js) exports.name = function() { console.log('My name is Lemmy Kilmister'); };在另外一个文件中你可以这样调用:var rocker = require('./rocker.js'); rocker.name(); // 'My name is Lemmy Kilmister'但是,module.exports是什么?是更正式的用法? 其实,module.exports才是真正的用法,exports只是module.exports的辅助工具。你的模块最终返回给调用者的是module.exports,而不是exports。当module.exports上没有值存在的情况下,exports收集属性,并把它们附加到module.exports上。如果module.exports上已经有属性了,exports将被忽略。 把下面的代码放到rocker.js文件中: module.exports = 'ROCK IT!'; exports.name = function() { console.log('My name is Lemmy Kilmister'); };另外一个调用者文件内容如下,并执行代码: var rocker = require('./rocker.js'); rocker.name(); // TypeError: Object ROCK IT! has no method 'name'rocker模块完全忽略exports.name,只是返回一个"ROCK IT!"字符串。从这你也可以看出,模块不是必须是个“模块实例”。模块可以是任意合法的JavaScript对象-boolean,number,date,JSON,string,function和array等。模块无所谓是否设置module.exports。如果你没有显式地设置module.exports,那么exports的属性将会附加到module.exports上,然后返回。 在这种情形下,模块是个class: module.exports = function(name, age) { this.name = this.age = this.about = function() { console.log(this.name +' is '+ this.age +' years old'); }; };你可以这样使用:var Rocker = require('./rocker.js'); var r = new Rocker('Ozzy', 62); r.about(); // Ozzy is 62 years old
在这种情形下,模块是个数组: module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];你可以这样使用: var rocker = require('./rocker.js'); console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio
综上所述,你可以得出这样的结论:如果你想让模块是个特定的对象类型,使用module.exports;如果想让模块是传统的模块实例,使用exports。 把属性附加在module.exports上和exports上结果是类似的。例如: module.exports.name = function() { console.log('My name is Lemmy Kilmister'); };同样的: exports.name = function() { console.log('My name is Lemmy Kilmister'); }; 但是,需要注意的是,它们不是个一件事。正如之前提到的,module.exports是本尊,exports只是辅助工具而已。话虽如此,如果你不计划改变模块对象类型从传统的模块实例至其它,exports是个推荐使用的对象。 如果,你没有对module.exports对象进行赋值,任何附加在module.exports和exports上内容可以可用的。 例如,你的模块中这样写:module.exports.age = 68; exports.name = 'Lemmy Kilmister';下面的代码是可以正常运行的: var rocker = require('./rocker.js'); console.log('%s is %s', rocker.name, rocker.age); // Lemmy Kilmister is 68
但是,如果你通过赋值覆盖了module.exports,代码运行会失败:module.exports = 'LOL'; module.exports.age = 68; exports.name = 'Lemmy Kilmister';或module.exports.age = 68; exports.name = 'Lemmy Kilmister'; module.exports = 'WTF';无所谓顺序,rocker.age和rocker.name会是为定义。 同时,只是因为module.exports.age和exports.name都被导出,这不意味这你可以结合两者一起使用。我推荐使用exports.*,同时注意module.exports.*。
<a href="/web/js/893.shtml" title="
最新教程周点击榜
微信扫一扫}

我要回帖

更多关于 会计证学历变更流程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信