module.exports 与 exports

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

var a = new Object(); // a相当于module.exports
var b = a; // b相当于exports

例子 exports

导出模块

// rocker.js

exports.name = function() {
console.log('My name is fang');
};

导入模块

var rocker = require('./rocker.js');
rocker.name(); // 'My name is fang'

例子 module.exports

每一个 node.js 执行文件,都自动创建一个 module 对象。
同时, module 对象会创建一个叫 exports 的属性,初始化的值是 {} 。即 module.exports = {}

导出模块

module.exports = function(name, age) {
this.name = name;
this.age = age;
this.about = function() {
console.log(this.name +' is '+ this.age +' years old');
};
};

导入模块

var Rocker = require('./rocker.js');
var r = new Rocker('fang', 23);
r.about(); // fang is 23 years old

例子 module.exports

foo.js

function View(){ }

View.prototype.test = function(){
console.log('test')
} View.test1 = function(){
console.log('test1')
}
module.exports = View

test.js

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

console.log(x) //{ [Function: View] test1: [Function] }
console.log(x.test) //undefined
console.log(x.test1) //[Function]
x.test1() //test1
 
 
 
 
 
 
 

扩展阅读

Nodejs的模块系统以及require的机制

原 https://www.cnblogs.com/bq-med/p/9008190.html

Nodejs 有一个简单的模块加载系统。在 Nodejs 中,文件和模块是一一对应的(每个文件被视为一个独立的模块)。

require方能看到的只有module.exports这个对象,它是看不到exports对象的,而我们在编写模块时用到的exports对象实际上只是对module.exports的引用。

每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}

module.exports = {};

首先说一个概念:

ECMAScript的变量值类型共有两种:

  • 基本类型 (primitive values) : 包括Undefined, Null, Boolean, Number和String五种基本数据类型;
  • 引用类型 (reference values) : 保存在内存中的对象们,不能直接操作,只能通过保存在变量中的地址引用对其进行操作。

我们今天要讨论的exports和module.exports属于Object类型,属于引用类型。

看下面的例子:

 
var module = {
exports:{
name:"我是module的exports属性"
}
};
var exports = module.exports; //exports是对module.exports的引用,也就是exports现在指向的内存地址和module.exports指向的内存地址是一样的 console.log(module.exports); // { name: '我是module的exports属性' }
console.log(exports); // { name: '我是module的exports属性' } exports.name = "我想改一下名字"; console.log(module.exports); // { name: '我想改一下名字' }
console.log(exports); // { name: '我想改一下名字' }
//看到没,引用的结果就是a和b都操作同一内存地址下的数据
 

回到nodejs中,module.exports初始的时候置为{},exports也指向这个空对象。

 
exports.name = function(x){
console.log(x);
}; //和下面这个一毛一样,因为都是修改的同一内存地址里的东西 module.exports.name = function(x){
console.log(x);
};
 

但是这样写就有了区别了:

 
exports = function(x){
console.log(x);
}; //上面的 function是一块新的内存地址,导致exports与module.exports不存在任何关系,而require方能看到的只有module.exports这个对象,看不到exports对象,所以这样写是导不出去的。 //下面的写法是可以导出去的。说句题外话,module.exports除了导出对象,函数,还可以导出所有的类型,比如字符串、数值等。
module.exports = function(x){
console.log(x);
};
 

Nodejs 中的每一个模块都会自动创建一个 module 对象,同时 module 对象下有一个叫 exports 的属性,可以将某个类的实例赋值给 module.exports,从而导出这个类的实例。在模块被执行前,Nodejs 会将 module.exports 的值赋于全局变量 exports ,以便 module.exports.f = ...  可以更简洁的写成 exports.f = ...  。注意:就像所有变量一样,如果重新给 exports 赋值,它就不再绑定到 module.exports 了,也不会导出指定模块。

foo1.js

 
/**
*导入方式:var foo = require("./foo1.js");
*/
function Foo() {}
Foo.prototype.hello = function() {
console.log("hello Nodejs!");
} module.exports = new Foo();
 

foo2.js

 
/**
*导入方式:var Foo = require("./foo2.js"); var foo = new Foo();
*/
function Foo() {}
Foo.prototype.hello = function() {
console.log("hello Nodejs!");
} module.exports = Foo;
 

foo3.js

 
/**
*导入方式:var foo = require("./foo3.js");
*/
exports.hello = function() {
console.log("hello Nodejs!");
}
 

module.exports 与 exports的更多相关文章

  1. nodejs里的module.exports和exports的关系

    关于node里面的module.exports和exports的异同,网上已经有很多的资料,很多的文章,很多的博客,看了很多,好像懂了,又好像不懂,过几天又不懂了...大致总结是这样的: //下面这种 ...

  2. Node.js module.exports和exports的区别

    require 用来加载代码,而 exports 和 module.exports 则用来导出代码,从接触node.js就不会它们两陌生,上代码: foo.js exports.a = functio ...

  3. node基础再现--module.exports 和exports

    实际上,最最基础的方法,最最原始的方法是module.exports,至于exports,是为了方便书写才出来的,应该说,module.exports 包含exports,所工作的范围更加的广泛! m ...

  4. module.exports与exports,export和export default

    还在为module.exports.exports.export和export default,import和require区别与联系发愁吗,这一篇基本就够了! 一.首先搞清楚一个基本问题: modu ...

  5. nodejs里的module.exports和exports

    引 在node.js中我们可以使用module.exports和exports导出模块,设置导出函数.数组.变量等等 为什么可以用这两个模块? 或者直接问,node.js的模块功能是怎么实现的. 这样 ...

  6. module.exports与exports区别

    CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. ...

  7. module.exports与exports

    API文档是枯燥的,下面本人收集了一些论坛经常有人疑问和开源代码中经常遇到的案例供大家研究一下. module.exports与exports的区别 每一个node.js执行文件,都自动创建一个mod ...

  8. node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别

    CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷.它的终极目标就是:提供一个类似 Python,Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶 ...

  9. (转)Node.js module.exports与exports

    本文转自Node.js module.exports与exports 作者: chemdemo 折腾Node.js有些日子了,下面将陆陆续续记录下使用Node.js的一些细节. 熟悉Node.js的童 ...

随机推荐

  1. python 什么是位置参数?

    位置参数是必选参数 ----不能不传, ----不能传一部分, ---必须按顺序传 ----必须传全部参数

  2. python pandas使用数据透视表

    1) 官网啰嗦这一堆, pandas.pivot_table函数中包含四个主要的变量,以及一些可选择使用的参数.四个主要的变量分别是数据源data,行索引index,列columns,和数值value ...

  3. edis配置文件-转

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 bytes # 1kb ...

  4. 开发vue单页面Demo

    第1步:安装webpack脚手架 npm install webpack -g (全局安装) (新电脑启动npm run dev版本报错,是因为webpack-server版本更新的问题,要安装pac ...

  5. Linux基础命令---vim文本编辑

    vim vim是unix系统最通用的文本编辑器,它的功能可以说是非常强大了,它是vi的升级版.vim有三种工作模式:编辑模式.命令模式.末行模式,默认打开的时候进入命令模式. 此命令的适用范围:Red ...

  6. 基于EOS开发的Dapp大全

    基于EOS开发的Dapp大全 截止20180424,基于EOS开发的项目在50,很多项目的规划信息还不完善,搜集了基本的信息,供大家参考. ==========================长期囤币 ...

  7. HDU 1879 继续畅通工程(最小生成树)

    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经 ...

  8. 五一 DAY2

    DAY 2 比如:依次输入 3 1 5 4 2                                        插入 6 这里FZdalao有一个很巧妙的构造,直接吧输入的数字排成一个二 ...

  9. slideDown留言板

    <!doctype html> <html lang="en"> <head> <meta http-equiv="Conten ...

  10. java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'waterQuality

    如果一个项目中有两个@RequestMapping("/xxx")完全相同就会报  java.lang.IllegalStateException 改进办法:修改@RequestM ...