Node.js 依賴管理(一)—區分dependencies和devDependencies

原文連接:https://www.novenblog.xin/detail/?id=65css

本文拜讀百度@小蘑菇哥哥Node.js 中的依賴管理正文從這裏開始~node

nodejs 中總共有 5 種依賴:
webpack

 

  • 一、dependencies
  • 二、devDependencies (經常使用)
  • 三、peerDependencies (不太經常使用)
  • 四、bundledDependencies (我以前沒用過)
  • 五、optionalDependencies (我以前沒用過)

本文主要是記錄dependencies和devDependencies相關用途與區別。web

首先是一張圖, 簡單表示二者的區別npm

 

dependencies - 開發及運行時均須要的依賴

安裝方式json

npm install xxx -S 或 npm i xxx --save

i和install功能一致,此安裝命令會將依賴項自動添加到package.json中的dependencies一項下。gulp

  • 若是直接只寫一個包的名字,則安裝當前 npm registry 中這個包的最新版本;
  • 若是要指定版本的,能夠把版本號寫在包名後面,例如 npm i webpack@3.0.0 —save。

注意:在npm 5.x 開始能夠省略 —save,即若是執行 npm install xxx,npm 同樣會把包的依賴添加到 package.json 中去。要關閉這個功能,可使用 npm config set save false。sass

 

devDependencies - 只在開發時須要的依賴服務器

顧名思義,也就是在線上運行環境下是不須要這些依賴的,好比webpack打包工具。babel

安裝方式

npm install xxx -D 或 npm i xxx --save--dev

 

爲何須要devDependencies?

最終目的是爲了減小 node_modules 目錄的大小以及 npm install 花費的時間。

由於不少沒有理解dependencies和devDependencies區別的nodeJs使用者,在安裝一個依賴項的時候,每每會選擇不使用--save或-S,這樣會致使dependencies依賴性太多,在開發過程當中影響不大,可是在部署到線上服務器後,由於線上生產環境只打包dependencies中的依賴,會因爲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 由於性能緣由也不能用在線上。其餘還可能和具體業務相關,就看各位開發者本身識別了。

 

下面是其餘相關文章推薦:

相關文章
相關標籤/搜索