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 相关文章推荐
找到一点可怜的关于dojo资料,谢谢作者!
Dec 06 Javascript
关于javascript event flow 的一个bug详解
Sep 17 Javascript
Jquery中巧用Ajax的beforeSend方法
Jan 20 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
Apr 26 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
Mar 30 Javascript
jQuery图片查看插件Magnify开发详解
Dec 25 jQuery
JavaScript函数apply()和call()用法与异同分析
Aug 10 Javascript
mpvue项目中使用第三方UI组件库的方法
Sep 30 Javascript
如何通过setTimeout理解JS运行机制详解
Mar 23 Javascript
javascript网页随机点名实现过程解析
Oct 15 Javascript
JS document对象简单用法完整示例
Jan 14 Javascript
react 不用插件实现数字滚动的效果示例
Apr 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
一个分页的论坛
2006/10/09 PHP
php通过文件流方式复制文件的方法
2015/03/13 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
js倒计时小程序
2013/11/05 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
2016/07/20 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
深入讲解Python中的迭代器和生成器
2015/10/26 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
python正则表达式面试题解答
2020/04/28 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
python操作excel的包(openpyxl、xlsxwriter)
2018/06/11 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
Python实现word2Vec model过程解析
2019/12/16 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
高三毕业生自我鉴定
2013/12/20 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
《争吵》教学反思
2014/02/15 职场文书
中学生操行评语
2014/04/24 职场文书
计算机网络专业自荐信
2014/07/04 职场文书
专家推荐信范文
2015/03/26 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
SQL基础的查询语句
2021/11/11 MySQL