通过实例了解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写的一个简单项目打包工具
May 11 NodeJs
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
nodeJS删除文件方法示例
Dec 25 NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
Nodejs异步回调之异常处理实例分析
Jun 22 NodeJs
nodejs读取本地中文json文件出现乱码解决方法
Oct 10 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 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脚本的10个技巧(3)
2006/10/09 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
PHP删除HTMl标签的三种解决方法
2013/06/30 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
JavaScript中的字符串操作详解
2013/11/12 Javascript
JS与C#编码解码
2013/12/03 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
由浅入深讲解python中的yield与generator
2017/04/05 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
Python列表解析配合if else的方法
2018/06/23 Python
Python中常用的内置方法
2019/01/28 Python
python 读取修改pcap包的例子
2019/07/23 Python
python中取绝对值简单方法总结
2020/07/24 Python
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
酒店出纳岗位职责
2013/12/29 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
工资证明范本
2015/06/12 职场文书
护理工作心得体会
2016/01/22 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
Go gorilla/sessions库安装使用
2022/08/14 Golang