每個項目文件夾下都需要有node_modules嗎?

為什麼不能根據 package.json 全局調用依賴 module?


主要是不同的package對相同package可能依賴不同版本

比如A依賴C@1.0.0,B依賴C@2.0.0,按照semver的話這倆是不兼容的,那麼就要各自引入各自版本。如果項目依賴從global查找,項目依賴的依賴卻要各自查找,這樣不會變的很混亂嗎?

以及,當同一台機器上部署多個服務時,它們同樣可能一個依賴A@1.0.0另一個依賴A@2.0.0,所以還是自治的好。

但這樣就對瀏覽器項目非常不友好,可能打出來的包依賴重複度很高,於是又搞了一噸依賴打平和去重機制,然而,________。

抖機靈放個聊天段子截圖吧。(聊天是諷刺gulp和webpack之流的(逃


個人認為這是 NPM 的精華所在,也是很多人唾棄的東西——總之我是異端。

首先對於一個項目來說,個人感覺 Portable 比較重要。每個項目互不幹系。一旦依賴全局,就會有各種說不清道不明的情況。

舉個最簡單的例子,一個臉書的好基友跟我說他們的依賴庫根本不敢升級,牽一髮動全身。而 Node.js 來說,每個項目想要自己的依賴怎麼升級,跟別人都無關。

而且這也是遭很多人(包括 Node.js 社區)所唾棄的 Nested 依賴的精華所在。在新版 NPM 扁平化依賴管理下,多版本依賴共存做得不倫不類,更像是為前端服務的(如精簡體積等)。

但是 Nested 相比之下更優雅地解決了多版本依賴共存的特性,不過很多人根本不會在意這點。我作為一個其它語言轉過來的小夥伴,自從入了多版本依賴共存的世界就無法自拔了,並且感覺其它的依賴管理做得不夠好。

舉個栗子,一個項目裡面依賴了 A 和 B,然後 A 依賴 C 的 1.0.0 版本,B 依賴 C 的 2.0.0 版本。這個時候如果是其它語言的話會怎麼做呢?就我知道的一些語言的包管理系統裡面,遇到這種情況只能忍痛割愛了。但是 Node.js 因為每個模塊是一個閉包的原因,加上 NPM 包管理特意為之,使得這種情況能夠非常簡單地解決,並且在 Nested 式 node_modules 文件夾下優雅解決,而不是像扁平化那樣解決的吃相那麼難看。

最後說一點跟本題無關的話,後端跟前端的技術棧差別非常大,不要因為 Node.js 與前端 JS 共用 ECMAScript,就把 Node.js 歸入前端,包括 Node.js 以及 NPM 自身。

------------- 補充 -------------

CNPM 可能也意識到了前端跟 Node.js 的依賴方案應該不一樣,Nested 跟 Flatten 應該分別對待。

feat: lookup ancestor#x27;s dependencies by dead-horse · Pull Request #197 · cnpm/npminstall

社區為什麼口風就這麼硬呢?


node.js的精華所在不正是按需載入嗎?

需要什麼模塊才引入什麼模塊,如果全局依賴,那就是所有的模塊你都需要載入進入,你可能只是建一個很小的項目,依賴的模塊就一兩個,但也給你載入幾百個模塊,這不是造成資源浪費嗎?

目前node全部模塊加起來應該有上萬個了吧,莫非你想把這些模塊全部下載到本地放著?

這還不算上不同版本的模塊,因為不可能所有項目依賴的都是最新版的模塊,這樣你就需要集齊所有模塊的所有版本,這是有多想不開啊!


npm3.0新的依賴解決方案


設置環境變數NODE_PATH 即可,不一定要跟著項目走


原因:為了不讓項目依賴環境

反過來說,也就不讓項目污染環境

想像一下,每次做一個項目就要往電腦里或多或少安裝一些新的依賴,多麼不衛生。

更重要的是,不同的項目可能依賴不同的版本,那環境里的依賴是不是就要每次根據項目換來換去,特別是要頻繁切換手頭項目的時候,效率該會有多低。


小心工具的複雜性超過需要解決的問題的複雜性,得不償失。

nodejs 有些工具可以當作全局普通命令來使用,gulp, tldr, less, sass 等。如果不需要某些 package,完全可以不裝,使用全局的命令工具手工處理。


應該是可以指向一個公用的特定目錄吧!


推薦閱讀:

IoT開發的利器,pi-sync
Facebook 發布了新的 Node 模塊管理器 Yarn,或將取代 npm 客戶端
npx: npm 5.2.0 內置的包執行器
npm的應用場景,剛需在何處?簡單的寫寫頁面是否需要npm包管理工具?
npm install 生成的package-lock.json是什麼文件?有什麼用?

TAG:前端開發 | Nodejs | npm | webpack |