明白nodejs的module

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
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞