通过实例了解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实现多人同时在线移动鼠标的小游戏分享
Dec 06 NodeJs
轻松创建nodejs服务器(4):路由
Dec 18 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
NodeJS实现客户端js加密
Jan 09 NodeJs
详解nodejs微信公众号开发——4.自动回复各种消息
Apr 11 NodeJs
nodejs模块学习之connect解析
Jul 05 NodeJs
深入学习nodejs中的async模块的使用方法
Jul 12 NodeJs
Linux Centos7.2下安装nodejs&npm配置全局路径的教程
May 15 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 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 日期时间处理函数小结
2009/12/18 PHP
php截取后台登陆密码的代码
2012/05/05 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
YII框架常用技巧总结
2019/04/27 PHP
多广告投放代码 推荐
2006/11/13 Javascript
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
jQuery实现图片加载完成后改变图片大小的方法
2016/03/29 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
基于React Native 0.52实现轮播图效果
2020/08/25 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
python实现决策树分类算法
2017/12/21 Python
Python实现字典的遍历与排序功能示例
2017/12/23 Python
Python pymongo模块用法示例
2018/03/31 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
电脑饰品店的创业计划书
2014/01/21 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
幼儿园大班教师评语
2019/06/21 职场文书