nodejs所谓的模块就是一个文件,或者是匿名函数。(CommonJs)

require

exports

module.exports。

为什么直接console.log(typeof require('*****')) # 是一个string类型?

但是使用的话,又是一个对象函数?

https://github.com/nodejs/node/blob/v5.x/lib/internal/bootstrap_node.js
https://github.com/nodejs/node/blob/v5.x/lib/module.js
复制代码

https://github.com/nodejs/node/blob/v5.x/lib/module.js

通过对源码的查看:

364行列:Module.prototype.require = function(path) {assert(path, 'missing path');assert(typeof path === 'string', 'path must be a string');return Module._load(path, this, /* isMain */ false);};复制代码
Module._load = function(request, parent, isMain) {if (parent) {debug('Module._load REQUEST %s parent: %s', request, parent.id);}var filename = Module._resolveFilename(request, parent);
复制代码
# module._compile:Module.prototype._compile = function(content, filename) {var self = this;var args = [self.exports, require, self, filename, dirname];return compiledWrapper.apply(self.exports, args);
};复制代码

得出以下结论

require 一个文件的时候,会对其进行进行一个匿名函数的包装。

(function (exports, require, module, __filename, __dirname) {// 模块源码
});
复制代码

requier顺序:

1、先从缓存中读取,如果没有则继续往下
2、判断需要模块路径是否以/结尾,如果不是,则要判断a. 检查是否是一个文件,如果是,则转换为真实路径b. 否则如果是一个目录,则调用tryPackage方法读取该目录下的package.json文件,把里面的main属性设置为filenamec. 如果没有读到路径上的文件,则通过tryExtensions尝试在该路径后依次加上.js,.json和.node后缀,判断是否存在,若存在则返回加上后缀后的路径
3、如果依然不存在,则同样调用tryPackage方法读取该目录下的package.json文件,把里面的main属性设置为filename
4、如果依然不存在,则尝试在该路径后依次加上index.js,index.json和index.node,判断是否存在,若存在则返回拼接后的路径。
5、若解析成功,则把解析得到的文件名cache起来,下次require就不用再次解析了,否则若解析失败,则返回false
复制代码

exports和module.exports的区别

function require(/* ... */) {const module = { exports: {} };((module, exports) => {function someFunc() {}exports = someFunc;module.exports = someFunc;})(module, module.exports);return module.exports;
}
复制代码
exports = module.exports,所以说,一开始这两个东西指向同一个对象实例
exports.x = function() {
//在exports上添加了一个方法,module.exports也添加了同样的方法,因为它们指向了同样的对象实例  console.log("Hi!");
}
module.exports.x();
复制代码

总结

# exports其实是module的属性,require则是Module原型的方法。exports.xx=xx,其实跟module.exports.xx=xx其实是一样的,不过如果直接为export赋值,则不能写成exports=xx,而应该写成module.exports=xx,因为exports在这里只是一个引用。# 从上面也可以看到,每一次require,都会把new一个Module,并且把这个Module添加到当前模块的children中,并且返回新建的Module对象的exports。# 其实node启动的原理跟require是一样的,src/node.cc中的node::LoadEnvironment函数会被调用,在该函数内则会接着调用lib/internal/bootstrap_node.js中的代码,并执行startup函数,startup函数会执行Module.runMain方法,而Module.runMain方法会执行Module._load方法,参数就是命令行的第一个参数(比如: node ./app.js),如此,跟上面require就走到一起了。
复制代码

nodejs中的模块的理解相关推荐

  1. Nodejs中的模块系统

    一.模块化的定义 ①具有文件作用域 ②具有通信规则:加载和导出规则 二.CommonJS模块规范 1.nodejs中的模块系统,具有文件作用域,也具有通信规则,使用require方法加载模块,使用ex ...

  2. nodejs中的模块系统:exports导出模块

    node中的模块系统 示例: 模块作用域 成功获取add: module.exports

  3. nodejs中events模块的使用

    nodejs中events的基本使用 讲events之前我们先用js模拟实现一个EventEmitter类 源码 //订阅者集合 class EventEmitter{constructor(){th ...

  4. TypeScript完全解读(26课时)_14.ES6和Nodejs中的模块

    创建modules文件夹,我们的文件都写在这里面 modules下面新建index.js文件,在index.ts内引入这个js文件 es6的模块 最主要的两个关键字 import和export imp ...

  5. nodejs 中es5 模块的几种写法

    1. module.exports.func = function(){}  module.exports.field = ''; 第一种是逐个对api 和字段导出. 2. module.export ...

  6. Nodejs 中的包、npm 、第三方模块、 package.json 以及 cnpm

    一.包与 NPM 包Nodejs 中除了它自己提供的核心模块外,我们可以自定义模块,也可以使用第三方的 模块.Nodejs 中第三方模块由包组成,可以通过包来对一组具有相互依赖关系的模块进行 统一管理 ...

  7. 第二章. node中的模块和require

    2019独角兽企业重金招聘Python工程师标准>>> 一 什么是模块. JavaScript诞生初,它只不过是一个网页的小脚本而已,没有人会想到它会发展到现在能有大量的库,工具,组 ...

  8. nodejs linux模块全局,nodejs笔记一--模块,全局process对象;

    一.os模块可提供操作系统的一些基本信息,它的一些常用方法如下: var os = require("os"); var result = os.platform(); //查看操 ...

  9. nodejs操作sqlserver数据_实例分析nodejs基于mssql模块连接sqlserver数据库的简单封装操作...

    本文主要介绍了nodejs基于mssql模块连接sqlserver数据库的简单封装操作,结合实例形式分析了nodejs中mssql模块的安装与操作sqlserver数据库相关使用技巧,需要的朋友可以参 ...

最新文章

  1. 如何将DynamoDB的数据增量迁移到表格存储
  2. webpack简单配置
  3. FAT AP和FIT AP 区别 (无线篇)
  4. 【LiveVideoStack线上分享】— FreeSWITCH核心架构与流程控制
  5. VS 添加文件添加文件成链接
  6. 《HeadFirst Python》第一章学习笔记
  7. Mac中搭建Kubernetes
  8. python神经网络库 keras_在Python和R中使用Keras和Tensorflow进行深度学习
  9. sql 查看Oralce 数据库连接状态
  10. 小米真香产品被友商怼:只有USB2.0接口 怎么播高码率的视频?
  11. 时空解析理论的实验检验方法
  12. ecshop 实现购物车退出不清空
  13. 图形学人物简史:两位图灵奖与奥斯卡得主的图形学研究往事
  14. 常见路由器默认登录用户名和密码(大全)
  15. UE官网ARPG游戏学习笔记1
  16. oracle的job引起数据库崩溃,JOB忽然停止工作了
  17. 平面设计中的插画设计技巧
  18. 计算机专业的你,毕业后可以从事什么职业?前景如何?
  19. Java 代码 各种不规范示范,希望引以为戒,望看到的大哥们 都能把代码写的规范点,方便你我他。
  20. Win10大更新后(悦米)机械键盘无法使用

热门文章

  1. 我的flash头像编辑上传控件
  2. 21个演示展示强大的jQuery特效
  3. 记一次nginx反向代理做转发遇到的坑
  4. Tensorflow Timeline介绍及简单使用
  5. android安卓Sqlite数据库实现用户登录注册
  6. CiTRIX XenServer 6.5安装体验
  7. 函数call相关[ASM]
  8. SQL SERVER 自定义函数参数数量对调用时参数数量的影响
  9. iOS 关于使用xib创建cell的两种初始化方式
  10. 执行php程序的时候,报错Allowed memory size of 134217728 bytes exhausted (tried to allocate 83 bytes)...