通过实例了解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 sublime text 3安装与配置
Jun 19 NodeJs
使用nodejs、Python写的一个简易HTTP静态文件服务器
Jul 18 NodeJs
nodejs加密Crypto的实例代码
Jul 07 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
详解Nodejs之npm&package.json
Jun 15 NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
M2实现Nodejs项目自动部署的方法步骤
May 05 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 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中SQL注入攻击与XSS攻击
2012/06/10 PHP
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
2015/02/05 Javascript
javascript 闭包详解
2015/07/02 Javascript
JavaScript的面向对象编程基础
2015/08/13 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
2016/12/21 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
js回调函数仿360开机
2019/12/26 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python中表示字符串的三种方法
2017/09/06 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
Python Subprocess模块原理及实例
2019/08/26 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
一道Delphi上机题
2012/06/04 面试题
大专生自我鉴定范文
2013/10/01 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
考试违纪检讨书
2014/02/02 职场文书
保险公司晨会主持词
2014/03/22 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
参加招聘会后的感想
2015/08/10 职场文书
详解python字符串驻留技术
2021/05/21 Python
Python天气语音播报小助手
2021/09/25 Python