刪除 windows 下 node_modules 過深的目錄


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM