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玩一玩WSH吧
Feb 23 Javascript
讨论javascript(一)工厂方式 js面象对象的定义方法
Dec 15 Javascript
Js保留小数点的4种效果实现代码分享
Apr 12 Javascript
javascript实现博客园页面右下角返回顶部按钮
Feb 22 Javascript
JavaScript通过select动态更换图片的方法
Mar 23 Javascript
原生javascript实现图片无缝滚动效果
Feb 12 Javascript
全面了解JavaScript的数据类型转换
Jul 01 Javascript
实例解析Vue.js下载方式及基本概念
May 11 Javascript
Vue面试题及Vue知识点整理
Oct 07 Javascript
简单了解vue.js数组的常用操作
Jun 17 Javascript
Vue监听滚动实现锚点定位(双向)示例
Nov 13 Javascript
js实现前端界面导航栏下拉列表
Aug 27 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应用JSON技巧讲解
2013/02/03 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
不用写JS也能使用EXTJS视频演示
2008/12/29 Javascript
jQuery示例收集
2010/11/05 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
js实现根据身份证号自动生成出生日期
2015/12/15 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
Node.js操作redis实现添加查询功能
2017/05/25 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
js实现轮播图特效
2020/05/28 Javascript
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
python爬取指定微信公众号文章
2018/12/20 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
python实现126邮箱发送邮件
2020/05/20 Python
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
车间安全生产标语
2014/06/06 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android