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 相关文章推荐
实例:尽可能写友好的Javascript代码
Oct 09 Javascript
详解JavaScript基于面向对象之创建对象(2)
Dec 10 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
Dec 11 Javascript
jquery attr()设置和获取属性值实例教程
Sep 25 Javascript
JavaScript使用FileReader实现图片上传预览效果
Mar 27 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
Nov 07 Javascript
手把手教你使用vue-cli脚手架(图文解析)
Nov 08 Javascript
Javascript Promise用法详解
May 10 Javascript
node 命令方式启动修改端口的方法
May 12 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
May 09 Javascript
Vue按时间段查询数据组件使用详解
Aug 21 Javascript
Javascript节流函数throttle和防抖函数debounce
Dec 03 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实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
PHP与SQL语句写一句话木马总结
2019/10/11 PHP
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
2018/01/25 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
python中getaddrinfo()基本用法实例分析
2015/06/28 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
材料专业毕业生求职信
2014/02/26 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
国庆节主题班会
2015/08/15 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js
优化Mysql查询的示例
2022/04/26 MySQL