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 Ext JS 状态默认存储时间
Feb 15 Javascript
js中Image对象以及对其预加载处理示例
Nov 20 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
May 09 Javascript
jQuery点击其他地方时菜单消失的实现方法
Apr 22 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
Nov 21 Javascript
thinkjs之页面跳转同步异步操作
Feb 05 Javascript
jQuery编写textarea输入字数限制代码
Mar 23 jQuery
Django1.7+JQuery+Ajax验证用户注册集成小例子
Apr 08 jQuery
微信小程序 本地数据存储实例详解
Apr 13 Javascript
canvas实现弧形可拖动进度条效果
May 11 Javascript
最简单的JS实现json转csv的方法
Jan 10 Javascript
JS前端宏任务微任务及Event Loop使用详解
Jul 23 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提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
PHP精确计算功能示例
2016/11/29 PHP
php表单处理操作
2017/11/16 PHP
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
[01:07:13]TNC vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
python实现俄罗斯方块
2018/06/26 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
Python网页解析器使用实例详解
2020/05/30 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
某公司.Net方向面试题
2014/04/24 面试题
单位提档介绍信
2014/01/17 职场文书
总经理司机职责
2014/02/02 职场文书
市场拓展计划书
2014/05/03 职场文书
环境整治工作方案
2014/05/18 职场文书
新店开张活动方案
2014/08/24 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书