通过实例了解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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
Ubuntu中搭建Nodejs开发环境过程分享
Jun 01 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
NodeJS学习笔记之Http模块
Jan 13 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 NodeJs
nodejs微信扫码支付功能实现
Feb 17 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 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
暴雪前总裁遗憾:没尽早追赶Dota 取消星际争霸幽灵
2020/03/08 星际争霸
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
JavaScript 三种创建对象的方法
2009/10/16 Javascript
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
js变换显示图片的实例
2013/04/16 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
Angular2使用Angular-CLI快速搭建工程(二)
2017/05/21 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
Django 视图层(view)的使用
2018/11/09 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
外企测试工程师面试题
2015/02/01 面试题
业务助理岗位职责
2013/11/18 职场文书
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
办加油卡单位介绍信
2014/01/09 职场文书
校本教研工作制度
2014/01/22 职场文书
文明学生事迹材料
2014/01/29 职场文书
学习交流会主持词
2014/04/01 职场文书
场地使用证明模板
2014/10/25 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
公司表扬稿范文
2015/05/05 职场文书
运动会宣传稿50字
2015/07/23 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
Python 中面向接口编程
2022/05/20 Python