Node.js中的模块路径解析规则和子模块包

 更新时间:2023年11月18日 09:22:50   投稿:yin  
NodeJS特性如事件驱动、异步编程、无阻塞IO,这些特性为它带来了高效的性能和更少的代码,require函数支持斜杠(/)或盘符(C:)开头的绝对路径,也支持./开头的相对路径,为了便于管理和使用,我们可以把由多个子模块组成的大模块称做包,并把所有子模块放在同一个目录里

Node.js 是一个基于Google V8引擎建立的一个平台, 用来方便地搭建快速、易于扩展的网络应用。第一版由Ryan Dahl于2009年2月发布,之后获得了迅猛的发展,截止至2014年3月,虽然版本仍未到1.0正式版,但已经在商业环境中得到很多应用。

对于开发者来说,NodeJS有很多吸引人的特性,如事件驱动、异步编程、无阻塞IO,这些特性为它带来了高效的性能和更少的代码,因此受到众多开发者青睐。

有经验的C程序员在编写一个新程序时首先从make文件写起。同样的,使用NodeJS编写程序前,为了有个良好的开端,首先需要准备好代码的目录结构和部署方式,就如同修房子要先搭脚手架。

模块路径解析规则

require函数支持斜杠(/)或盘符(C:)开头的绝对路径,也支持./开头的相对路径。但这两种路径在模块之间建立了强耦合关系,一旦某个模块文件的存放位置需要变更,使用该模块的其它模块的代码也需要跟着调整,变得牵一发动全身。因此,require函数支持第三种形式的路径,写法类似于foo/bar,并依次按照以下规则解析路径,直到找到模块位置。

  • 内置模块

    如果传递给require函数的是NodeJS内置模块名称,不做路径解析,直接返回内部模块的导出对象,例如require('fs')

  • node_modules目录

    NodeJS定义了一个特殊的node_modules目录用于存放模块。例如某个模块的绝对路径是/home/user/hello.js,在该模块中使用require('foo/bar')方式加载模块时,则NodeJS依次尝试使用以下路径。

     /home/user/node_modules/foo/bar
     /home/node_modules/foo/bar
     /node_modules/foo/bar
    
  • NODE_PATH环境变量

    与PATH环境变量类似,NodeJS允许通过NODE_PATH环境变量来指定额外的模块搜索路径。NODE_PATH环境变量中包含一到多个目录路径,路径之间在Linux下使用:分隔,在Windows下使用;分隔。例如定义了以下NODE_PATH环境变量:

     NODE_PATH=/home/user/lib:/home/lib
    

    当使用require('foo/bar')的方式加载模块时,则NodeJS依次尝试以下路径。

     /home/user/lib/foo/bar
     /home/lib/foo/bar

包(package)

我们已经知道了JS模块的基本单位是单个JS文件,但复杂些的模块往往由多个子模块组成。为了便于管理和使用,我们可以把由多个子模块组成的大模块称做,并把所有子模块放在同一个目录里。

在组成一个包的所有子模块中,需要有一个入口模块,入口模块的导出对象被作为包的导出对象。例如有以下目录结构。

- /home/user/lib/
    - cat/
        head.js
        body.js
        main.js

其中cat目录定义了一个包,其中包含了3个子模块。main.js作为入口模块,其内容如下:

var head = require('./head');
var body = require('./body');

exports.create = function (name) {
    return {
        name: name,
        head: head.create(),
        body: body.create()
    };
};

在其它模块里使用包的时候,需要加载包的入口模块。接着上例,使用require('/home/user/lib/cat/main')能达到目的,但是入口模块名称出现在路径里看上去不是个好主意。因此我们需要做点额外的工作,让包使用起来更像是单个模块。

index.js

当模块的文件名是index.js,加载模块时可以使用模块所在目录的路径代替模块文件路径,因此接着上例,以下两条语句等价。

var cat = require('/home/user/lib/cat');
var cat = require('/home/user/lib/cat/index');

这样处理后,就只需要把包目录路径传递给require函数,感觉上整个目录被当作单个模块使用,更有整体感。

package.json

如果想自定义入口模块的文件名和存放位置,就需要在包目录下包含一个package.json文件,并在其中指定入口模块的路径。上例中的cat模块可以重构如下。

- /home/user/lib/
    - cat/
        + doc/
        - lib/
            head.js
            body.js
            main.js
        + tests/
        package.json

其中package.json内容如下。

{
    "name": "cat",
    "main": "./lib/main.js"
}

如此一来,就同样可以使用require('/home/user/lib/cat')的方式加载模块。NodeJS会根据包目录下的package.json找到入口模块所在位置。

到此这篇关于Node.js中的模块路径解析规则和子模块包的文章就介绍到这了,更多相关Node.js的模块路径和子模块包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文带你了解Node.js有哪些架构模式

    一文带你了解Node.js有哪些架构模式

    Node.js 凭借其非阻塞、事件驱动的架构,已成为构建各种应用程序的流行选择,使用 Node.js 进行开发时,选择正确的架构模式来满足项目需求至关重要,在本文中,我们将探讨几种 Node.js 架构模式并提供示例来说明它们的用法,需要的朋友可以参考下
    2023-09-09
  • 基于Node.js实现图像与文件的上传下载功能

    基于Node.js实现图像与文件的上传下载功能

    在Web应用中,文件与图片上传下载几乎是必备功能,从用户头像、附件上传,到后台报表导出、图片资源分发,都离不开稳定可靠的文件处理能力,Node.js天然适合I/O密集型任务,在文件传输和流式处理方面具有明显优势,所以本文介绍了Node.js中文件与图片的上传与下载
    2025-12-12
  • 使用express获取微信小程序二维码小记

    使用express获取微信小程序二维码小记

    这篇文章主要介绍了使用express获取微信小程序二维码小记,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Node.js环境下Koa2添加travis ci持续集成工具的方法

    Node.js环境下Koa2添加travis ci持续集成工具的方法

    这篇文章主要给大家介绍了在Node.js环境下Koa2添加travis ci持续集成工具的方法,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • 初探nodeJS

    初探nodeJS

    本文主要介绍了nodeJS的基础知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 浅谈在node.js进入文件目录的问题

    浅谈在node.js进入文件目录的问题

    今天小编就为大家分享一篇浅谈在node.js进入文件目录的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • node连接mysql查询事务处理的实现

    node连接mysql查询事务处理的实现

    本文主要介绍了node连接mysql查询事务处理的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • node.js中实现GET和POST请求的代码示例

    node.js中实现GET和POST请求的代码示例

    在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如发送验证码、登录表单提交,请求服务器数据一般都使用GET请求,表单提交到服务器一般都使用POST请求,本文详细介绍了在Node.js中如何处理GET和POST请求,需要的朋友可以参考下
    2024-12-12
  • 前端如何更好的展示后端返回的十万条数据

    前端如何更好的展示后端返回的十万条数据

    这篇文章主要为大家介绍了前端如何更好的展示后端返回的十万条数据,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • node.js 动态执行脚本

    node.js 动态执行脚本

    其中的Script对象,就与require('vm')返回的对象很相似,而实质上,vm模块就是对Script对象的封装。
    2016-06-06

最新评论