通过实例了解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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 NodeJs
Nodejs极简入门教程(一):模块机制
Oct 25 NodeJs
轻松创建nodejs服务器(4):路由
Dec 18 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
Nodejs进阶:核心模块net入门学习与实例讲解
Nov 21 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 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编程开发“虚拟域名”系统
2006/10/09 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
JS实现的一个简单的Autocomplete自动完成例子
2014/04/16 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
2018/12/10 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
wxPython多个窗口的基本结构
2019/11/19 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
英国女性时尚品牌:Apricot
2018/12/04 全球购物
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
大学生饮食连锁店创业计划书
2014/01/17 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
法定代表人资格证明书
2015/06/18 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书
运动会口号霸气押韵
2015/12/24 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书