本文同步自我的個人博客: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)/~