module

在 Node.js 模块系统中,每个文件都视为独立的模块,node在运行某个模块儿时会生成一个module对象


Module {
id: '.',
exports: 2,
parent: null,
filename: '/Users/leinov/github/node-api/module/module.js',
loaded: false,
children:
[ Module {
id: '/Users/leinov/github/node-api/module/circle.js',
exports: [Object],
parent: [Circular],
filename: '/Users/leinov/github/node-api/module/circle.js',
loaded: true,
children: [],
paths: [Array] } ],
paths:
[ '/Users/leinov/github/node-api/module/node_modules',
'/Users/leinov/github/node-api/node_modules',
'/Users/leinov/github/node_modules',
'/Users/leinov/node_modules',
'/Users/node_modules',
'/node_modules' ] }
  • id为当前文件
  • exports为当前node文件模块儿导出的值
  • parent为父级调用,如果为null则该文件没有被调用
  • filename为当前文件名
  • loaded是否被加载
  • children 引入模块数组,数组项格式同module
  • paths为node模块儿 node_modules 模块儿查找路径,一直查到根目录

module.exports & exports

Node里面的模块系统遵循是CommonJs规范,CommonJs定义的模块分为: 模块标识(module)、模块定义(exports) 、模块引用(require),在模块儿运行的时候都会生成一个module对象和一个exports对象,module对象下也有一个exports对象,默认情况下这两个对象都是空对象。如果有引用其他模块儿或定义模块儿 即module.exports或者exports被赋值时,则该模块儿就是一个有效的带有返回值的模块儿。

一个模块儿真正导出的是module.exports的值,exports只是module.exports的一个引用
可以简单理解为下面这种对象引用和赋值的区别


let obj1 = {a=1};
let obj2 = obj1; console.log(obj1,obj2); // {a:1} {a:1} obj2.a = 2
console.log(obj1,obj2); // {a:2} {a:2} obj2 = {b:3} console.log(obj1,obj2); // {a:2} {b:3}

obj2只是obj1的一个引用。当 obj2.a 改变时其实改变的是 obj1obj2 都指向的同一个堆里的数据。但 obj2 ={b:3} 则重新在堆里开辟了另一个内存块儿来存储。已经跟 obj1 脱离没有关系了

所以经常会看到node模块儿里会像下面这样来导出模块儿。


exports = module.exports = ()=>{
do something
}

这是为了让exports引用指向module.exports同一块内存,确保数据的一致性。

总结

  • 在执行 node 文件时同事创建了 module.exportsexports 对象
  • exports 是指向 module.exports 的一个引用
  • require("xxx") 其实引用的是xxx中的 module.exports 而非 exports

github nodejs

来源:https://segmentfault.com/a/1190000017345276

理解nodejs的module的更多相关文章

  1. 理解nodejs的module模块儿

    module 在 Node.js 模块系统中,每个文件都视为独立的模块,node在运行某个模块儿时会生成一个module对象 Module { id: '.', exports: 2, parent: ...

  2. NodeJS旅程 : module 不可忽略的重点

    modules 模块的简介 Module 是Node.js中最重要的一个部分也是进行深度开发前的必修课.掌握Module才能真正理解NodeJS的精髓,你会发现从思路上会有极大的扩展.  学会写mod ...

  3. 从原理上理解NodeJS的适用场景

    NodeJS是近年来比较火的服务端JS平台,这一方面得益于其在后端处理高并发的卓越性能,另一方面在nodeJS平台上的npm.grunt.express等强大的代码与项目管理应用崛起,几乎重新定义了前 ...

  4. [NodeJs系列][译]理解NodeJs中的Event Loop、Timers以及process.nextTick()

    译者注: 为什么要翻译?其实在翻译这篇文章前,笔者有Google了一下中文翻译,看的不是很明白,所以才有自己翻译的打算,当然能力有限,文中或有错漏,欢迎指正. 文末会有几个小问题,大家不妨一起思考一下 ...

  5. NodeJs 的Module.export 和 export

    NodeJs  的Module.export 和 export 是一样的. 但是Module.export ={....} 可以起效,.export ={....} 是失效的. 这里的export  ...

  6. ES6的export与Nodejs的module.exports

    原文:https://www.cnblogs.com/lxg0/p/7774094.html module.exports与exports,export与export default之间的关系和区别 ...

  7. nodejs 中module.exports 和 exports 区别详细介绍

    你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块接下来介绍创建过程,感兴趣的朋友可以参考下 你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块.例 ...

  8. 77.深入理解nodejs中Express的中间件

    转自:https://blog.csdn.net/huang100qi/article/details/80220012 Express是一个基于Node.js平台的web应用开发框架,在Node.j ...

  9. 理解nodejs中的stream(流)

    阅读目录 一:nodeJS中的stream(流)的概念及作用? 二:fs.createReadStream() 可读流 三:fs.createWriteStream() 可写流 回到顶部 一:node ...

随机推荐

  1. Windows API 第19篇 FindFirstVolumeMountPoint FindNextVolumeMountPoint

    相关函数:HANDLE FindFirstVolumeMountPoint(                                                               ...

  2. 01.Hibernate快速入门

    第一步:下载Hibernate5的运行环境 https://sourceforge.net/projects/hibernate/files/hibernate-orm/ 第二步:在数据库创建表 Cr ...

  3. [转]C#设计模式(8)-Builder Pattern

    一. 建造者(Builder)模式 建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 对象性质的建造 有些情况下,一个对象会有一些重 ...

  4. 【codeforces 505C】Mr.Kitayuta,the Treasure Hunter

    [题目链接]:http://codeforces.com/problemset/problem/505/C [题意] 一开始你跳一步长度为d; 之后你每步能跳d-1,d,d+1这3种步数; 然后在路上 ...

  5. nextjs服务端渲染原理

    1. 简单的介绍一下 nextjs是react进行服务端渲染的一个工具,默认以根目录下的pages为渲染路由 比如我在pages目录下创建一个index.js文件,然后export default一个 ...

  6. 在 Angularjs 中$state.go 如何传递参数

    在目标页面规定接受的参数: .state('app.AttendanceEditFixed', { url: '/AttendanceEditFixed', params: {'id': null,' ...

  7. OPENCV 图像缩放

    工程下载地址 https://download.csdn.net/download/qq_16596909/11522434 opencv4 java netbeans开发,基于maven 可以按照倍 ...

  8. python学习笔记2_二元运算符和比较运算

    一.二元操作符 a+b : a加b a-b :  a减b a*b :  a乘b a/b : a除以b a//b:a整除以b,表示的是返回a除以b的结果的整数部分,而不是证明了a能被b整除.要证明a能被 ...

  9. Leetcode459.Repeated Substring Pattern重复的子字符串

    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" 输出: True 解释 ...

  10. 如何在 Flink 1.9 中使用 Hive?

    Apache Flink 从 1.9.0 版本开始增加了与 Hive 集成的功能,用户可以通过 Flink 来访问 Hive 的元数据,以及读写 Hive 中的表.本文将主要从项目的设计架构.最新进展 ...