通过实例了解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 05 NodeJs
我的NodeJs学习小结(一)
Jul 06 NodeJs
Nodejs 搭建简单的Web服务器详解及实例
Nov 30 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
详解nodejs操作mongodb数据库封装DB类
Apr 10 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
nodejs更改项目端口号的方法
May 13 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
监控Nodejs的性能实例代码
Jul 02 NodeJs
NodeJS实现一个聊天室功能
Nov 25 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
第七节 类的静态成员 [7]
2006/10/09 PHP
PHP var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
PHP+Javascript实现在线拍照功能实例
2015/07/18 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
twig模板常用语句实例小结
2016/02/04 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
javascript window对象属性整理
2009/10/24 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
2019/11/25 Javascript
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
Python高斯消除矩阵
2019/01/02 Python
python树莓派红外反射传感器
2019/01/21 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
公开承诺书格式
2014/05/21 职场文书
通信工程求职信
2014/07/16 职场文书
自查自纠工作总结
2014/10/15 职场文书
工伤事故处理协议书怎么写
2014/10/15 职场文书
大学生十八大感想
2015/08/11 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
MySQL下载安装配置详细教程 附下载资源
2022/09/23 MySQL