广州web培训
达内广州五羊中心

18087159764

热门课程

达内广州前端开发培训详解exprots和module.exports

  • 时间:2016-12-26
  • 发布:广州前端开发培训
  • 来源:简书

你是不是会纠结于什么时候该用exports什么时候该用module.exports呢?这篇文章达内广州前端开发培训先简要陈述一下两者的区别,分别给出两个例子后,再具体说一下使用的场景。

对于要导出的属性,可以简单直接挂到exports对象上。

对于类,为了直接使导出的内容作为类的构造器可以让调用者使用new操作符创建实例对象,应该把构造函数挂到module.exports对象上,不要和导出属性值混在一起。

exports和module.exports区别:

Node.js在模块编译的过程中会对模块进行包装,最终会返回类似下面的代码:

(function (exports, require, module, __filename, __dirname) {

// module code...

});

其中,module就是这个模块本身,require是对Node.js实现查找模块的模块Module._load实例的引用,filename和dirname是Node.js在查找该模块后找到的模块名称和模块绝对路径,这就是官方API里头这两个全局变量的来历。

关于module.exports与exorts的区别,了解了下面几点之后应该就完全明白:

模块内部大概是这样:

exports = module.exports = {};

exports是module.exports的一个引用。

require引用模块后,返回给调用者的是module.exports而不是exports;

exports.xxx相当于在导出对象上挂属性,该属性对调用模块直接可见;

exports =相当于给exports对象重新赋值,调用模块不能访问exports对象及其属性;

如果此模块是一个类,就应该直接赋值module.exports,这样调用者就是一个类构造器,可以直接new实例。也就是说,首先以下几种导出方式是一致的

exports.str = 'a';  

exports.func = function () {};

module.exports = {

str : 'a',

func : function(){}

}

exports = module.exports = {

str : 'a',

func : function(){}

}

引用这个模块的文件,看到的都是相同的内容

var foo = require('./module_test');

console.log(foo)

//{ str: 'a', func: [Function] }

但是如果修改重写exports属性的话,情况就大不一样了。在下面文件中,我们先给exports对象设置两个属性,然后重写exports属性,最后再给exports对象设置两个新属性

exports.str1 = 'before overwrite exports'

exports.func1 = function () {

console.log(this.str1);//此处的this代表当前导出的exports对象

};

exports = {

str2:'inner exports',

func2:function(){}

}

exports.str3 = 'after overwrite';  

exports.func3 = function () {};

引用这个模块的文件

var foo = require('./module_test');

console.log(foo)

//{ str1: 'before overwrite exports', func1: [Function] }

发现一个有趣的现象:重写exports对象的一刻起,exports对象就失去了继续对外导出属性的能力,外部文件只能访问重写之前的exports对象属性。

广州Web前端培训就到广州达内,详情请登陆广州达内Web前端培训官网(gz.web.tedu.cn)!

上一篇:什么时候用exprots 什么时候用module.exports?
下一篇:你可能会碰到的这个移动端问题

微软:Win7寿命仅剩3年,企业应尽早升级

Win10 Build 15007版有这几个最抢眼的变化

Windows手机端Minecraft携带版宣布不再更新

微软推出Win10版PIX游戏调试工具Beta

选择城市和中心
贵州省

广西省

海南省