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 相关文章推荐
XML+XSL 与 HTML 两种方案的结合
Apr 22 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
Nov 19 Javascript
关于jquery中全局函数each使用介绍
Dec 10 Javascript
extjs 如何给column 加上提示
Jul 29 Javascript
php常见的页面跳转方法汇总
Apr 15 Javascript
JavaScript实现的SHA-1加密算法完整实例
Feb 02 Javascript
Jquery基础之事件操作详解
Jun 14 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
Feb 17 Javascript
使用electron将vue-cli项目打包成exe的方法
Sep 29 Javascript
ES6 更易于继承的类语法的使用
Feb 11 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
Jul 13 Javascript
JavaScript console的使用方法实例分析
Apr 28 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 页面编码声明方法详解(header或meta)
2010/03/12 PHP
PHP学习笔记之一
2011/01/17 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
四个常见html网页乱码问题及解决办法
2015/09/08 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
PHP使用反向Ajax技术实现在线客服系统详解
2019/07/01 PHP
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
Javascript简单改变表单元素背景的方法
2015/07/15 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
Python中的类学习笔记
2014/09/23 Python
详解python3中zipfile模块用法
2018/06/18 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
django rest framework使用django-filter用法
2020/07/15 Python
Python3.9.1中使用split()的处理方法(推荐)
2021/02/07 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
写给女朋友的检讨书
2014/01/28 职场文书
店长职务说明书
2014/02/04 职场文书
护士个人自我鉴定
2014/03/24 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
中学教师师德承诺书
2014/05/23 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
会计实训报告范文
2014/11/04 职场文书
农村党员干部承诺书
2015/05/04 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫