前言

如果你有試過打包整個 Node 項目到服務器上,那麼你發現自己的項目體積比較大,其中一個原因是 node_modules 文件夾包含很多不必要的檔案。在使用 npm 安裝不同插件時,往往會包含很多不必要的文件夾,例如example, doc。要麼我們就是手動刪除它們,要麼我們就是自己寫一個自動腳本。而開發 Koa、Co、Express 的 TJ 大神則提供了一個簡單輕巧的工具。我們可以學習一下他的思路,以及使用這個工具。

簡述

node-prune 移除所有 node_modules 內的不必要的檔案,例如 markdown, typescript 源碼。具體的移除內容可以看下方的移除檔案分析

Github: tj/node-prune

安裝方法

Go

可以透過 Go 直接拉代碼,然後安裝:

$ go get github.com/tj/node-prune/cmd/node-prune

Shell

另外,如果你沒有 Go 的話,可以直接使用一下命令安裝到 /usr/local/bin: (2018-08-25 更新)

$ curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin

使用方法

你可以直接在項目的文件夾裡使用:

$ node-prune

files total 27,330
files removed 3,990
size removed 13 MB
   duration 200ms

或者你可以在其他文件夾裡面用,例如 node_modules

$ node-prune path/to/node_modules

files total 27,330
files removed 3,990
size removed 13 MB
   duration 200ms

移除檔案分析

移除的檔案

自動化

這些文件你都會只用一次,無需一同打包上生產環境。

"Makefile"
"Gulpfile.js" // Gulp 任務自動管理工具文件
"Gruntfile.js" // Grunt 任務自動管理工具文件

與寫代碼時相關的

無論你寫代碼所需要的檔案,還是那些編輯器自動產生的檔案,都不是必須的。

".DS_Store" // Mac OS X 下的隱藏文件,用於儲存目錄的自定義屬性
".tern-project" // Tern server 所需文件
".gitattributes" // Git 屬性文件
".editorconfig" // 統一代碼格式的文件
".eslintrc" // 用於統一 Eslint 代碼風格 (JSON)
".eslintrc.js" // 用於統一 Eslint 代碼風格 (JavaScript)
".eslintignore" // 告訴 Eslint 忽略特定文件和目錄
".npmignore" // 告訴 NPM 忽略特定文件和目錄
".jshintrc" // 用於配置 JSHint
".flowconfig" // 用於配置 Facebook 出品的 Flow-typed
".documentup.json"
".yarn-metadata.json"

自動化構建

".travis.yml" // 用於配置 Travis 自動化測試,部署
"appveyor.yml" // 用於配置 AppVeyor 自動化測試,部署
"circle.yml" // 用於配置 Circle 自動化測試,部署
".coveralls.yml" // Coverall

給人類看的

這是最小化項目的其中一個步驟,畢竟你上傳的東西和項目開發的文件夾是不同的。

"CHANGES" // 用於記錄項目改動
"LICENSE.txt" // 開源協議
"LICENSE" // 同上
"AUTHORS" // 作者
"CONTRIBUTORS" // 貢獻者

Yarn 相關

".yarn-integrity" // Yarn 文件
".yarnclean", // Yarn 文件

移除的檔案(副檔名)

如果檔案有以下副檔名的話,也會一同刪除。

".md", // Markdown 檔案
".ts", // TypeScript 源碼
".jst", // Javascript Templates (JST)
".coffee", // CoffeeScript
".tgz", // tgz 壓縮檔案
".swp", // vi 產生檔案

移除的目錄

測試用:"_tests_","test","tests","powered-test"

文件類:"docs","doc"

隱藏文件夾:".idea",".vscode"

Demo 類:"website","images","assets","example","examples"

自動化工具類:"coverage",".nyc_output",".circleci"

Github用: ".github"

感想

我們可以按照這個思路,自己寫一個基於 Node.js 的腳本。另外,在 Github 上面,有人寫了一個等同 Node-prune 的 Shell 腳本。

#!/usr/bin/env bash
find node_modules \( -name '__tests__' -o \
-name 'test' -o \
-name 'tests' -o \
-name 'powered-test' -o \
-name 'docs' -o \
-name 'doc' -o \
-name '.idea' -o \
-name '.vscode' -o \
-name 'website' -o \
-name 'images' -o \
-name 'assets' -o \
-name 'example' -o \
-name 'examples' -o \
-name 'coverage'-o \
-name '.nyc_output' -o \
-name "*.md" -o \
-name "*.ts" -o \
-name "*.jst" -o \
-name "*.coffee" -o \
-name "*.tgz" \) -exec rm -rf {} \;
如果你覺得我的文章對你有幫助的話,希望可以推薦和交流一下。歡迎關注和 Star 本博客或者關注我的 Github