Node.js学习教程之Module模块


Posted in Javascript onSeptember 03, 2019

前言

采用了 Commonjs 规范,通过 module.exports、require 来导出和导入模块。模块加载机制中,采用了延迟加载的策略。就是说在用到的情况下,系统模块才会被加载,等加载完成后会放到 binding_cache 中。

分类(模块类型)

系统模块

  • 核心模块(native 模块),http、buffer、fs 等,底层调用的内建模块 (C/C++);
  • C/C++ 模块(built-in 内建模块),供 native 模块调用;

第三方模块

  • 第三方维护的模块,比如 express、koa、moment.js 等;
  • 本地维护的模块(以路径形式的文件模块)比如 .、..、/ 开头的;

文件形式

  • javaScript 模块,module.js;
  • json 模块,module.json;
  • C/C++ 模块,编译后扩展名为 .node,module.node;

加载机制

加载步骤

经历 路径分析、文件定位和编译执行。

加载顺序

  1. 系统缓存,一个模块被执行后会被缓存起来,提高再次加载速度;
  2. 系统模块,即原生模块,部分核心模块已经被编译成二进制,省略了 路径分析、文件定位,会直接被加载到了内存中,其中系统模块定义在源码的 lib 目录下;
  3. 文件模块,优先加载 .、..、/ 开头的,会依次按照 .js、.json、.node 进行扩展名补足尝试(文件没有加上扩展名),最好还是加上文件的扩展名。
  4. 目录模块,文件模块加载过程中,没有找到,但发现一个同样的目录名,就会将这个目录当作一个包来处理。这块采用了 Commonjs 规范,在文件 package.json 中查找;
  5. node_module 模块,如果系统模块、路径文件模块都找不到,Node.js 会从当前模块的父目录开始查找,直到系统的根目录;

Node.js学习教程之Module模块

关于缓存问题

模块缓存后,可以通过 require.cache 查看已缓存的模块。

// 模块文件 require.module.js
module.exports = {
  name: 'pr',
  say(){ }
}
// 引用模块文件 require.cache.js
require('./require.module');

console.log('require.cache ----- ');
console.log(require.cache);

Node.js学习教程之Module模块

对象引用

1.exports 与 module.exports 关系

const exports = module.exports;

所以就不能改变 exports 的指向,可以这样

exports.info = {
  name: 'pr',
  age: 30
}

module.exports = {
  name: 'pr',
  age: 30
}

模块循环引用

模块 moduleA.js 和 moduleB.js 两个模块互相引用,会怎样?

// moduleA.js
console.log('模块 moduleA');
exports.name = 'moduleA name';

age = 27;

const moduleB = require('./moduleB.js');
console.log('moduleA require moduleB =>', moduleB.name);
// moduleB.js
console.log('模块 moduleB');
exports.name = 'moduleB name';

const moduleA = require('./moduleA.js');
console.log('moduleB require moduleA =>', moduleA.name);

Node.js学习教程之Module模块

  • 启动模块 node moduleA.js,会打印 模块 moduleA;
  • 模块 moduleA.js 中加载 moduleB.js,打印 模块 moduleB;
  • 模块 moduleB.js 中又加载 moduleA.js,此时模块 moduleA.js 还没有执行完,返回模块 moduleA.js 的 exports 对象给到模块 moduleB.js;
  • 模块 moduleB.js 加载完后,其中有个 moduleA.js 中挂载了全局的变量 age,所以能打印出来,最后将模块 moduleB.js 的 exports 对象给到模块 moduleA.js;

很有意思的是,在代码执行前,会用一个封装器将执行代码段封装起来

(function(exports, require, module, __filename, __dirname) {
  // something
});

本次代码 Github

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JQuery扩展插件Validate 3通过参数设置错误信息
Sep 05 Javascript
JS中实现简单Formatter函数示例代码
Aug 19 Javascript
jQuery ajax serialize() 方法使用示例
Nov 02 Javascript
JavaScript必看小技巧(必看)
Jun 07 Javascript
Vue.js动态组件解析
Sep 09 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
Oct 09 Javascript
纯JS实现弹性导航条效果
Mar 06 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
Jan 08 jQuery
详解vue-cli 本地开发mock数据使用方法
May 29 Javascript
微信小程序开发常见问题及解决方案
Jul 11 Javascript
Js跳出两级循环方法代码实例
Sep 22 Javascript
Openlayers实现地图的基本操作
Sep 28 Javascript
vue动态绘制四分之三圆环图效果
Sep 03 #Javascript
微信小程序拼接图片链接无底洞深入探究
Sep 03 #Javascript
layui radio单选限制下一个radio单选的实例
Sep 03 #Javascript
JavaScript Array对象基本方法详解
Sep 03 #Javascript
微信小程序通过一个json实现分享朋友圈图片
Sep 03 #Javascript
layui 实现自动选择radio单选框(checked)的方法
Sep 03 #Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
Sep 03 #Javascript
You might like
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
php不用正则采集速度探究总结
2008/03/24 PHP
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
Python基于twisted实现简单的web服务器
2014/09/29 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
python psutil库安装教程
2018/03/19 Python
python绘制多个曲线的折线图
2020/03/23 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
学校清明节活动总结
2014/07/04 职场文书
维稳承诺书
2015/01/20 职场文书
综合实践活动报告
2015/02/05 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang