Node中模块查找策略

前言

在正常的 Node.js 开发中,模块化是一个至关重要的概念。Node.js采用的是CommonJS模块规范,我们在平常引入时,是否注意模块引入的策略。在本文中,主要说明Node.js中的模块化加载机制,包括CommonJS模块的加载规则、内置模块的使用方式以及第三方模块的引入方法。

node模块化官网

1. CommonJS 模块规范

CommonJS是一种用于组织代码结构的规范,它定义了模块的导入(require)和导出(exports)方式。在Node.js中,我们可以使用require函数来引入其他模块,并使用exports对象来导出当前模块的功能。

例如:

javascript 复制代码
// 导入模块
const otherModule = require('./otherModule');

// 导出功能
module.exports = 'xxx'

2. 模块加载规则

在Node.js中,模块的加载是通过路径来进行的。当使用require函数加载模块时,Node.js会按照一定的规则来查找模块文件:

  1. 如果路径是绝对路径或者相对路径,则直接根据路径加载模块
    • 如果路径不带文件后缀名(例如.js.json等),Node.js会按照以下顺序尝试添加后缀名并查找对应的文件:.js.json.node
  2. 如果路径没有后缀名,则尝试读取文件夹
    • Node.js会尝试加载该文件夹下的package.json文件,并读取其中的main字段指定的入口文件。
    • 如果没有package.json文件或者main字段不存在,则默认加载该文件夹下的index.js文件。

如果是非绝对路径或者相对路径。

  1. 内置模块
    • Node.js内置了许多核心模块,模块可以直接使用
  2. 第三方模块
    • npm安装第三方模块,读取node_modules下的模块,如果没有,则读取全局的模块。

2.1 文件

当使用相对路径或者绝对路径时,看一个案例:

读取文件index.js

javascript 复制代码
const a = require('./a')

console.log(a)

2.1.1 文件 a

css 复制代码
我是a,无后缀

2.1.2 文件a.js

js 复制代码
module.exports = '我是a.js'

2.1.3 文件a.json

json 复制代码
{
    "name":"我是a.json"
}

2.2 文件夹

当使用相对路径或者绝对路径时,如果没有对应的文件,会默认查找有没有对应文件夹。

看一个案例:

读取文件index.js

javascript 复制代码
const a = require('./a')

console.log(a)

2.2.1 有package.json

指定main为test.js文件

json 复制代码
"main": "test.js",

test.js

ini 复制代码
module.exports = '我有package.json'

2.2.2 无package.json

文件夹a下,新建index.js

ini 复制代码
module.exports = '我没有package.json'

2.3 内置模块

Node.js内置了许多核心模块,这些模块可以直接使用,无需额外安装。例如fshttp等模块都是Node.js内置的模块,可以通过require函数直接引入使用。当使用require加载内置模块时,Node.js会自动查找并加载对应的模块文件,无需指定路径。

javascript 复制代码
const fs = require('fs');

2.4 第三方模块

除了内置模块之外,我们还可以使用第三方模块来扩展Node.js的功能。在Node.js中,通过npm可以方便地安装和管理第三方模块。当我们需要使用第三方模块时,只需要在项目中执行npm install <module>命令即可安装对应的模块,然后就可以像使用内置模块一样通过require函数引入并使用。

javascript 复制代码
const axios = require('axios');

Node.js会在项目根目录下的node_modules文件夹中查找并加载第三方模块,无需手动指定模块的路径。

总结

最后总结一下:

  • 模块加载通过绝对或相对路径

    • 则直接根据路径名称加载模块,如(a、a.js、a.json等)。
    • 如果路径没有后缀名,则尝试读取文件夹下的 package.json 文件,或默认加载该文件夹下的 index.js 文件。
  • 非绝对或相对路径

    • 如果是内置模块,则直接加载内置模块。
    • 如果是第三方模块,则在项目根目录下的 node_modules 文件夹中查找并加载。

如有错误,请指正O^O!

相关推荐
鱼与宇20 分钟前
前端Web(html+css+js+vue3)
前端
雪芽蓝域zzs2 小时前
(六)打包优化 + Nginx 部署完整配置 + 项目收尾
前端·vue.js
研☆香2 小时前
聊一聊前端的常见字 关键字
开发语言·前端·javascript
东风破_2 小时前
JWT 1:从一个登录请求开始,理解 React 项目里的 API 层与 Mock
前端·后端
东风破_3 小时前
JWT 3:为什么 Token 要放进 Authorization?Axios 拦截器到底解决了什么?
前端·后端
东风破_3 小时前
JWT 5:路由守卫是什么?把整个 JWT 登录鉴权流程串起来
前端·后端
东风破_3 小时前
JWT 2:HTTP 是无状态的,为什么登录成功后还要给 Token?
前端·后端
东风破_3 小时前
JWT 4:Zustand 到底解决了什么?为什么登录状态要放进 Store?
前端·后端
IT_陈寒3 小时前
Vite动态导入差点让我秃头,原来问题出在这
前端·人工智能·后端
白泽_hunter3 小时前
项目里最常见的 5 个 this 指向坑:从规则到实战彻底讲透
前端