• 理解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

  • 相关阅读:
    生产者—消费者模型
    使用wait/notify/notifyAll实现线程间通信的几点重要说明
    死锁
    python基础:协程详解
    python爬虫:multipart/form-data格式的POST实体封装与提交
    python爬虫:Multipart/form-data POST文件上传详解
    python爬虫:http请求头部(header)详解
    python爬虫:登录百度账户,并上传文件到百度云盘
    python爬虫:urlparse模块拆分url
    转:python爬虫:html标签(图文详解二)
  • 原文地址:https://www.cnblogs.com/leinov/p/10108275.html
Copyright © 2020-2023  润新知