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 相关文章推荐
一个很简单的办法实现TD的加亮效果.
Jun 29 Javascript
JavaScript 学习笔记(十二) dom
Jan 21 Javascript
jquery dialog键盘事件代码
Aug 01 Javascript
js日期对象兼容性的处理方法
Jan 28 Javascript
node.js中的path.normalize方法使用说明
Dec 08 Javascript
javascript实现类似百度分享功能的方法
Jul 27 Javascript
jquery实现鼠标悬浮停止轮播特效
Aug 20 Javascript
Google 地图API Map()构造器详解
Aug 06 Javascript
vue实现app页面切换动画效果实例
May 23 Javascript
深入理解vue Render函数
Jul 19 Javascript
JavaScript实现打印星型金字塔功能实例分析
Sep 27 Javascript
详解React的回调渲染模式
Sep 10 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
详解vue高级特性
2020/06/09 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
Python Socket使用实例
2017/12/18 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
mac 安装python网络请求包requests方法
2018/06/13 Python
Python sorted排序方法如何实现
2020/03/31 Python
如何用Python 加密文件
2020/09/10 Python
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
戒赌保证书
2015/05/11 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang