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

最新文章

  1. BZOJ3110: [Zjoi2013]K大数查询
  2. 关于WCF服务在高并发情况下报目标积极拒绝的异常处理
  3. 轻松解决Linux安装Eclipse方法
  4. DOM基本概念和操作
  5. Eclipse : cannot open output file(c++)
  6. Noip模拟考第三题——饥饿游戏
  7. javascript 汉字生成拼音
  8. win8 任务栏不合并隐藏标题
  9. JS基础类型和对象,分别是按值传递还是按引用传递?
  10. Android logcat使用
  11. hdu 2106
  12. 玩转Google开源C++单元测试框架Google Test系列(转载)
  13. 经常使用ARM汇编指令
  14. oracle dataguard 角色切换
  15. 巡风源码阅读与分析---view.py
  16. shell 关于字符切割 cut
  17. OAF 抛出html消息
  18. Alpha冲刺9
  19. 《面向对象程序设计》第三次作业 Calculator
  20. 《西部世界》S2E9:蝶化庄周,浮生若梦

热门文章

  1. [译]C#和.NET中的字符串
  2. VS的一些实用快捷键及小技巧(不断更新)
  3. EF查询返回DataTable
  4. 使用ActionFilterAttribute实现MVC后台授权
  5. Flask系列07--Flask中的CBV, 蓝图的CBV
  6. 《Python自动化运维之路》 业务服务监控(二)
  7. Python 一篇学会多线程
  8. linux源码安装的步骤
  9. python socket 编程简单入门
  10. python实用库:PrettyTable 学习