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实现控制经纬度显示地图与卫星
May 20 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
Jun 24 Javascript
JavaScript计算两个日期时间段内日期的方法
Mar 16 Javascript
jquery判断复选框选中状态以及区分attr和prop
Dec 18 Javascript
jQuery电话号码验证实例
Jan 05 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
Apr 18 Javascript
基于JavaScript实现报警器提示音效果
Oct 27 Javascript
基于webpack4+vue-cli3项目实现换肤功能
Jul 17 Javascript
vue 父组件通过v-model接收子组件的值的代码
Oct 27 Javascript
Vue使用axios引起的后台session不同操作
Aug 14 Javascript
关于vue 项目中浏览器跨域的配置问题
Nov 10 Javascript
详解JavaScript中的this指向问题
Feb 05 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
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
在视频前插入广告
2006/11/20 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
npm qs模块使用详解
2020/02/07 Javascript
python抓取网页中的图片示例
2014/02/28 Python
Python实现截屏的函数
2015/07/25 Python
Python实现图片转字符画的示例
2017/08/22 Python
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
Win10里python3创建虚拟环境的步骤
2020/01/31 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
python中wheel的用法整理
2020/06/15 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
美国美妆网站:B-Glowing
2016/10/12 全球购物
SCHIESSER荷兰官方网站:德国内衣专家
2020/10/09 全球购物
2014年学校法制宣传日活动总结
2014/11/01 职场文书
2015年班组长工作总结
2015/04/10 职场文书
社区节水倡议书
2015/04/29 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书