浅析Node.js的Modules模块载入方式与机制

Node.js中模块可以通过文件路径或名字获取模块的引用。模块的引用会映射到一个js文件路径,除非它是一个Node内置模块。Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始的时候就预加载了。

其它的如通过NPM安装的第三方模块(third-party modules)或本地模块(local modules),每个模块都会暴露一个公开的API。以便开发者可以导入。如

Js代码

 

var mod = require('module_name')

此句执行后,Node内部会载入内置模块或通过NPM安装的模块。require函数会返回一个对象,该对象公开的API可能是函数,对象,或者属性如函数,数组,甚至任意类型的JS对象。

这里列下node模块的载入及缓存机制

载入内置模块(A Core Module)

载入文件模块(A File Module)

载入文件目录模块(A Folder Module)

载入node_modules里的模块

自动缓存已载入模块

一、载入内置模块

Node的内置模块被编译为二进制形式,引用时直接使用名字而非文件路径。当第三方的模块和内置模块同名时,内置模块将覆盖第三方同名模块。因此命名时需要注意不要和内置模块同名。如获取一个http模块

Js代码

 

var http = require('http')

返回的http即是实现了HTTP功能Node的内置模块。

二、载入文件模块

绝对路径的

Js代码

 

var myMod = require('/home/base/my_mod')

或相对路径的

Js代码

 

var myMod = require('./my_mod')

注意,这里忽略了扩展名“.js”,以下是对等的

Js代码

 

var myMod = require('./my_mod')
var myMod = require('./my_mod.js')

三、载入文件目录模块

可以直接require一个目录,假设有一个目录名为folder,如

Js代码

 

var myMod = require('./folder')

此时,Node将搜索整个folder目录,Node会假设folder为一个包并试图找到包定义文件package.json。如果folder目录里没有包含package.json文件,Node会假设默认主文件为index.js,即会加载index.js。如果index.js也不存在,那么加载将失败。

假如目录结构如下

 

package.json定义如下

Js代码

 

{
"name": "pack",
"main": "modA.js"
}

此时 require('./folder') 将返回模块modA.js。如果package.json不存在,那么将返回模块index.js。如果index.js也不存在,那么将发生载入异常。

四、载入node_modules里的模块

如果模块名不是路径,也不是内置模块,Node将试图去当前目录的node_modules文件夹里搜索。如果当前目录的node_modules里没有找到,Node会从父目录的node_modules里搜索,这样递归下去直到根目录。

不必担心,npm命令可让我们很方便的去安装,卸载,更新node_modules目录。

五、自动缓存已载入模块

对于已加载的模块Node会缓存下来,而不必每次都重新搜索。下面是一个示例

modA.js

Js代码

 

console.log('模块modA开始加载...')

exports = function() {
console.log('Hi')
}

console.log('模块modA加载完毕')

init.js

Js代码

 

var mod1 = require('./modA')
var mod2 = require('./modA')
console.log(mod1 === mod2)

命令行执行:

node init.js

输入如下

 

以看到虽然require了两次,但modA.js仍然只执行了一次。mod1和mod2是相同的,即两个引用都指向了同一个模块对象。

时间: 2024-09-25 02:11:23

浅析Node.js的Modules模块载入方式与机制的相关文章

浅析Node.js的Stream模块中的Readable对象_node.js

我一直都很不愿意扯 nodejs 的流,因为从第一次看到它我就觉得它的设计实在是太恶心了.但是没办法,Stream 规范尚未普及,而且确实有很多东西都依赖了 nodejs 的流来实现的,所以我也只能捏着鼻子硬着头皮来扯一扯这又臭又硬的 nodejs 流对象了. nodejs 自带了一个叫 stream 的模块,引入它便可以得到一组流对象构造器.现在我只说最简单的 stream.Readable. 其实用过 nodejs 的几乎都接触过 Readable 的实例,只是平时没太在意而已.一个非常典型

浅析Node.js:DNS模块的使用_node.js

Nodejs的DNS模块包涵有关DNS查询和操作的方法,下面介绍该模块的基本用法以及实现一个DNS查询小工具. 1.获取DNS服务器地址 使用getServers方法,该方法返回一个IP地址组成的数组,如下所示: const dns = require('dns'); const servers = dns.getServers(); console.log(servers); 返回结果为: [ '114.114.114.114', '8.8.8.8', 'fec0:0:0:ffff::1',

浅析Node.js中使用依赖注入的相关问题及解决方法

这篇文章主要介绍了浅析Node.js中使用依赖注入的相关问题及解决方法,Node.js是一个将JavaScript应用运行于服务器端的框架,需要的朋友可以参考下 最近,我转向使用依赖注入来帮助理解分离代码的简单途径,并有助测试.然而,Node.js中的模块依赖Node提供的系统API,这很难判断私有依赖被恰当的使用.一般的依赖注入很难在这种情况下使用,但现在不要放弃希望. requireCauses 问题 Node.js很容易依照需求导入依赖.它运行的很好,并且比AMD模式加载器例如Requir

node.js的multipart模块问题

问题描述 node.js的multipart模块问题 multipart模块已经安装好了,node.js代码中有一行var parser=new multipart.parser()为什么运行后该行代码会报错:multipart.parser is not a function 解决方案 Node.js工具模块Node.js 模块和包Node.js fs 模块 解决方案二: https://cnodejs.org/topic/4ffed8544764b729026b1da3

Node.js的Formidable模块的使用

今天总结了下Node.js的Formidable模块的使用,下面做一些简要的说明. 1)     创建Formidable.IncomingForm对象 var form = new formidable.IncomingForm() 2)     form.encoding = 'utf-8' 设置表单域的编码 3)     form.uploadDir = "/my/dir"; 设置上传文件存放的文件夹,默认为系统的临时文件夹,可以使用fs.rename()来改变上传文件的存放位置

关于在 Node.js 中引用模块,知道这些就够了

本文讲的是关于在 Node.js 中引用模块,知道这些就够了, Node 提供了两个核心模块来管理模块依赖: require 模块在全局范围内可用,不需要写 require('require'). module 模块同样在全局范围内可用,不需要写 require('module'). 你可以将 require 模块理解为命令,将 module 模块理解为所有引入模块的组织者. 在 Node 中引入一个模块其实并不是个多么复杂的概念. const config = require('/path/t

node.js的mysql模块query方法里的字符串拼接问题

问题描述 node.js的mysql模块query方法里的字符串拼接问题 我写了一个和mysql交互的Node.js.大致功能是,在浏览器端提交用户信息表单后,会在现有的表userInfo里插入一条用户记录:然后针对这条用户记录自动再生成一个表,该表的名称是根据这条记录的id动态生成的. 该部分我写的代码如下: //上面的代码已经实现把一条新的用户记录插入到userInfo里了. var userId; var tableName; db.query(//这里通过query方法获取这条新记录的i

Node.js 支持 ES6 模块的进展

本文讲的是Node.js 支持 ES6 模块的进展, 几个月前我写了篇文章阐述 Node.js 现有的 CommonJS 模块系统与 ES6 模块系统的一些区别,以及由此产生的在 Node.js 中实现 ES6 模块系统的挑战.本文将跟进相关进展. 何时知晓 如果你没有读过我之前的文章,在继续阅读之前,建议你看一下,里面描述了两种模块系统架构一些重大差异.简单来说:CommonJS 和 ES6 模块的根本差异在于模块结构解析完全并能够在其他代码里使用的时机. 例如,有如下简单的 CommonJS

Node.js中Request模块处理HTTP协议请求的基本使用教程_node.js

这里来介绍一个Node.js的模块--request.有了这个模块,http请求变的超简单. Request使用超简单,同时支持https和重定向. var request = require('request'); request('http://www.google.com', function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body) // 打印goo