2024/01/17

2 種在 Windows 下快速刪除 node_modules 的方法

作者:吳祐賓

使用 Node.js 練習開發 JavaScript 專案時,或多或少會遇到需要刪除 node_modules 目錄的情況。以 create-react-app 為例,安裝完成時,node_modules 就有 39,674 個檔案,5,060 個資料夾,約 234 MB。檔案大小估且不計,但 39,674 個檔案光是刪除就要花很多的時間。



糟糕的刪除方式

Windows 常見的刪除有 2 種:移至資源回收筒、檔案總管下 Shift+ DELETE 直接刪除。這 2 種都是糟糕到不行的刪除方式。


移至資源回收筒

搬到資源回收筒目錄,還需要再刪除一次。


檔案總管下 Shift+ DELETE 直接刪除

刪除資料前還需為花費大量時間為每個檔案進行檢查。


除了刪除 node_modules 之外,如果你的目錄也是零碎檔案很多時,也會有相同的問題。這似乎是 Windows 的問題,有沒有可以解決刪除花費大量時間的方法呢?答案是有的,而且還有 2 種:使用 npm rimraf、使用 dos command。

2 種快速删除 node_modules 的方法

使用 npm rimraf

isaacs 製作了名叫 "rimraf" 的 npm 套件,作者對此套件的說明如下:

The UNIX command rm -rf for node.

Install with npm install rimraf.


作者復刻 Unix 的 rm 指令(remove),藉由 npm 的架構,讓此套件能跨平台使用。

rimraf 安裝

npm install rimraf -g # 可全域使用


rimraf 使用

rimraf node_modules # 移除 node_modules 目錄


使用 Dos Command

上述內容可以知道使用 Windows 檔案總管刪除資料並不是這麼理想,不過使用 Dos Command 可是非常有效率的,你可以使用  rmdir /s/q [FolderName]  刪除整個目錄其指令;或使用  del /f/s/q [FolderName]  刪除所有檔案,只是 del 的指令仍會保留目錄及子目錄結構。整理之後的指令如下:

del /f/s/q node_modules > nul
rmdir /s/q node_modules

nul 的用意是不要把刪除的流程顯示出來,盡可能地加快刪除效率。

StackOverflow 有網友測試了 WinXP 加密磁碟下刪除了 30GB / 1,000,000 個檔案 / 15,000 個資料夾,rmdir 使用約 2.5 小時;del + rmdir 則約 53 分鐘。

於是可以將以上指令濃縮在一行處理:

del /f/s/q node_modules > nul &&  rmdir /s/q node_modules



可以確保刪除 node_modeuls 內檔案成功後,再刪除 node_modeuls 資料夾結構。

del 命令說明:

  • /f - 強制刪除 (僅管是唯讀的)
  • /s - 遞迴子資料夾
  • /q - 安靜執行 (不會有提示給使用者確認)



rmdir 命令說明:

  • /s - 遞迴子資料夾 (和 del /s 參數指令相同)
  • /q - 安靜執行 (和 del /q 參數指令相同)


製作 rm.bat 快速刪除指定資料夾

REM rm.bat
@echo off
if "%1"=="" (
    echo Usage: rm.bat ^<directory^>
    exit /b 1
)

set "target_directory=%1"

echo Deleting %target_directory%...
del /f /s /q "%target_directory%" > nul
rmdir /s /q "%target_directory%"

echo Cleanup complete.
exit /b 0




結論

本文介紹 Windows 刪除檔案最常用的方式在刪除 node_modules 目錄時會引發可能的災難。進而說明更有效率的刪除方式有 npm rimraf 和 Dos Command 兩種方式。rimraf 可以讓刪除功能在各家平台都能保持其一致性,Dos Command 則能在 Windows 平台下發揮其最大效能。我個人會偏好使用 Dos Command 並使用批次檔讓執行變得更加容易。不過我相信您在看完這份文件後也可以挑選出適合您的方案。有任何想法都歡迎留言。

和你分享。



See also

沒有留言:

張貼留言