通过实例了解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 win7下安装方法
May 24 NodeJs
nodejs分页类代码分享
Jun 17 NodeJs
浅谈Nodejs观察者模式
Oct 13 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
用nodejs搭建websocket服务器
Jan 23 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 NodeJs
NodeJS模块与ES6模块系统语法及注意点详解
Jan 04 NodeJs
nodejs中实现用户注册路由功能
May 20 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 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利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
php查询内存信息操作示例
2019/05/09 PHP
Dom操作之兼容技巧分享
2011/09/20 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
JsRender for object语法简介
2014/10/31 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
VSCode launch.json配置详细教程
2020/06/18 Javascript
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
Python中subprocess的简单使用示例
2015/07/28 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
Python大数据之使用lxml库解析html网页文件示例
2019/11/16 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
医学专业毕业生推荐信
2013/11/14 职场文书
学校办公室主任职责
2013/12/27 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
汽车机电维修工求职信
2014/09/30 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
高三英语教学计划
2015/01/23 职场文书
2015年度质量工作总结报告
2015/04/27 职场文书
红歌会主持词
2015/07/02 职场文书
Python使用Kubernetes API访问集群
2021/05/30 Python
golang为什么要统一错误处理
2022/04/03 Golang