1. 程式人生 > >Node.js 依賴管理(一)—區分dependencies和devDependencies

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

log 預處理器 體系 生產環境 真的 記錄 nbsp shc enc

原文鏈接: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依賴性太多,在開發過程中影響不大,但是在部署到線上服務器後,因為線上生產環境只打包

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 因為性能原因也不能用在線上。其他還可能和具體業務相關,就看各位開發者自己識別了。

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

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