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文本框不能输入空格验证方法
Mar 19 Javascript
js实现ArrayList功能附实例代码
Oct 29 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
Jan 09 Javascript
JavaScript中textRange对象使用方法小结
Mar 24 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
Aug 04 Javascript
Three.js快速入门教程
Sep 09 Javascript
ionic2打包android时gradle无法下载的解决方法
Apr 05 Javascript
React如何将组件渲染到指定DOM节点详解
Sep 08 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
Apr 26 Javascript
javaScript实现一个队列的方法
Jul 14 Javascript
搭建vscode+vue环境的详细教程
Aug 31 Javascript
基于javascript原生判断DOM是否加载完毕
Oct 14 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
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
PHP实现验证码校验功能
2017/11/16 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
html下载本地
2006/06/19 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
Python 用户登录验证的小例子
2013/03/06 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
Python模块搜索路径代码详解
2018/01/29 Python
TensorFlow实现卷积神经网络CNN
2018/03/09 Python
python3实现磁盘空间监控
2018/06/21 Python
pandas 时间格式转换的实现
2019/07/06 Python
django项目简单调取百度翻译接口的方法
2019/08/06 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
某公司部分笔试题
2013/11/05 面试题
毕业生找工作求职信
2014/08/05 职场文书
建筑工地文明标语
2014/10/09 职场文书
高中生自我评价范文2015
2015/03/03 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
500字作文之难忘的同学
2019/12/20 职场文书
Java 实战项目之家居购物商城系统详解流程
2021/11/11 Java/Android
Python学习之异常中的finally使用详解
2022/03/16 Python