Node 文件查找优先级及 Require 方法文件查找策略

 更新时间:2022年09月25日 08:36:37   作者:别救了这猴子废了​​​​​​​  
这篇文章主要介绍了Node文件查找优先级及Require方法文件查找策略。文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

一、模块规范

NodeJSCommonJS进行了支持和实现,让我们在开发node的过程中可以方便的进行模块化开发:

  • 在Node中每一个js文件都是一个单独的模块
  • 模块中包括CommonJS规范的核心变量:exports、module.exports、require
  • 通过上述变量进行模块化开发

而模块化的核心是导出与导入,在Node中通过exportsmodule.exports负责对模块中的内容进行导出,通过require函数导入其他模块(自定义模块、系统模块、第三方库模块)中的内容

二、查找策略

require方法接收一下几种参数的传递:

  • 原生模块:http、fs、path等
  • 相对路径的文件模块:./mod或../mod
  • 绝对路径的文件模块:/pathtomodule/mod
  • 目录作为模块:./dirname
  • 非原生模块的文件模块:mod

require参数较为简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同,如下图:

从上图可以看见,文件模块存在缓存区,寻找模块路径的时候都会优先从缓存中加载已经存在的模块

原生模块

而像原生模块这些,通过require方法在解析文件名之后,优先检查模块是否在原生模块列表中,如果在则从原生模块中加载

绝对路径、相对路径

如果require绝对路径的文件,则直接查找对应的路径,速度最快

相对路径的模块则相对于当前调用require的文件去查找

如果按确切的文件名没有找到模块,则 NodeJs 会尝试带上 .js.json或 .node拓展名再加载

目录作为模块

默认情况是根据根目录中package.json文件的main来指定目录模块,如:

{ "name" : "some-library",
  "main" : "main.js" }

如果这是在./some-library node_modules目录中,则 require('./some-library') 会试图加载 ./some-library/main.js

如果目录里没有 package.json文件,或者 main入口不存在或无法解析,则会试图加载目录下的 index.js 或 index.node 文件

非原生模块

在每个文件中都存在module.paths,表示模块的搜索路径,require就是根据其来寻找文件

window输出如下:

[ 'c:\nodejs\node_modules','c:\node_modules' ]

可以看出module path的生成规则为:从当前文件目录开始查找node_modules目录;然后依次进入父目录,查找父目录下的node_modules目录,依次迭代,直到根目录下的node_modules目录

当都找不到的时候,则会从系统NODE_PATH环境变量查找

举个例子

如果在/home/ry/projects/foo.js文件里调用了 require('bar.js'),则 Node.js 会按以下顺序查找:

  • /home/ry/projects/node_modules/bar.js
  • /home/ry/node_modules/bar.js
  • /home/node_modules/bar.js
  • /node_modules/bar.js

这使得程序本地化它们的依赖,避免它们产生冲突

三、总结

通过上面模块的文件查找策略之后,总结下文件查找的优先级:

  • 缓存的模块优先级最高
  • 如果是内置模块,则直接返回,优先级仅次缓存的模块
  • 如果是绝对路径 / 开头,则从根目录找
  • 如果是相对路径 ./开头,则从当前require文件相对位置找
  • 如果文件没有携带后缀,先从js、json、node按顺序查找
  • 如果是目录,则根据 package.json的main属性值决定目录下入口文件,默认情况为 index.js
  • 如果文件为第三方模块,则会引入 node_modules 文件,如果不在当前仓库文件中,则自动从上级递归查找,直到根目录

到此这篇关于Node 文件查找优先级及 Require 方法文件查找策略的文章就介绍到这了,更多相关Node 文件查找内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用puppeteer破解极验的滑动验证码

    使用puppeteer破解极验的滑动验证码

    这篇文章主要介绍了利用puppeteer破解极验的滑动验证功能,基本流程代码实现给大家介绍的非常详细,需要的朋友可以参考下
    2018-02-02
  • Node express 官方示例cors跨域解析

    Node express 官方示例cors跨域解析

    这篇文章主要为大家介绍了Node express 官方示例cors跨域解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • node使用Git Bash作为命令行终端示例

    node使用Git Bash作为命令行终端示例

    这篇文章主要为大家介绍了node使用Git Bash作为命令行终端示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 详解基于Node.js的微信JS-SDK后端接口实现代码

    详解基于Node.js的微信JS-SDK后端接口实现代码

    本篇文章主要介绍了详解基于Node.js的微信JS-SDK后端接口实现代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • 我的Node.js学习之路(二)NPM模块管理

    我的Node.js学习之路(二)NPM模块管理

    npm 是 Node.js 的模块依赖管理工具。作为开发者使用的工具,主要解决开发 Node.js 时会遇到的问题。如同 RubyGems 对于 Ruby 开发者和 Maven 对于 Java 开发者的重要性,npm 对与 Node.js 的开发者和社区的重要性不言而喻。
    2014-07-07
  • nodejs结合Socket.IO实现的即时通讯功能详解

    nodejs结合Socket.IO实现的即时通讯功能详解

    这篇文章主要介绍了nodejs结合Socket.IO实现的即时通讯功能,结合实例形式详细分析了nodejs结合Socket.IO实现即时通讯的相关操作技巧与注意事项,需要的朋友可以参考下
    2018-01-01
  • node.js结合webSocket实现聊天室

    node.js结合webSocket实现聊天室

    于Node.js和WebSocket的聊天室,主要包括前端页面,主要是用户操作的页面,还包括后台数据通信以及逻辑处理,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Koa从零搭建到Api实现项目的搭建方法

    Koa从零搭建到Api实现项目的搭建方法

    这篇文章主要介绍了Koa从零搭建到Api实现项目的搭建方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Node.js之删除文件夹(含递归删除)代码实例

    Node.js之删除文件夹(含递归删除)代码实例

    这篇文章主要介绍了Node.js之删除文件夹(含递归删除)代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 详解基于Node.js的HTTP/2 Server实践

    详解基于Node.js的HTTP/2 Server实践

    HTTP/2目前已经逐渐的在各大网站上开始使用,这篇文章主要介绍了详解基于Node.js的HTTP/2 Server实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论