文档章节

export 和 module.export 的区别

孟飞阳
 孟飞阳
发布于 07/16 14:54
字数 925
阅读 7
收藏 1

在浏览器端 js 里面,为了解决各模块变量冲突等问题,往往借助于 js 的闭包把左右模块相关的代码都包装在一个匿名函数里。而 Nodejs 编写模块相当的自由,开发者只需要关注 require,exports,module 等几个变量就足够,而为了保持模块的可读性,很推荐把不同功能的代码块都写成独立模块,减少各模块耦合。

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

 module.exports = {};

在 node 的 js 模块里可以直接调用 exports 和 module 两个“全局”变量,但是 exports 是 module.exports 的一个引用。

//plus.js
function plus(a,b){
  return a+b;
}
// 这样导出的 plus 是作为 exports 的一个方法被导出的
exports.plus = plus;

// main.js
var Plus = require('plus');
console.log(Plus.plus(1,2)); // 左边的 Plus 是 require 过来的模块名,右边的是它的 plus 方法。

在 node 编译的过程中,会把 js 模块封装成如下形式:

// require 是对 Node.js 实现查找模块的 Module._load 实例的引用
// __finename 和 __dirname 是 Node.js 在查找该模块后找到的模块名称和模块绝对路径
(function(exports,require,module,__filename,__dirname){
  function plus(a,b){
    return a+b;
  }
  exports.plus = plus;
})

为了将函数直接导出成模块,而不是模块的一个方法,需要

module.exports = plus;

// plus.js
function plus(a,b){
  return a+b ;
}
module.exports = plus;
// main.js
var plus = require('plus');
console.log(plus(1,2));

exports = module.exports = {};

  • exports 是 module.exports 的一个引用
  • module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {}
  • require 引用模块后,返回的是 module.exports 而不是 exports!!!!!
  • exports.xxx 相当于在导出对象上挂属性,该属性对调用模块直接可见
  • exports = 相当于给 exports 对象重新赋值,调用模块不能访问 exports 对象及其属性
  • 如果此模块是一个类,就应该直接赋值 module.exports,这样调用者就是一个类构造器,可以直接 new 实例。

例子一:

var name = 'rainbow';
exports.name = name;
exports.sayName = function(){
  console.log(name);
}
// 给 exports 赋值相当于给 module.exports 这个空对象添加了两个属性,相当于:
var name = 'rainbow';
module.exports.name = name;
module.exports.sayName = function(){
  console.log(name);
}

例子二:

exports = module.exports = somethings
// 等价于
module.exports = somethings
exports = module.exports 
// module.exports = somethings 是对 mudole.exports 进行了覆盖,此时 module.exports 和 exports 的关系断裂,mudole.exports 指向了新的内存块,而exports 还是指向原来的内存块,为了让 module.exports 和 exports 还是指向同一个内存或者说指向同一个"对象",所以我们就 exports = module.exports.

例子三:

exports = function(){};
// 这样就是重新给 exports 赋值,它将不再是 module.exports 的引用,二者将无任何联系。

例子四:

module.exports.something = function(){};
exports.something = function(){};
// 上面两个方程是等价的

例子五:

// index.js
var something = require('./requireMe');
something();
// requireMe.js
exports.something = function(){
  console.log('am a function');
}
// 以上代码会报错,因为 require 出来的 module.exports 是一个object,不能直接执行

//修改方式一
// requireMe.js
module.exports = function(){
   console.log('am a function');
}
// 当把代码改成上面这样,就不会报错,因为此时的 module.exports 是一个 function,可以直接执行。
// 修改方式二
// index.js
var something = require('./requireMe');
something.something();
// 因为这时候 require 出来的是一个 object,有一个 something 的属性,所以可以这样调用执行。

other:

reference 是 引用的意思,就是两个变量引用同一个值,是指向同一个内存地址。

本文转载自:https://www.jianshu.com/p/e452203d56c4

共有 人打赏支持
孟飞阳
粉丝 204
博文 955
码字总数 540957
作品 5
朝阳
个人站长
一步两步三步开始自己的vue插件库(webpack配置)

作为程序员,更加需要理想坚定与坚持 文/ziven 标题图/来自网络 有时候,开发过程中,有意无意都会慢慢有自己的一些积累,比如说写了一个动画组件,或者写了一个比较漂亮,体验比较好的插件。...

ziven先生
2017/05/27
0
0
学渣的模块化之路——50行代码带你手写一个common.js规范

一、简述 一个js文件就是一个模块 会自动把写的代码块套一层闭包 浏览器不兼容CommonJS的根本原因,在于缺少四个Node.js环境的变量.(module,export,require,global) 既然没有,我们就手写一个...

言sir
06/25
0
0
Slick Lazy Load Photo Grid Using Webpack 3

Overview How to layout and lazy load images in a flexible grid similar to how facebook displays them in a post. Selected images open a lightbox for previewing within a carousel.......

frenettej
2017/12/22
0
0
docker save与docker export的区别

在http://chy940405.blog.51cto.com/11344281/1981804 这篇文章中分享了docker 基本操作Ⅱ(关于镜像操作),其中有一个问题就是docker save和docker export都能导出镜像包,咋看起来区别似乎...

我不是瘦子
2017/11/15
0
0
Linux中set,env和export这三个命令的区别

Linux中set,env和export这三个命令的区别 set命令显示当前shell的变量,包括当前用户的变量; env命令显示当前用户的变量; export命令显示当前导出成用户变量的shell变量。 但shell自己的变量...

赵帅A
2016/02/29
149
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【七】组合Action

本章描述了常用定义Action的方法。 自定义action builders 我们在action一章已经看过如何声明一个action——有request parameter、无request parameter、有body parser等等。你可以在 asynch...

Landas
27分钟前
0
0
Spring Boot实战之基础回顾

本文作者: 吴伟祥 本文链接: https://wuweixiang.cn/2018/08/21/Spring-Boot实战之基础回顾/ 版权声明: 本博客所有文章除特别声明外均为原创,采用CC BY-NC-SA 4.0 许可协议。转载请在文章开...

吴伟祥
27分钟前
0
0
OAuth认证开发

提示: 以下测试是基于项目安装成功,初始化数据库(initial_db.ddl, oauth.ddl, initial_data.ddl)后的测试, 也可在页面上点击"client_details"菜单里进行测试 方式1:基于浏览器 (grant_type=...

舒文joven
36分钟前
1
0
第二章-对象及变量的并发访问-第二篇

锁对象的改变 请阅读如下代码 public class MainClass { private String lock = "123"; public void printStringB() { try { synchronized (lock) { ......

简心
40分钟前
0
0
日志中记录代理IP以及真实客户端、apache只记录指定URI的日志

apache 日志中记录代理IP以及真实客户端 默认情况下log日志格式为: LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined 其中%h 是记录访问者的IP,如果在web的前...

李超小牛子
48分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部