我們都知道dependencies 和devDependencies 的是我們記錄當(dāng)前項目所使用依賴的地方蛙粘,執(zhí)行npm install之后就會以這兩個對象為依據(jù)去下載我們當(dāng)前項目所需要的依賴包。那他們倆到底有什么區(qū)別呢牲阁?
首先從字面上來理解浙巫,devDependencies 指的就是開發(fā)環(huán)境所需要的依賴嗅绸,而dependencies則是生產(chǎn)環(huán)境所需要的依賴了察署。當(dāng)然大部分文章也是這么描述的期升。說一些生產(chǎn)環(huán)境不需要用到的依賴放在devDependencies是尔,生產(chǎn)環(huán)境需要的依賴放在dependencies殉了。
但如果你真的是這樣認(rèn)為的那就大錯特錯了。事實并非如此拟枚,我們都知道工程化的構(gòu)建工具是通過分析依賴的引入來打包整個項目所需要用到的文件的薪铜。再加上不斷的優(yōu)化,three shaking的出現(xiàn)恩溅,使得一些沒有被用到的包根本不會被打進(jìn)最終產(chǎn)物隔箍。所以即使我們在dependencies中寫了開發(fā)環(huán)境所需的包,但只要我們的代碼中沒有引入他脚乡,他都是不會被打包進(jìn)最終產(chǎn)物的蜒滩。
換句話說,這兩個東西對于一個業(yè)務(wù)項目來說奶稠,依賴寫在哪兒都無所謂俯艰。都不會影響最終結(jié)果。但是規(guī)范的去歸類也是沒有任何問題的锌订。
那么問題來了竹握,既然依賴寫在哪兒都無所謂的話,為啥還要區(qū)分出這兩個屬性出來呢辆飘,干脆放在同一個屬性里不就好了啦辐。
仔細(xì)回想一下,上文說了蜈项,如果是對于一個業(yè)務(wù)項目來說芹关,他沒有什么區(qū)別。那么對于其他項目是不是就會起到不一樣的作用了紧卒?
在去探秘之前侥衬,讓我們先回顧一下依賴安裝相關(guān)的知識。
當(dāng)我們下載一個外部依賴庫的時候常侦,這個庫可能也依賴了別的庫浇冰,那么在下載的時候,當(dāng)然是需要把這個庫所依賴的庫也一起下載進(jìn)來聋亡。那么npm怎么知道這個庫依賴了哪些庫呢。答案當(dāng)然就是根據(jù)庫的package.json 文件中的dependencies來決定了际乘。所以這個時候如果那個庫的dependencies沒有寫他所依賴的庫的話坡倔,是不是就會導(dǎo)致這個庫沒辦法正常運(yùn)行了。
講到這里是不是開始有點(diǎn)能理解這倆兄弟的作用了。當(dāng)我們在開發(fā)一個外部資源庫的時候罪塔,我們就需要嚴(yán)格的去區(qū)分dependencies 和devDependencies投蝉。嚴(yán)格的按照運(yùn)行時所依賴的庫和生產(chǎn)環(huán)境所以來的庫做區(qū)分,這樣才不會導(dǎo)致我們開發(fā)的庫被用戶使用時造成意想不到的錯誤征堪。npm在下載依賴庫的依賴的時候只會下載dependencies中的東西瘩缆,不會去下載devDependencies的東西。如果我們將開發(fā)環(huán)境用到的庫寫到了dependencies中佃蚜,那就會無故占用用戶的資源空間庸娱。因為這些東西用戶在使用的時候根本用不著。
當(dāng)然如果你的資源庫是一個已經(jīng)構(gòu)建過得包那就不會出現(xiàn)這樣的問題了谐算,因為你的包在構(gòu)建的過程中就已經(jīng)將所需的庫一起打包進(jìn)去了熟尉。當(dāng)然這樣的話你就需要配置你的暴露項為編譯后的產(chǎn)物,讓用戶直接引入編譯之后的代碼洲脂。