zoukankan      html  css  js  c++  java
  • 理解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

  • 相关阅读:
    生成26个字母
    讲讲promise
    leetcode每日一题(2020-07-27)392. 判断子序列
    leetcode每日一题(2020-07-21):95. 不同的二叉搜索树 II
    leetcode每日一题(2020-07-18):97. 交错字符串
    【Python基础知识】(九)文件和异常
    【Python基础知识】(八)类和继承
    es6 语法
    ant-design-vue 之form表单中label-col和wrapper-col使用
    ant-design-vue 之form表单使用
  • 原文地址:https://www.cnblogs.com/leinov/p/10108275.html
Copyright © 2011-2022 走看看