nodejs中的模块的理解
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中的模块的理解相关推荐
- Nodejs中的模块系统
一.模块化的定义 ①具有文件作用域 ②具有通信规则:加载和导出规则 二.CommonJS模块规范 1.nodejs中的模块系统,具有文件作用域,也具有通信规则,使用require方法加载模块,使用ex ...
- nodejs中的模块系统:exports导出模块
node中的模块系统 示例: 模块作用域 成功获取add: module.exports
- nodejs中events模块的使用
nodejs中events的基本使用 讲events之前我们先用js模拟实现一个EventEmitter类 源码 //订阅者集合 class EventEmitter{constructor(){th ...
- TypeScript完全解读(26课时)_14.ES6和Nodejs中的模块
创建modules文件夹,我们的文件都写在这里面 modules下面新建index.js文件,在index.ts内引入这个js文件 es6的模块 最主要的两个关键字 import和export imp ...
- nodejs 中es5 模块的几种写法
1. module.exports.func = function(){} module.exports.field = ''; 第一种是逐个对api 和字段导出. 2. module.export ...
- Nodejs 中的包、npm 、第三方模块、 package.json 以及 cnpm
一.包与 NPM 包Nodejs 中除了它自己提供的核心模块外,我们可以自定义模块,也可以使用第三方的 模块.Nodejs 中第三方模块由包组成,可以通过包来对一组具有相互依赖关系的模块进行 统一管理 ...
- 第二章. node中的模块和require
2019独角兽企业重金招聘Python工程师标准>>> 一 什么是模块. JavaScript诞生初,它只不过是一个网页的小脚本而已,没有人会想到它会发展到现在能有大量的库,工具,组 ...
- nodejs linux模块全局,nodejs笔记一--模块,全局process对象;
一.os模块可提供操作系统的一些基本信息,它的一些常用方法如下: var os = require("os"); var result = os.platform(); //查看操 ...
- nodejs操作sqlserver数据_实例分析nodejs基于mssql模块连接sqlserver数据库的简单封装操作...
本文主要介绍了nodejs基于mssql模块连接sqlserver数据库的简单封装操作,结合实例形式分析了nodejs中mssql模块的安装与操作sqlserver数据库相关使用技巧,需要的朋友可以参 ...
最新文章
- 如何将DynamoDB的数据增量迁移到表格存储
- webpack简单配置
- FAT AP和FIT AP 区别 (无线篇)
- 【LiveVideoStack线上分享】— FreeSWITCH核心架构与流程控制
- VS 添加文件添加文件成链接
- 《HeadFirst Python》第一章学习笔记
- Mac中搭建Kubernetes
- python神经网络库 keras_在Python和R中使用Keras和Tensorflow进行深度学习
- sql 查看Oralce 数据库连接状态
- 小米真香产品被友商怼:只有USB2.0接口 怎么播高码率的视频?
- 时空解析理论的实验检验方法
- ecshop 实现购物车退出不清空
- 图形学人物简史:两位图灵奖与奥斯卡得主的图形学研究往事
- 常见路由器默认登录用户名和密码(大全)
- UE官网ARPG游戏学习笔记1
- oracle的job引起数据库崩溃,JOB忽然停止工作了
- 平面设计中的插画设计技巧
- 计算机专业的你,毕业后可以从事什么职业?前景如何?
- Java 代码 各种不规范示范,希望引以为戒,望看到的大哥们 都能把代码写的规范点,方便你我他。
- Win10大更新后(悦米)机械键盘无法使用
热门文章
- 我的flash头像编辑上传控件
- 21个演示展示强大的jQuery特效
- 记一次nginx反向代理做转发遇到的坑
- Tensorflow Timeline介绍及简单使用
- android安卓Sqlite数据库实现用户登录注册
- CiTRIX XenServer 6.5安装体验
- 函数call相关[ASM]
- SQL SERVER 自定义函数参数数量对调用时参数数量的影响
- iOS 关于使用xib创建cell的两种初始化方式
- 执行php程序的时候,报错Allowed memory size of 134217728 bytes exhausted (tried to allocate 83 bytes)...