资讯专栏INFORMATION COLUMN

理解nodejs的module

hidogs / 2410人阅读

摘要:一个模块儿真正导出的是的值,只是的一个引用可以简单理解为下面这种对象引用和赋值的区别只是的一个引用。已经跟脱离没有关系了所以经常会看到模块儿里会像下面这样来导出模块儿。

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://www.ucloud.cn/yun/99931.html

相关文章

  • 快速理解 nodejs 模块

    摘要:在博客阅读这个小短文用于快速理解模块也就是规范。本质用于暴露一个值,这个值默认是对象,也可以覆盖为原始值。最后提醒,如果前面说的看不懂,可能需要加深对引用值和原始值的理解 在博客阅读:https://ssshooter.com/2019-03... 这个小短文用于快速理解 nodejs 模块(也就是 CommonJS 规范)。 本质 module.exports 用于暴露一个值,这个值...

    Joonas 评论0 收藏0
  • JavaScript 开发者所需要知道 V8(一):V8 In NodeJS

    摘要:欢迎来我的博客阅读开发者所需要知道的一是一款拥有自动垃圾回收功能的编程语言。它随着的第一版发布而发布以及开源。年月,基金宣布和合并,合并版本在未来发布。年月日,官方公布又一个新的名为的优化编译器,主要提供的新语法,以及提高性能。 欢迎来我的博客阅读:「JavaScript 开发者所需要知道的 V8(一):V8 In NodeJS」 Motivation JavaScript 是一款拥有...

    Lemon_95 评论0 收藏0
  • 2018年第33周-javeer对nodejs体会

    摘要:流程源处理源代码,例如过滤任何值。工艺类从编译后处理生成的文件,例如对类进行字节码增强。整合后的测试执行集成测试后执行所需的操作。校验运行任何检查以验证包装是否有效并符合质量标准。 nodejs和es6 nodejs的语法和es6不一样,如模块系统,一个是CommonJS的require、一个是es6的import,写模块也不一样。 nodejs的npm 我来理解,nodejs类似与j...

    xiongzenghui 评论0 收藏0
  • nodejs包依赖管理

    摘要:鲜花总需要绿叶衬托的,对比的包依赖管理,顿时觉得包依赖机制真是漂亮。此文不吐槽的包管理是如何难用和混乱,也不去抨击包管理的孱弱,仅仅讨论如何优雅地使用进行包依赖管理。 鲜花总需要绿叶衬托的,对比php, java, python的包依赖管理,顿时觉得nodejs包依赖机制真是漂亮。此文不吐槽python的包管理是如何难用和混乱,也不去抨击php包管理的孱弱,仅仅讨论如何优雅地使用npm...

    chenatu 评论0 收藏0
  • Javascript模块全揽

    摘要:要求模块编写必须在真正的代码之外套上一层规定的代码包装,样子看起来是这样的模块代码通过传递一个签名为的回调函数给函数,就可以把需要注入的变量和函数注入到模块代码内。 之前写的文章急速Js全栈教程得到了不错的阅读量,霸屏掘金头条3天,点赞过千,阅读近万,甚至还有人在评论区打广告,可见也是一个小小的生态了;)。看来和JS全栈有关的内容,还是有人颇有兴趣的。 showImg(https://...

    lily_wang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<