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!

相关推荐
Tiffany_Ho1 分钟前
【TypeScript】知识点梳理(三)
前端·typescript
安冬的码畜日常1 小时前
【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)
开发语言·前端·javascript·信息可视化·数据可视化·d3.js
小白学习日记2 小时前
【复习】HTML常用标签<table>
前端·html
丁总学Java2 小时前
微信小程序-npm支持-如何使用npm包
前端·微信小程序·npm·node.js
yanlele2 小时前
前瞻 - 盘点 ES2025 已经定稿的语法规范
前端·javascript·代码规范
懒羊羊大王呀3 小时前
CSS——属性值计算
前端·css
DOKE3 小时前
VSCode终端:提升命令行使用体验
前端
xgq3 小时前
使用File System Access API 直接读写本地文件
前端·javascript·面试
用户3157476081353 小时前
前端之路-了解原型和原型链
前端