本文同步自我的个人博客:http://www.52cik.com/2015/11/13/node-modules-del.html

说到 node 的模块,确实既好用又蛋疼。相信无数人吐槽 node_modules 目录结构的设计了。

确实,npm 没有处理好 peerDependencies 的概念,不仅重复安装了模块,而且嵌套层次太深。

我觉得可以在安装依然的时候分析相同模块,安装到合适的层次,但是却面临一个相同模块的不同版本问题。

反正确实挺纠结的,我这样的脑子不够用。

win 的 MAX_PATH 问题

在 windows 下,目录路径不能超过 MAX_PATH 长度,具体请查阅《MAX_PATH 还是 MAX_PATH + 1》。

MAX_PATH 只有 248 字符!呵呵,10-20 个模块深度就可以超过了,大一点的模块,分分钟超越 MAX_PATH,没有最长,只有更长。

其实我也不懂那些底层概念,反正就是超过了最大长度导致的无法删除问题。

听说 npm 3 会有所改进,不过这都是后话了,现在我们先处理当前问题吧。

解决方法

解决方法也简单,把 node_modules 改成 0 然后打开这个目录,继续修改里面的目录,多个就改成 0,1,2 这样的命名。

改个 3-6 层,就差不多可以删除了,如果还删除不了,就再深入修改几层。

不过每次人工修改,确实很累,而且目录分支众多,很不方便。既然 node 惹的祸,就用 node 来解决好了。

js 脚本处理

思路就是递归遍历目录,重命名目录名,递归完成后,删除目录即可。

来看代码吧。

var fs = require('fs');

rmdirSync('./test'); // 你要删除的目录
console.log('done!'); /**
* 删除 node 模块目录
* @param {string} filepath 目录名
*/
function rmdirSync(filepath) {
if (!fs.existsSync(filepath)) { // 无效路径退出
return false;
} var files = fs.readdirSync(filepath); // 获取目录下文件 files.forEach(function (file, i) { // 遍历文件
var subpath = filepath + '/' + file; // 拼接文件路径 if (fs.statSync(subpath).isDirectory()) { // 判断目录还是文件
var newpath = filepath + '/' + i; // 生成新的目录名
fs.renameSync(subpath, newpath); // 重命名目录
rmdirSync(newpath); // 递归遍历目录
} else {
fs.unlinkSync(subpath); // 删除文件
}
}); fs.rmdirSync(filepath); // 删除目录
}

补充

我今天在群里装逼的时候,@Mr.Bin 大神的一句话将我打回了逗逼形态。

npm uninstall

一句话直接搞定,当时我就懵逼了。

当然如果没有保存到 package.json 的包只能手动添加包名来删除了。

npm uninstall 包名

或者多个包都没保存到 package.json 的情况,就这样删除。

for /f %m in ('dir /b node_modules') do npm uninstall %m

虽然装逼失败,但学到了新技能,当逗逼也是值的。(o)/~

删除 windows 下 node_modules 过深的目录的更多相关文章

  1. windows下设置JupyterNotebook默认目录

    目录 windows下设置JupyterNotebook默认目录 生成配置文件 设置默认工作目录 设置快捷方式中的目标与起始位置 直接修改anaconda中的相关配置文件 windows下设置Jupy ...

  2. 关于 windows 下 node_modules\node-sass\vendor 的报错解决方法

    项目git clone下来之后,运行npminstall, npm start报错代码如下: ERROR in ENOENT: no such file or directory, scandir ' ...

  3. windows下nginx访问web目录提示403 Forbidden

    在windows下 http服务器nginx时,访问web目录提示403 Forbidden,首先需要了解nginx出现403错误是什么意思: 403 Forbidden表示你在请求一个资源文件但是n ...

  4. Windows下将网络共享目录挂载到指定文件夹

    简述 因为某些原因,设计好的目录结构是不能动的,因此需要将网络共享目录挂载到指定目录下,以便扩容. 在Linux下这完全没有问题,但是Windows下的操作就稍微复杂一点. 1.直接使用net use ...

  5. git安装,windows下git bash默认目录更改

    最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和Window ...

  6. windows下挂载NFS共享目录

    1.在打开或关闭Windows功能中,选择安装NFS客户端 2.在命令行中,输入“mount \\172.24.184.31\data x:\”,输入mount查看详细挂载参数(注意此时uid.gid ...

  7. 添加/删除 windows下Git右键菜单

    从网上搜索了些方法,总结一下 不显示右键菜单: 方法1: 安装的时候选择不添加右键菜单. 方法2(绝对有效): 运行CMD Windows 64 输入命令(地址为git安装地址) cd "C ...

  8. windows下命令行切换目录

    1.切换目录 C:\Users\MACHENIKE> cd H:/www C:\Users\MACHENIKE>H: H:\www> 2.查看目录文件 H:\www>dir

  9. Windows下遍历所有GIT目录更新项目脚本

    将下面代码保存为.bat文件 @echo off set cdir=%~dp0 for /f "delims=" %%i in ('dir /ad/b/s "%cdir% ...

随机推荐

  1. C#调用C++ DLL 文件

    说来惭愧,都注册一年多了,却没有发表过一篇正式的博文,中间很多学习的过程也没有记录下来.如今到了一个新的环境,也有了学习的机会,一定要把每天的收获记录一下. 要做的东西需要引用C++编写的DLL,刚开 ...

  2. Web Application Project is configured to use IIS. Unable to access the IIS metabase.(配置为使用IIS Web应用程序xxxx项目。无法访问IIS元数据库。)

    这几天重装系统,装了win10,居然用vs2013打开项目出现下面这个提示错误,搞了很久才知道原因: Even though I am an administrator on the machine, ...

  3. 计算机信息统计.vbs

    temp=0 set wshshell=wscript.createobject("wscript.shell") Set WshNetwork = WScript.Createo ...

  4. jsp EL 表达式

    EL表达式 EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有E ...

  5. xcode 自定义include路径

  6. iBus

    0.闲言 闲来无事,重新玩玩Ubuntu,于是先把Ubuntu13.04删了(为什么是13.04?我也不知道)翻出14.04U盘安装,还算顺利,就是不知道为什么DiskGenius为什么一直提示分区表 ...

  7. volatile 关键字

    就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和修改的变量.如果没有volatile,基本上会导致这样的结果:要么无 ...

  8. Unity3D 实现简单的语音聊天 [iOS版本]

    现在很多手机游戏中的聊天系统都加入语音聊天的功能,相比于传统的文字聊天,语音聊天在MMORPG中显得尤为重要,毕竟直接口头交流总比你码字快得多了,也更直观些. 实现语音聊天的方法很多,U3D中有不少第 ...

  9. 在linux下安装某个硬件驱动到方法

    东西很简单,几句话就能说清除. 使用lsipc检查你需要安装到硬件,记住硬件到关键型号,去搜索引擎搜索linux下的驱动文件 对文件进行安装简单的解压后基本上是 ./configure &&a ...

  10. POJ 1364 King --差分约束第一题

    题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析 ...