原文連接:https://www.novenblog.xin/detail/?id=65css
本文拜讀百度@小蘑菇哥哥的Node.js 中的依賴管理,正文從這裏開始~node
nodejs 中總共有 5 種依賴:
webpack
本文主要是記錄dependencies和devDependencies相關用途與區別。web
首先是一張圖, 簡單表示二者的區別npm
安裝方式json
npm install xxx -S 或 npm i xxx --save
i和install功能一致,此安裝命令會將依賴項自動添加到package.json中的dependencies一項下。gulp
注意:在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 由於性能緣由也不能用在線上。其餘還可能和具體業務相關,就看各位開發者本身識別了。
下面是其餘相關文章推薦: