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

  • 相关阅读:
    Babel的安装和使用
    ECMAScript 6 和数组的新功能
    网站首页被降权后怎么快速处理
    赫然:怎样学习seo优化技术
    浅谈互联网页面价值
    ZERO:从搜索用户来看SEO
    李彦宏:论搜索引擎三个定律
    焦大:seo该研究用户需求还是搜索算法
    GA教程:使用自定义变量来扩展高级细分
    焦大:做SEO应该研究的用户需求的方向
  • 原文地址:https://www.cnblogs.com/lovellll/p/10162129.html
Copyright © 2020-2023  润新知