node.js中module模块的功能理解与用法实例分析


Posted in Javascript onFebruary 14, 2020

本文实例讲述了node.js中module模块的功能理解与用法。分享给大家供大家参考,具体如下:

node.js中使用CommonJS规范实现模块功能,一个单独的文件就是一个单独的模块。通过require方法实现模块间的依赖管理。

通过require加载模块,是同步操作。

加载流程如下:

1、找到需要加载的模块文件。

2、判断是否缓存过,如果没有,则读取模块文件的内容。

3、把读取到的内容,封装在一个函数里运行。

(function (exports, require, module, __filename, __dirname) {
  //模块的代码实际上在这里
});

4、返回 module.exports 需要导出的内容。

exports 表示模块的导出对象

require 表示require方法

module 表示当前模块对象

__filename 表示当前文件的绝对路径

__dirname 表示当前文件夹的绝对路径

在模块的内部,this 指向的是 当前模块的导出对象

console.log(this === module.exports);
console.log(this === exports);

module对象有不少属性,可以打印出来看看。

console.log(module);

module.id 表示模块的标识符。

module.exports 表示模块的导出对象。

module.parent 表示当前模块的父模块,当前模块是谁加载的。

module.filename 表示模块的绝对路径。

module.loaded 表示是否加载完成。

module.children 表示当前模块加载了哪些模块。

module.paths 表示模块的搜索路径,路径的多少取决于目录的深度。

node.js通过require方法加载文件是同步的,为了提高效率,会缓存已经加载过的文件。

console.log(require.cache);

缓存的key是模块的绝对路径,value是module对象。

require.resolve获取模块的绝对路径,但并不会加载模块。

console.log(require.resolve('./01.js'));

require.main获取入口模块

console.log(require.main);

require.extensions获取模块支持的扩展名

node.js中模块文件分三种:
1、.js模块
2、.json文件模块
3、.node C++扩展二进制模块

console.log(require.extensions);

node.js通过require加载文件时,比如 require('./user') 会先找 user 文件,然后没找到,再找 user.js,再找 user.json,再找 user.node。

node.js的模块分类:

1、核心模块,编译二进制,加载速度最快,像 fs,http,events等。

2、文件模块,保存在硬盘上,加载速度比较慢,通过名称或路径来加载。

3、第三方模块,只指定名称则从node_modules目录下加载,查询的路径包括module.paths和全局目录。

全局目录:

windows中:环境变量NODE_PATH指定的路径。

linux中:$HOME/.node_modules和$HOME/.node_libraries目录

文件模块查找的规则,比如 require('./user') :

1、判断加载的文件是否以绝对路径加载的。

2、如果是绝对路径,则直接加载绝对路径的文件。

3、如果不是,判断文件有没有以 './' ,'../' 开头,如果有则找到该相对路径,如果没有则通过modules.paths和全局目录获取路径。

4、尝试在第3步中的路径下查找 user 文件。

5、如果没有找到,则尝试加扩展名( user.js,user.json,user.node)进行查找。

6、如果还没有,尝试根据包进行查找,user 目录下,包文件描述 package.json 中 main 配置的文件进行加载。

7、如果没有 package.json,则查找 user 目录下, index.js 和 index.node。

8、如果还没有,则找下一个modules.paths。

9、最后还是没有找到,则文件加载失败。

希望本文所述对大家node.js程序设计有所帮助。

Javascript 相关文章推荐
jQuery中的.bind()、.live()和.delegate()之间区别分析
Jun 08 Javascript
Js注册协议倒计时的小例子
Jun 24 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
Dec 26 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
Jan 03 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
Oct 26 Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 Javascript
详解vue跨组件通信的几种方法
Jun 15 Javascript
Vue父子模版传值及组件传值的三种方法
Nov 27 Javascript
Vue组件的使用教程详解
Jan 05 Javascript
JS实现处理时间,年月日,星期的公共方法示例
May 31 Javascript
微信小程序实现限制用户转发功能的实例代码
Feb 22 Javascript
封装Vue Element的table表格组件的示例详解
Aug 19 Javascript
JS实现简易计算器
Feb 14 #Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
Feb 14 #Javascript
node.js中npm包管理工具用法分析
Feb 14 #Javascript
vue-cli创建的项目中的gitHooks原理解析
Feb 14 #Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
Feb 14 #Javascript
bootstrap-paginator服务器端分页使用方法详解
Feb 13 #Javascript
JavaScript实现Tab选项卡切换
Feb 13 #Javascript
You might like
漫威DC即将合作联动,而双方早已经秘密开始
2020/04/09 欧美动漫
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
javascript学习网址备忘
2007/05/29 Javascript
$.ajax json数据传递方法
2008/11/19 Javascript
javascript之bind使用介绍
2011/10/09 Javascript
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
vue 全局封装loading加载教程(全局监听)
2020/11/05 Javascript
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
Python上下文管理器和with块详解
2017/09/09 Python
python @property的用法及含义全面解析
2018/02/01 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
django基于restframework的CBV封装详解
2019/08/08 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
大学生旷课检讨书
2014/01/22 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
党员转正党支部意见
2015/06/02 职场文书
netty 实现tomcat的示例代码
2022/06/05 Servers
Android中的Launch Mode详情
2022/06/05 Java/Android