为什么删除 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项目的依赖规模

复制代码
├── 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文件

复制代码
@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应用和工具的分享。关注我,少走弯路,一起进步!

相关推荐
mCell4 小时前
如何零成本搭建个人站点
前端·程序员·github
mCell5 小时前
为什么 Memo Code 先做 CLI:以及终端输入框到底有多难搞
前端·设计模式·agent
恋猫de小郭5 小时前
AI 在提高你工作效率的同时,也一直在增加你的疲惫和焦虑
前端·人工智能·ai编程
少云清5 小时前
【安全测试】2_客户端脚本安全测试 _XSS和CSRF
前端·xss·csrf
银烛木5 小时前
黑马程序员前端h5+css3
前端·css·css3
m0_607076605 小时前
CSS3 转换,快手前端面试经验,隔壁都馋哭了
前端·面试·css3
听海边涛声6 小时前
CSS3 图片模糊处理
前端·css·css3
IT、木易6 小时前
css3 backdrop-filter 在移动端 Safari 上导致渲染性能急剧下降的优化方案有哪些?
前端·css3·safari
0思必得06 小时前
[Web自动化] Selenium无头模式
前端·爬虫·selenium·自动化·web自动化
anOnion6 小时前
构建无障碍组件之Dialog Pattern
前端·html·交互设计