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!

相关推荐
AlienZHOU18 分钟前
DeepSeek Harness 插件:HTML 实时可视化编辑
前端·agent·deepseek
剪刀石头布啊3 小时前
javascript手动实现继承
前端
Elias不吃糖3 小时前
Langfuse 入门:Trace、Prompt、Dataset、Experiment、Evaluator
前端·python·prompt·langfuse
vipbic3 小时前
一个前端的 9 天重构:我是怎么用 Codex 重做航栈的
前端·javascript·后端
Eason_Lou5 小时前
【无标题】
前端·vue.js·html
_codemonster5 小时前
npm run dev 是在开发模式运行,怎么在生产环境运行
前端·npm·node.js
kyriewen6 小时前
我受够了复制报错去问 AI,花一下午给控制台做了个调试助手
前端·javascript·ai编程
IT_陈寒7 小时前
Redis的DEL命令竟然没删掉数据?我踩的这个坑你得知道
前端·人工智能·后端
anOnion7 小时前
构建无障碍组件之Menu and Menubar Pattern
前端·html·交互设计