1. module应该是require方法中,上下文中的对象

2. exports对象应该是上下文中引用module.exports的新对象

3. exports.a = xxx 会将修改更新到module.exports对象中

4. exports = xxx 直接改变了 exports的指向,

module.js的474行代码:

module._compile(stripBOM(content), filename);

module.js的437行代码:

var wrapper = Module.wrap(content);

再往下跟:

进入node.js文件的879行:

return NativeModule.wrapper[0] + script + NativeModule.wrapper[1];

wrapper[0]是字符串:"(function (exports, require, module, __filename, __dirname) { "

wrapper[1]是字符串:" });"

看到经过wrap这一步,整个自己写的index.js被包装成了一个function,而exports, require, module等等,其实都是外部传进来的对象而已

在index.js中自然可以使用

而且在module.js的439行:

var compiledWrapper = runInThisContext(wrapper, filename, true);

可见通过runInThisContext方法,将上述wrapper代码按照filename的路径生成了一个新的匿名function文件(index.js)

继续调试到达module.js的456行:

var args = [self.exports, require, self, filename, dirname];
return compiledWrapper.apply(self.exports, args);

我们的匿名 function : index.js终于被调用!

args对应匿名function参数:exports, require, module, __filename, __dirname

可以参考的文章:

http://stackoverflow.com/questions/7137397/module-exports-vs-exports-in-nodejs/7142924#7142924

http://cnodejs.org/topic/4f7523168a04d82a3d4446df

http://cnodejs.org/topic/52308842101e574521c16e06

nodejs 中 module.exports 和 exports 的区别的更多相关文章

  1. node.js中module.export与export的区别。

    对module.exports和exports的一些理解 可能是有史以来最简单通俗易懂的有关Module.exports和exports区别的文章了. exports = module.exports ...

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

    你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块接下来介绍创建过程,感兴趣的朋友可以参考下 你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块.例 ...

  3. Pytorch中Module,Parameter和Buffer的区别

    下文都将torch.nn简写成nn Module: 就是我们常用的torch.nn.Module类,你定义的所有网络结构都必须继承这个类. Buffer: buffer和parameter相对,就是指 ...

  4. NodeJs中process.cwd()与__dirname的区别

    process.cwd() 是当前执行node命令时候的文件夹地址 ——工作目录,保证了文件在不同的目录下执行时,路径始终不变__dirname 是被执行的js 文件的地址 ——文件所在目录 Node ...

  5. nodejs中的require,exports使用说明

    模块是一门语言编写大项目的基石,因此,了解如何组织.编写.编译.加载模块很重要.这里主要谈谈Node中的模块加载. 1.Node中的模块,主要使用require来加载模块,文件 require(&qu ...

  6. node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别

    CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷.它的终极目标就是:提供一个类似 Python,Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶 ...

  7. nodejs中exports与module.exports的区别详细介绍

    如果模块是一个特定的类型就用Module.exports.如果模块是一个典型的"实例化对象"就用exports. exports.name = function() { conso ...

  8. nodejs中exports与module.exports的实践

    只要是在nodejs中写自己的文件模块就少不了会遇到module.exports和exports的使用,看别人的代码大多都会使用“module.exports=exports=<对象/函数等&g ...

  9. nodeJS中exports和mopdule.exports的区别

    每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {} module.exports = {}; Node.js为了方 ...

随机推荐

  1. 10、Android--技巧

    10.1.全局获取Context的技巧 在实践中有很多的地方都可以使用到Context 弹出Toast的时候需要,启动活动的时候需要.发送广播的时候需要. 操作数据库的时候需要.使用通知的时候需要.. ...

  2. virtualbox+vagrant学习-3-Vagrant Share-3-SSH Sharing

    SSH Sharing vagrant share通过向vagrant share提供--SSH标志,使远程SSH访问vagrant环境变得非常容易. 如果你想让同事访问你的SSH,以便对ops问题进 ...

  3. c++——register关键字、struct类型、bool关键字、三目运算符

    register关键字增强 //register关键字 请求编译器让变量a直接放在寄存器里面,速度快 //在c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容 /* //1 r ...

  4. 正则匹配与替换 regexp & regsub

    正则匹配是使用正则表达式匹配字符串的一种方法:在脚本编写过程中,经常需要处理一些文本,而这些文本中可能只有部分信息是有用的,我们需要从文本中提取出这些有用信息:这时候,就需要编写特定格式的正则表达式, ...

  5. 使用jquery操作元素的css样式(获取、修改等等)

    //1.获取和设置样式 $("#tow").attr("class")获取ID为tow的class属性 $("#two").attr(&qu ...

  6. 2018-2019赛季最后的随想/$\rm{NOIP2018}$游记·启示录

    他看着眼前的屏幕,静静地发呆. 他不知道迎接他的将会是什么,后天的\(\rm{NOIp}\)终究是个谜. 刚刚给机房里其他人讲完期望的他,打心底觉得自己没有讲好,但效果似乎还可以. "希望别 ...

  7. zabbix 主动模式和被动模式配置文件对比

    1.主动模式: 在web上看zabbix available 是红色 [root@python ~]# egrep -v '^#|^$' /etc/zabbix/zabbix_agentd.conf ...

  8. Java序列化反序列化对象流ObjectInputStream、ObjectOutputStream

    使用Person类作为Object进行示范 注意:Object要能被写入流需要实现Serializable接口 存储的文件后缀名为.ser 示范Person类 import java.io.Seria ...

  9. Linux 和 ubuntu安装redis

    Linux 下安装reids 下载地址:http://redis.io/download,下载最新稳定版本. 本教程使用的最新文档版本为 2.8.17,下载并安装: $ wget http://dow ...

  10. C语言学习记录_2019.02.09

    打印字符串:%s--------printf("%s","abcd"); 打印字符串数组中某一位:%c--------printf("%c" ...