通过实例了解Nodejs模块系统及require机制


Posted in NodeJs onJuly 16, 2020

一、简介

Nodejs 有一个简单的模块加载系统。在 Nodejs 中,文件和模块是一一对应的(每个文件被视为一个独立的模块),这个文件可能是 JavaScript 代码,JSON 或编译过的C/C++ 扩展,例如:

/**
 *foo.js
 *将这个js文件导出为模块
 */
exports.hello = function() {
  console.log("hello Nodejs!");
}
/**
 *main.js
 *main.js和foo.js在同一目录下
 *在控制台中将会输出:hello Nodejs!
 */
var foo = require("./foo.js");

foo.hello();

二、如何将模块导出—— module.exports 与 exports 的区别

Nodejs 中的每一个模块都会自动创建一个 module 对象,同时 module 对象下有一个叫 exports 的属性,可以将某个类的实例赋值给 module.exports,从而导出这个类的实例。在模块被执行前,Nodejs 会将 module.exports 的值赋于全局变量 exports ,以便 module.exports.f = ... 可以更简洁的写成 exports.f = ... 。注意:就像所有变量一样,如果重新给 exports 赋值,它就不再绑定到 module.exports 了,也不会导出指定模块

例如:

/**
 *foo.js
 *导入方式:var foo = require("./foo.js");
 */
function Foo() {}
Foo.prototype.hello = function() {
  console.log("hello Nodejs!");
}

module.exports = new Foo();
/**
 *foo.js
 *导入方式:var Foo = require("./foo.js"); var foo = new Foo();
 */
function Foo() {}
Foo.prototype.hello = function() {
  console.log("hello Nodejs!");
}

module.exports = Foo;

/**
 *foo.js
 *导入方式:var foo = require("./foo.js");
 */
exports.hello = function() {
  console.log("hello Nodejs!");
}

三、require的机制

假设Y是路径,X是文件名或目录名,当 Nodejs 遇到 require(Y+X) 时,按照下面的顺序处理:

1、如果 X 是核心模块(例如:require("http"))

a.返回该模块

b.不再继续执行

2、如果Y是以“./”、“/”或“../”开头

a.把X当成文件,从指定路径开始,依次查找下面文件:X、X.js、X.json、X.node,只要其中一个存在,就返回该文件,不再继续执行

b.把X当成目录,从指定路径开始,依次查找下面文件:X/package.json(main字段)、X/index.js、X/index.json、X/index.node,只要其中一个存在,就返回该文件,不再继续执行

3.如果 X 不是核心模块,也没有以“./”、“/”或“../”开头,则Nodejs会从当前模块的父目录开始,尝试从它的 /node_module 目录里加载模块,如果还是没有找到,则移动到再上一层父目录,直到文件系统的根目录

4.抛出“not found”

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
Nodejs中自定义事件实例
Jun 20 NodeJs
轻松创建nodejs服务器(6):作出响应
Dec 18 NodeJs
图片上传之FileAPI与NodeJs
Jan 24 NodeJs
async/await与promise(nodejs中的异步操作问题)
Mar 03 NodeJs
深入理解Nodejs Global 模块
Jun 03 NodeJs
深入学习nodejs中的async模块的使用方法
Jul 12 NodeJs
nodejs中解决异步嵌套循环和循环嵌套异步的问题
Jul 12 NodeJs
windows系统下更新nodejs版本的方案
Nov 24 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
Nodejs中的JWT和Session的使用
Aug 21 NodeJs
nodejs实现用户登录路由功能
May 22 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 #NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 #NodeJs
nodejs各种姿势断点调试的方法
Jun 18 #NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 #NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 #NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 #NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 #NodeJs
You might like
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
2013/06/17 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
解析JSON对象与字符串之间的相互转换
2013/12/18 Javascript
jQuery插件开发的两种方法及$.fn.extend的详解
2014/01/16 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
javascript中的面向对象
2017/03/30 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
python 七种邮件内容发送方法实例
2014/04/22 Python
开始着手第一个Django项目
2015/07/15 Python
Python常见MongoDB数据库操作实例总结
2018/07/24 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
python 实现图片批量压缩的示例
2020/12/18 Python
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
24个canvas基础知识小结
2014/12/17 HTML / CSS
乡镇办公室工作决心书
2014/03/11 职场文书
党员干部一句话承诺
2014/05/30 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
感恩父母主题班会
2015/08/12 职场文书
2016年“9.22”世界无车日活动小结
2016/04/05 职场文书
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL
详解在OpenCV中如何使用图像像素
2022/03/03 Python
集英社今正式宣布 成立游戏公司“集英社Games”
2022/03/31 其他游戏
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android
Python测试框架pytest高阶用法全面详解
2022/06/01 Python