通过实例了解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 31 NodeJs
Nodejs sublime text 3安装与配置
Jun 19 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
nodejs爬虫抓取数据乱码问题总结
Jul 03 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
用NodeJS实现批量查询地理位置的经纬度接口
Aug 16 NodeJs
nodejs基础知识
Feb 03 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 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中实现记住密码自动登录的代码
2011/03/02 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
jquery处理json对象
2014/11/03 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
Python的垃圾回收机制深入分析
2014/07/16 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
本科生详细的自我评价
2013/09/19 职场文书
《维生素c的故事》教学反思
2014/02/18 职场文书
管理学院毕业生自荐信范文
2014/03/10 职场文书
护士长竞聘书
2014/03/31 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
投标授权委托书范文
2014/08/02 职场文书
新郎答谢词
2015/01/04 职场文书
出纳试用期自我评价
2015/03/10 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
2015年除四害工作总结
2015/07/23 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
Django rest framework如何自定义用户表
2021/06/09 Python
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript