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 相关文章推荐
$.ajax返回的JSON无法执行success的解决方法
Sep 09 Javascript
JS数学函数Exp使用说明
Aug 09 Javascript
多个js与css文件的合并方法详细说明
Dec 26 Javascript
Jquery实现控件的隐藏和显示实例
Feb 08 Javascript
js识别不同浏览器基于userAgent做判断
Jul 29 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
javascript Promise简单学习使用方法小结
May 17 Javascript
JS清除字符串中重复值的实现方法
Aug 03 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
Jun 14 Javascript
微信小程序开发实现的IP地址查询功能示例
Mar 28 Javascript
Vue路由模块化配置的完整步骤
Aug 14 Javascript
vue.js实现简单购物车功能
May 30 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
php date()日期时间函数详解
2010/05/16 PHP
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
php7性能提升的原因详解
2019/10/13 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
jquery text()方法取标签中的文本
2014/07/25 Javascript
javascript连续赋值问题
2015/07/08 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
详解Python中的type()方法的使用
2015/05/21 Python
Python中的一些陷阱与技巧小结
2015/07/10 Python
python模拟事件触发机制详解
2018/01/19 Python
Django 登陆验证码和中间件的实现
2018/08/17 Python
Python线程同步的实现代码
2018/10/03 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
Python 实现一个简单的web服务器
2021/01/03 Python
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
出纳试用期自我鉴定范文
2014/09/16 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
房产授权委托书范本
2014/09/22 职场文书
观后感的写法
2015/06/19 职场文书
fastdfs+nginx集群搭建的实现
2021/03/31 Servers
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
Mysql忘记密码解决方法
2022/02/12 MySQL
Java 超详细讲解hashCode方法
2022/04/07 Java/Android
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers