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 相关文章推荐
js验证电话号码与手机支持+86的正则表达式
Jan 23 Javascript
JavaScript对象属性检查、增加、删除、访问操作实例
Jul 08 Javascript
jQuery循环遍历子节点并获取值的方法
Apr 14 Javascript
百度搜索框智能提示案例jsonp
Nov 28 Javascript
移动端使用localResizeIMG4压缩图片
Apr 22 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
Sep 11 Javascript
微信小程序promsie.all和promise顺序执行
Oct 27 Javascript
JS实现可视化文件上传
Sep 08 Javascript
vue代码分割的实现(codesplit)
Nov 13 Javascript
vue data恢复初始化数据的实现方法
Oct 31 Javascript
JavaScript如何实现图片处理与合成
May 29 Javascript
vue如何使用rem适配
Feb 06 Vue.js
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
Discuz 模板引擎的封装类代码
2008/07/18 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
flash javascript之间的通讯方法小结
2008/12/20 Javascript
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
常用DOM整理
2015/06/16 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
2017/01/18 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
详解VUE 数组更新
2017/12/16 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
Django多数据库的实现过程详解
2019/08/01 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
公司端午节活动方案
2014/02/04 职场文书
教师应聘自荐信范文
2014/03/14 职场文书
教师考察材料范文
2014/06/03 职场文书
化工专业求职信
2014/07/01 职场文书
考试作弊检讨书
2015/01/27 职场文书
库房管理员岗位职责
2015/02/12 职场文书