Node.js 依賴管理(一)—區分dependencies和devDependencies
原文鏈接:https://www.novenblog.xin/detail/?id=65
本文拜讀百度@小蘑菇哥哥的Node.js 中的依賴管理,正文從這裏開始~
nodejs 中總共有 5 種依賴:
- 1、dependencies
- 2、devDependencies (常用)
- 3、peerDependencies (不太常用)
- 4、bundledDependencies (我之前沒用過)
- 5、optionalDependencies (我之前沒用過)
本文主要是記錄dependencies和devDependencies相關用途與區別。
首先是一張圖, 簡單表示兩者的區別
dependencies - 開發及運行時均需要的依賴
安裝方式
npm install xxx -S 或 npm i xxx --save
i和install功能一致,此安裝命令會將依賴項自動添加到package.json中的dependencies一項下。
- 如果直接只寫一個包的名字,則安裝當前 npm registry 中這個包的最新版本;
- 如果要指定版本的,可以把版本號寫在包名後面,例如 npm i [email protected] —save。
註意:在npm 5.x 開始可以省略 —save,即如果執行 npm install xxx,npm 一樣會把包的依賴添加到 package.json 中去。要關閉這個功能,可以使用 npm config set save false。
devDependencies - 只在開發時需要的依賴
顧名思義,也就是在線上運行環境下是不需要這些依賴的,比如webpack打包工具。
安裝方式
npm install xxx -D 或 npm i xxx --save--dev
為什麽需要devDependencies?
最終目的是為了減少 node_modules 目錄的大小以及 npm install 花費的時間。
因為很多沒有理解dependencies和devDependencies區別的nodeJs使用者,在安裝一個依賴項的時候,往往會選擇不使用--save或-S,這樣會導致dependencies依賴性太多,在開發過程中影響不大,但是在部署到線上服務器後,因為線上生產環境只打包
另外一個問題是,npm 的依賴是嵌套的,所以可能看上去 package.json 中只有幾個依賴,但實際上它又擴散到 N 個,而 N 個又擴散到 N 平方個,一層層擴散出去,可謂子子孫孫無窮盡也。如果能夠盡量減少不使用的依賴,那麽就能夠節省線上機器的硬盤資源,也可以節省部署上線的時間
在實際開發中,大概有這麽幾類可以歸為開發依賴:
構建工具
現在比較熱門的是 webpack 和 rollup,以往還有 grunt, gulp 等等。這些構建工具會生成生產環境的代碼,之後在線上使用時就直接使用這些壓縮過的代碼。所以這類構建工具是屬於開發依賴的。
像 webpack 還分為代碼方式使用(webpack)和命令行方式使用 (webpack-cli),這些都是開發依賴。另外它們可能還會提供一些內置的常用插件,如 xxx-webpack-plugin,這些也都算開發依賴。
預處理器
這裏指的是對源代碼進行一定的處理,生成最終代碼的工具。比較典型的有 CSS 中的 less, stylus, sass, scss 等等,以及 JS 中的 coffee-script, babel 等等。它們做的事情雖然各有不同,但原理是一致的。
以 babel 為例,常用的有兩種使用方式。其一是內嵌在 webpack 或者 rollup 等構件工具中,一般以 loader 或者 plugin 的形式出現,例如 babel-loader。其二是單獨使用(小項目較多),例如 babel-cli。babel 還額外有自己的插件體系,例如 xxx-babel-plugin。類似地,less 也有與之對應的 less-loader 和 lessc。這些都算作開發依賴。
在 babel 中還有一個註意點,那就是 babel-runtime 是 dependencies 而不是 devDependencies。具體分析我在之前的 babel 文章中提過,就不再重復了。
測試工具
嚴格來說,測試和開發並不是一個過程。但它們同屬於“線上狀態不需要使用的依賴”,因此也就歸入開發依賴了。常用的如 chai, e2e, karma, coveralls 等等都在此列。
真的是開發才用的依賴包
最後一類比較雜,很難用一個大類囊括起來,總之就是開發時需要使用的,而實際上線時要麽是已經打包成最終代碼了,要麽就是不需要使用了。比如 webpack-dev-server 支持開發熱加載,線上是不用的;babel-register 因為性能原因也不能用在線上。其他還可能和具體業務相關,就看各位開發者自己識別了。
下面是其他相關文章推薦:
Node.js 依賴管理(一)—區分dependencies和devDependencies