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

原文地址:https://www.cnblogs.com/lovellll/p/10162129.html

时间: 2024-10-08 23:49:55

理解nodejs的module的相关文章

深入理解nodejs 中 exports与module.exports

在Javascript 中,有2种作用域,分为 全局作用域 ,和函数作用域, 在 浏览器端 , 全局作用域 就是 window对象的属性, 函数作用域 就是 ,某个 函数 生成的对象的属性: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script> var name

NodeJS旅程 : module 不可忽略的重点

modules 模块的简介 Module 是Node.js中最重要的一个部分也是进行深度开发前的必修课.掌握Module才能真正理解NodeJS的精髓,你会发现从思路上会有极大的扩展.  学会写module就相当于学会了在C#内写类和开发类库一般. 一切从require开始 在nodejs中最常使用的就是 require("模块名") 函数了.require就相当于我们在C#中使用的using关键字,模块相当于某一命名空间下的类库.我们可以通过显式引入或隐式引入两种方式使用requir

从原理上理解NodeJS的适用场景

NodeJS是近年来比较火的服务端JS平台,这一方面得益于其在后端处理高并发的卓越性能,另一方面在nodeJS平台上的npm.grunt.express等强大的代码与项目管理应用崛起,几乎重新定义了前端的工作方式和流程. NodeJS的成功标志着它的强大,但是不是所有情况都适合应用NodeJS作为服务器端平台呢? 答案当然是否定的,而网上也是众说纷纭.那我们从原理出发了解一下NodeJS的适用情况. 在讲NodeJS之前我们不仿先看一下传统(以Apache为代表)的服务器端处理平台处理并发的方式

nodejs 中module.exports 和 exports 区别详细介绍

你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块接下来介绍创建过程,感兴趣的朋友可以参考下 你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块.例如:(假设这是rocker.js文件)  复制代码代码如下: exports.name = function() { console.log('My name is Lemmy Kilmister'); }; 在另一个文件中你这样引用  复制代码代码如下: var rocker = require(

ES6的export与Nodejs的module.exports

module.exports与exports,export与export default之间的关系和区别 首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定,每个模块内部,module变量代表当前模块.这个变量是一个对象,它的expor

理解Nodejs的Event Loop

Node的"event loop"主要是用来处理高输出量的.这很神奇,这也是为什么node可以在单线程的情况下同时处理很多的后台操作.本文就会集中讲述event loop是怎么运行的,这样你可以可以使用这个神奇的东西完成你自己的工作. 事件驱动的编程(event-driven programming) 要理解event loop首先需要了解的就是event driven programming(事件驱动的编程).这个在1960年代就已经被人们所熟知.如今,event-driven pr

nodejs addon/module

http://skitr.com/2014/05/13/debugging-node-js-addons-on-linux-and-mac-osx/ http://adilapapaya.com/docs/node-gyp/#installation https://nodejs.org/docs/latest/api/addons.html http://modernweb.com/2015/03/19/develop-an-ios-application-with-node-js-and-c

ES6的export与Nodejs的module.exports比较

首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定,每个模块内部,module变量代表当前模块.这个变量是一个对象,它的exports属性(即module.exports)是对外的接口.加载某个模块,其实是加载该模块的module.ex

理解Nodejs的Buffer

上周同事用我们的工具写了一个关于全国比较出名的景点介绍的APP,地址在这里.整个APP中文字符比较多,文件也比较大,计算了下整个APP描述文件大小在4M左右.整个描述文件要放到第三方CDN.在这中间,我们的服务器主要负责获取前端传上来的数据,做一些加工处理并压缩后抛给第三方CDN服务器. Node接受POST数据通常的写法: var load = function(stream, onDone) { var data = ''; stream.on('data', function(chunk)