为什么删除 node_modules 这么慢?原因和解决方案一次讲清

大家好,我是大华!

经常写前端的朋友一定很熟悉,每次删除 node_modules 文件夹的时候都特别慢,甚至有时候还会提示权限不足。


node_modules 是什么?

简单来说,node_modules 就是项目里存放所有依赖包的地方。每当你用 npm installyarn 安装依赖时,所有依赖和它们的依赖,都会被下载到这个文件夹里。

它是 Node.js 项目中非常核心的一个文件夹,没有它,项目无法运行。


node_modules 的作用

node_modules 的作用就是存放项目依赖。 举个例子,我的项目用到了 lodashaxiosvue,对应的依赖安装后,这些包都会放到 node_modules 文件夹里,在代码里有用 importrequire 引入的时候,Node 都会去 node_modules 里寻找对应的模块。

可以理解为,它是项目的一个依赖仓库,所有功能模块都靠它支撑。


为什么 node_modules 会这么大?

如果你打开一个前端项目,依赖安装后,你发现 node_modules 可能会有几百 MB 或者几 GB 的大小,这有几个原因:

1. 依赖嵌套

每个包都有自己的依赖,npm 或 yarn 会把它们都下载下来。例如 vue-router 依赖 vueaxios 依赖 follow-redirects,它们又有自己的依赖,一层层叠加,导致文件数量和体积剧增。

2. 大量小文件

Node 包里通常会包含源码、文档、测试文件等大量小文件。虽然每个文件不大,但数量非常多,文件总数动不动就几十万,操作系统处理这么多小文件非常耗时。

3. 版本兼容问题

有时候同一个依赖会出现多个版本共存,每个版本都会占用额外空间,进一步膨胀 node_modules

示例:一个Vue项目的依赖规模

scss 复制代码
├── vue
├── vue-router
├── vuex
├── axios
├── webpack (及其15+个直接依赖)
├── babel (及其20+个插件)
└── 其他工具链...

实际安装后可能包含300-1000+个目录,占用数百MB甚至GB级空间。


为什么删除 node_modules 文件夹这么耗时?

我自己在 Windows 或 macOS 上都有过这样的体验:右键删除或者用命令 rm -rf node_modules,都可能卡上几分钟甚至十几分钟。

原因主要有:

1. 文件数量巨大

node_modules通常包含成千上万个小文件,操作系统删除大量小文件比删除单个大文件慢得多

2. 目录结构深

深层嵌套的目录结构需要递归遍历,增加I/O操作

3. Windows的特殊性

NTFS文件系统处理大量小文件效率较低,防病毒软件实时扫描每个删除操作,路径长度限制(260字符)导致额外处理

4. 磁盘I/O瓶颈

机械硬盘(HDD)在随机读写小文件时性能较差,SSD稍好但仍受限制

删除node_modules文件夹的几种方案

方案1:原生命令行删除(跨平台)

Windows (PowerShell):

powershell 复制代码
# 方法1:使用Remove-Item
Remove-Item -Path .\node_modules -Recurse -Force

# 方法2:使用rd命令(更快)
rd /s /q node_modules

也可以写个脚本,创建一个clean.bat文件

bash 复制代码
@echo off
echo 开始清理node_modules,可以去摸鱼了...
rd /s /q node_modules
echo 清理完成!可以继续干活了
pause

然后双击运行就可以。

macOS/Linux:

bash 复制代码
# 使用rm命令
rm -rf node_modules

方案2:使用专用删除工具

rimraf(Node.js工具):

bash 复制代码
# 全局安装
npm install -g rimraf

# 在项目目录使用
rimraf node_modules

# 或使用npx(无需安装)
npx rimraf node_modules

快速删除脚本(Windows批处理):

batch 复制代码
@echo off
echo 正在删除node_modules...
rmdir /s /q node_modules
echo 删除完成!
pause

方案3:使用包管理器的清理功能

使用npm:

bash 复制代码
# npm v6.5+ 新增的清理命令
npm clean-install

# 或先删除再安装
npm ci

使用yarn:

bash 复制代码
# yarn的自动清理
yarn clean

# 使用Plug'n'Play模式(避免node_modules)
yarn --pnp

使用pnpm:

bash 复制代码
# pnpm使用硬链接,删除更快
pnpm store prune  # 清理存储
pnpm install

方案4:操作系统级优化

Windows优化:

  1. 临时禁用防病毒软件
  2. 使用管理员权限运行命令行
  3. 使用快速删除工具(如FastDelete)

macOS/Linux优化:

bash 复制代码
# 使用rsync技巧(有时更快)
rsync -a --delete empty_dir/ node_modules/

方案5:避免频繁删除

  1. 使用Docker容器:在容器内开发,删除容器即可
  2. 使用虚拟机或WSL2:隔离环境
  3. 依赖缓存策略:合理配置npm/yarn缓存

方案6:现代包管理器的优势

pnpm解决方案:

bash 复制代码
# pnpm使用符号链接和内容寻址存储
# node_modules很小,主要文件在全局存储
pnpm install  # 安装快,删除也快

Yarn Plug'n'Play:

json 复制代码
// package.json
{
  "installConfig": {
    "pnp": true
  }
}
// 无需node_modules目录

写在最后

node_modules 删除慢,并不是你电脑的问题,也不是你操作不对,而是 Node 生态本身的历史包袱。

如果你只是偶尔删一次,用命令行或者 rimraf 就够了; 如果你经常重装依赖、切分支、拉项目,那我会强烈建议你试试 pnpm 或 Yarn PnP,真的能明显改善体验。

本文首发于公众号:程序员大华,专注前端、Java开发,AI应用和工具的分享。关注我,少走弯路,一起进步!

相关推荐
arvin_xiaoting1 天前
OpenClaw学习总结_I_核心架构_8:SessionPruning详解
前端·chrome·学习·系统架构·ai agent·openclaw·sessionpruning
工程师老罗1 天前
Image(图像)的用法
java·前端·javascript
swipe1 天前
把 JavaScript 原型讲透:从 `[[Prototype]]`、`prototype` 到 `constructor` 的完整心智模型
前端·javascript·面试
问道飞鱼1 天前
【前端知识】React 组件生命周期:从底层原理到实践场景
前端·react.js·前端框架·生命周期
CHU7290351 天前
定制专属美丽时刻:美容预约商城小程序的贴心设计
前端·小程序
浩~~1 天前
反射型XSS注入
前端·xss
AwesomeDevin1 天前
AI时代,我们的任务不应沉溺于与 AI 聊天,🤔 从“对话式编程”迈向“数字软件工厂”
前端·后端·架构
harrain1 天前
antvG2折线图和区间range标记同时绘制
前端·javascript·vue.js·antv·g2
德育处主任Pro1 天前
从重复搭建到高效生产,RollCode的H5开发新范式
前端
蜡台1 天前
SPA(Single Page Application) Web 应用(即单页应用)架构模式 更新
前端·架构·vue·react·spa·spa更新