通过实例了解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教程之入门
Nov 21 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
NodeJs基本语法和类型
Feb 13 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
Nodejs爬虫进阶教程之异步并发控制
Feb 15 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
NodeJs安装npm包一直失败的解决方法
Apr 28 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
Nodejs异步回调之异常处理实例分析
Jun 22 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 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,不用COM,生成excel文件
2006/10/09 PHP
杏林同学录(一)
2006/10/09 PHP
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
php格式化日期和时间格式化示例分享
2014/02/24 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
jquery获取input的value问题说明
2010/08/19 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
Vue基础学习之项目整合及优化
2019/06/02 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
python 实现插入排序算法
2012/06/05 Python
python从入门到精通(DAY 3)
2015/12/20 Python
python变量不能以数字打头详解
2016/07/06 Python
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
python 产生token及token验证的方法
2018/12/26 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
Html5页面点击遮罩层背景关闭遮罩层
2020/11/30 HTML / CSS
小学教学随笔感言
2014/02/26 职场文书
学风建设主题班会
2015/08/17 职场文书
总结Python变量的相关知识
2021/06/28 Python