参考链接:简书博客、简书博客、CommonJS规范

功能介绍

module.exports

Node应用由模块组成,采用CommonJS模块规范。根据这个规范,每个文件就是一个模块,有自己的作用域。在这些文件里面定义的变量、函数、类,都是私有的,对外不可见,因此规避掉了作用域污染。
根据CommonJS规定,每个模块内部,module变量代表当前模块,这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实就是加载该模块的exports属性。
举例:通过module.exports输出变量 age 和 sayHelloTo 函数。

./MyModule.jsvar age = 7; var sayHelloTo= function (name) { return "hello " + name;}; module.exports.age = age; module.exports.sayHelloTo=sayHelloTo;

参考链接:module.exports的使用方法

require:用于加载模块

var temp = require('./MyModule.js');  //这里也可以使用 import myModule from './MyModule.js'
console.log(temp.age); // 7
console.log(temp.sayHelloTo("Steve")); // hello Steve

额外说明:对于自定义的模块,需要使用相对路径,否则会提示找不到模块/组件(默认情况下,非相对路径的引用,会从node_modules文件夹中查找)

exports 与 module.exports

为了方便,node为每个模块提供了一个exports变量,指向module.exports。这等同于在每个模块头部,有这么一行代码:

var exports = module.exports;

因此,我们可以直接在exports对象上添加方法(等同于在 module.exports 添加一样)

./MyModule.jsvar age = 7; var sayHelloTo= function (name) { return "hello " + name;}; exports.age = age;  //等效于:  module.exports.age = age;exports.sayHelloTo=sayHelloTo;  //等效于: module.exports.sayHelloTo=sayHelloTo;

PS:不能直接将exports指向一个值,这会切断 exports 与 module.exports 的联系(但是可以用module.exports来指向一个值)

./MyModule.jsvar age = 7; var sayHelloTo= function (name) { return "hello " + name;}; exports = age;  //不要这么干。这么做会切断exports与module.exports的联系

module.export和exports两者区别

你可以用它创建你的模块。例如:(假设这是rocker.js文件)

exports.name = function() {console.log('my name is cp');
}

在另一个文件中引用rocker.js

var rocker = require('./rocker.js');
rocker.name(); // my name is cp

先来看一个例子

var a = {name: 1};
var b = a;console.log(a);
console.log(b);b.name = 2;
console.log(a);
console.log(b);var b = {name: 3};
console.log(a);
console.log(b);// 运行输出结果为:
// { name: 1 }
// { name: 1 }
// { name: 2 }
// { name: 2 }
// { name: 2 }
// { name: 3 }

a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一块内存,所以前两个输出一样。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也会体现出来,所以第三四个输出一样。当 b 被覆盖时,b 指向了一块新的内存,a 还是指向原来的内存,所以最后两个输出不一样。
module.exports和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 cp');
}

再次引用执行rocker.js

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

出现报错:rocker.name is not a function

rocker模块忽略了exports收集的name方法,返回了一个字符串“ROCK IT!”。由此可知,你的模块并不一定非得返回“实例化对象”。你的模块可以是任何合法的javascript对象–boolean, number, date, JSON, string, function, array等等。
你的模块可以是任何你设置给它的东西。如果你没有显式的给module.exports设置任何属性和方法,那么你的模块就是exports设置给module.exports的属性。

结论:

  • module.exports 初始值为一个空对象 {}
  • exports 是指向的 module.exports 的引用
  • require() 返回的是 module.exports 而不是 exports

使用方法

用两个例子来解析
例子1:
下面例子中,你的模块是一个类:

module.exports = function(name, age) {this.name = name;this.age = age;thisl.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

例子2:
下面例子中,你的模块是一个数组:

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]); // Rocking in heaven: Ronnie James Dio

什么时候用exports?什么时候用module.exports?

从以上两个例子,我们可以总结出:

  • 如果你想你的模块是一个特定的类型就用Module.exports。
  • 如果你想的模块是一个典型的“实例化对象”就用exports。

给module.exports添加属性类似于给exports添加属性,例如:

module.export.name = function() {console.log('my name is cp');
}

同样,exports是这样的

exports.name = function() {console.log('my name is cp');
}

注意: 这两种结果并不相同。前面已经提到module.exports是真正的接口,exports只不过是它的辅助工具。推荐使用exports导出,除非你打算从原来的“实例化对象”改变成一个类型。

在ES6中,使用export default 和 export 向外暴露成员

用 export 导出的模块,需要用 import 来进行导入,而不能用 require。
node中导入模块:var 名称 = require(‘模块标识符’)

node中向外暴露成员的形式:module.exports = {}

在ES6中,也通过规范的形式,规定了ES6中如何导入和导出模块

ES6中导入模块,使用

  • import 模块名称 from ‘模块标识符’
  • import ‘表示路径’

import *** from *** 是ES6中导入模块的方式
例如:

// test.js
export default {name: 'zs',age: 20
}

或是

// test.js
var info = {name: 'zs',age: 20
}
export default info

在main.js中接收,test.js使用export default 向外暴露的成员

import person from './test.js'
console.log(person);


注意:

1、export default 向外暴露的成员,可以使用任意变量来接收

2、在一个模块中,export default 只允许向外暴露一次

3、在一个模块中,可以同时使用export default 和export 向外暴露成员

4、使用export向外暴露的成员,只能使用{ }的形式来接收,这种形式,叫做【按需导出】

5、export可以向外暴露多个成员,同时,如果某些成员,在import导入时,不需要,可以不在{ }中定义

6、使用export导出的成员,必须严格按照导出时候的名称,来使用{ }按需接收

7、使用export导出的成员,如果想换个变量名称接收,可以使用as来起别名

module.export和exports两者区别及使用方法相关推荐

  1. Node中Exports与module.export的使用与区别

    最近在看<node开发实战详解>时有写疑问,所以自己就整理了一些资料.下面是node4.*的官方api文档(http://nodejs.cn/doc/node_4/modules.html ...

  2. module.exports和exports得区别

    对module.exports和exports的一些理解 可能是有史以来最简单通俗易懂的有关Module.exports和exports区别的文章了. exports = module.exports ...

  3. nodejs中module.exports和exports的区别

    最近在学习nodejs,这篇文章就权当是一篇笔记,如果有什么地方有误,望指出. 首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范 Com ...

  4. exports和module.exports的区别

    请牢记一条原则:无论使用 exports 暴露成员,或是 module.exports 暴露成员,最终暴露的结果,都是以 module.exports 所指向的对象为准. 1.module 对象 看一 ...

  5. module是什么类型_nodejs中module.exports和exports的区别

    本文同步发表在我的个人博客中: 沧沧凉凉​www.cclliang.com 最近在学习nodejs,这篇文章就权当是一篇笔记,如果有什么地方有误,望指出. 先说说它们之间的区别: exports只能使 ...

  6. node.js中exports与module.exports的区别分析

    前言 关于Node.js中的exports和module.exports,很多时候都比较容易让人混淆,弄不清楚两者间的区别.那么我们就从头开始理清这两者之间的关系. 来源 在开发Node.js应用的时 ...

  7. Node.js: exports 和 module.exports 的区别

    我理解的exports 和 module.exports 的区别,欢迎大家吐槽~ 为了更好的理解 exports 和 module.exports 的关系,我们先来补点 js 基础.示例: app.j ...

  8. 【nodejs】import、export、exports、module.exports

    1.import 和 export(ES6特性) 目录结构 export_file.js export const myNumbers = [1, 2, 3, 4]; const animals = ...

  9. export、export default、module.export区别

    在es6里面定义模块,导出模块时可以使用export.export default 这2者区别: 在同一个文件里面可以有多个export, 一个文件里面只能有1个export default 1 // ...

最新文章

  1. 解决 Python2.7 报错 UnicodeDecodeError: 'ascii' codec can't decode...
  2. vue cli 4.x打包后如何部署到tomcat服务器上
  3. [html] 开发静态页面时,不依赖node相关的工具,如何提取出公共部分并引入?
  4. dingding post POST请求
  5. 统计学习方法9—EM算法
  6. 将 url query参数 字符串转换为JSON 对象
  7. 基于SSM的灾情发布平台
  8. 如何解决xp进系统的时候需要按enter键
  9. yii框架封装拼多多开放平台sdk
  10. vs201x下正则表达式过滤中文
  11. 《华为你学不会》读书笔记
  12. 最易难学习的编程语言榜单出炉,C++最难学?
  13. IntelliJ IDEA 整理代码格式 快捷键
  14. 怎么在服务器上安装SSL证书?服务器证书安装配置指南
  15. 《SteamVR2.0/Input》(Yanlz+SteamVR+Input+OpenVR+Runtime+SteamVR_Action+立钻哥哥+==)
  16. thinkcmf图片上传七牛云不显示的问题(七牛图片后缀!watermark)
  17. 再见python你好julia_再见 Python 2,你好 Python 3
  18. phpwind安装空白问题解决
  19. 【优化求解】基于收敛因子和黄金正弦指引机制的蝴蝶优化算法求解单目标优化问题matlab代码(AGSABOA)
  20. H5网页使用支付宝授权登录获取用户信息详解

热门文章

  1. 254work 9月总结复盘:师傅领进门 修行在个人
  2. docker安装gogs
  3. windows 文件夹设置 everyone 共享
  4. 永磁双极性步进电机原理
  5. CCC3.0学习笔记_数字钥匙系统架构
  6. (45)中断门和快速调用进0环详解,重写 WriteProcessMemory
  7. async 函数 ajax,Async 函数的使用及简单实现
  8. 【计算机网络】--- HTTP与HTTPS协议详解
  9. Android系统防火墙开发一(1)功能介绍
  10. 【C++】安装visual studio 2015后遇到问题