當我們項目需要下載一個模塊的時候,我們安裝npm包(在項目目錄下面npm install module_name)的時候,很多時候我們會在后面加上–save-dev 或 –save。這兩個參數代表什么呢?
初識
相信很多人都會回答:
npm install module-name -save 自動把模塊和版本號添加到dependencies部分
npm install module-name -save-dev 自動把模塊和版本號添加到devdependencies部分
dependencies是什么呢? 生產環境。
devdependencies是什么呢? 開發環境。
網上也可以查到很多資料,大概回答意思是,我們搭建一個webpack+react+es6的項目,像webpack babel這種負責打包編譯的,我們就應該裝在開發環境,像react之類的裝在生產環境。
可是為什么呢?
我們不能告訴我們這樣做,我們就只這樣做,我們要知之其所以然呀。
恩。我試著吧react放進了dependencies,打包出來的文件依然可以運行,并沒有什么問題。
why ???難道文檔只是建議而已嗎???
實質區別
如果我們只是單純的做項目,那么我們可簡單地認為生產環境和開發環境做為一種友善的提示,實質沒有什么區別;但是,如果在發布npm包的時候,兩種環境安裝方式是有很大區別的!!!
假設有以下兩個模塊:
模塊A
- devDependencies模塊B
- dependencies模塊C
模塊D
- devDependencies模塊E
- dependencies模塊A
npm install D的時候, 下載的模塊為:
- D
- A
- C
當我們下載了模塊D的源碼,并且在根目錄下npm install, 下載的模塊為:
- A
- C
- E
所以,在發布npm包的時候,本身dependencies下的模塊會作為依賴,一起被下載;devDependencies下面的模塊就不會自動下載了;但對于項目而言,npm install 會自動下載devDependencies和dependencies下面的模塊。
devDependencies是只會在開發環境下依賴的模塊,生產環境不會被打入包內。通過NODE_ENV=developement或NODE_ENV=production指定開發還是生產環境。
而dependencies依賴的包不僅開發環境能使用,生產環境也能使用。其實這句話是重點,按照這個觀念很容易決定安裝模塊時是使用–save還是–save-dev。