通过实例了解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的模块写法入门(实例代码)
Mar 07 NodeJs
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
轻松创建nodejs服务器(10):处理上传图片
Dec 18 NodeJs
用NodeJS实现批量查询地理位置的经纬度接口
Aug 16 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
NodeJS实现客户端js加密
Jan 09 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
linux 下以二进制的方式安装 nodejs
Feb 12 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 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购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
php页面防重复提交方法总结
2013/11/25 PHP
PHP开发微信支付的代码分享
2014/05/25 PHP
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python环境变量设置方法
2016/08/28 Python
深入理解Python中的super()方法
2017/11/20 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
Python3 搭建Qt5 环境的方法示例
2020/07/16 Python
如何利用python 读取配置文件
2021/01/06 Python
最新教师自我评价分享
2013/11/12 职场文书
资料员岗位职责
2013/11/17 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
升学宴答谢词
2015/01/05 职场文书
赡养老人协议书范本
2015/08/06 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书