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!

相关推荐
juruiyuan11143 分钟前
FFmpeg3.4 libavcodec协议框架增加新的decode协议
前端
Peter 谭1 小时前
React Hooks 实现原理深度解析:从基础到源码级理解
前端·javascript·react.js·前端框架·ecmascript
LuckyLay3 小时前
React百日学习计划——Deepseek版
前端·学习·react.js
gxn_mmf3 小时前
典籍知识问答重新生成和消息修改Bug修改
前端·bug
hj10433 小时前
【fastadmin开发实战】在前端页面中使用bootstraptable以及表格中实现文件上传
前端
乌夷3 小时前
axios结合AbortController取消文件上传
开发语言·前端·javascript
晓晓莺歌3 小时前
图片的require问题
前端
码农黛兮_464 小时前
CSS3 基础知识、原理及与CSS的区别
前端·css·css3
水银嘻嘻4 小时前
web 自动化之 Unittest 四大组件
运维·前端·自动化
(((φ(◎ロ◎;)φ)))牵丝戏安4 小时前
根据输入的数据渲染柱形图
前端·css·css3·js