通过实例了解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(一)--- Node.js简介及安装开发环境
May 20 NodeJs
nodejs获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
Sep 19 NodeJs
nodejs实现的连接MySQL数据库功能示例
Jan 25 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 NodeJs
在nodejs中创建child process的方法
Jan 26 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
新版PHP将向Java靠拢
2006/10/09 PHP
PHP常用代码
2006/11/23 PHP
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
用jscript启动sqlserver
2007/06/21 Javascript
JavaScript弹簧振子超简洁版 完全符合能量守恒,胡克定理
2009/10/25 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
js 调用百度分享功能
2017/02/27 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
vue中监听返回键问题
2019/08/28 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
python二叉树遍历的实现方法
2013/11/21 Python
python避免死锁方法实例分析
2015/06/04 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
python删除某个字符
2018/03/19 Python
对Python中内置异常层次结构详解
2018/10/18 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
Django的models模型的具体使用
2019/07/15 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
C#面试题问题集
2016/04/02 面试题
工作中的自我评价如何写好
2013/10/28 职场文书
师德师风自我评价范文
2014/09/11 职场文书
女方离婚起诉书
2015/05/18 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server