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 textarea光标定位方法(兼容IE和FF)
Mar 12 Javascript
使用JavaScript动态设置样式实现代码及演示动画
Jan 25 Javascript
手机平板等移动端适配跳转URL的js代码
Jan 25 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
Apr 04 Javascript
原生 JS Ajax,GET和POST 请求实例代码
Jun 08 Javascript
JavaScript无阻塞加载和defer、async详解
Feb 26 Javascript
js获取当前周、上一周、下一周日期
Mar 19 Javascript
vue路由跳转时判断用户是否登录功能的实现
Oct 26 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
Jan 02 jQuery
Vue 使用formData方式向后台发送数据的实现
Apr 14 Javascript
vue element-ui读取pdf文件的方法
Nov 26 Javascript
react合成事件与原生事件的相关理解
May 13 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/07/08 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
js遍历td tr等html元素
2012/12/13 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
python下载文件时显示下载进度的方法
2015/04/02 Python
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
python实现简单淘宝秒杀功能
2018/05/03 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
团日活动总结书格式
2014/05/08 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
高一作文之暖冬
2019/11/09 职场文书
Nginx配置Https安全认证的实现
2021/05/26 Servers
分享Python异步爬取知乎热榜
2022/04/12 Python
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android