2012-06-26 109 views
52

npm允許我們指定bundledDependencies,但這樣做的優點是什麼?我猜如果我們想確保我們獲得正確的版本,即使我們引用的模塊被刪除了,或者捆綁的速度可能會有所提高?捆綁依賴優於NPM的正常依賴關係

任何人都知道捆綁依賴優於正常依賴的優點嗎? bundledDependencies定義的

提取這裏爲了方便:

bundledDependencies包名的
陣列發佈包時將被捆綁。

如果拼寫爲「bundleDependencies」,那麼這也是光榮的。

E.g. bundledDependencies: ['foo', 'bar']

+12

'如果拼寫「bundleDependencies」,那麼這也是光榮的。偉大的文檔! –

+6

然而,不知何故,修復它只是讀「也很榮幸」感到難過。在緊張的情況下,如果我命令一個武士或騎士的援助,我一定會喜歡他捆綁兼容的武器和盔甲 - 並且要光榮。 –

+2

「我猜如果我們想確保我們的版本正確,即使我們引用的模塊被刪除」突然帶來很多重量:http://blog.npmjs.org/post/141577284765/kik-left- pad-and-npm – joews

回答

33

Node現在最大的問題之一就是它變化的速度有多快。這意味着生產系統可能非常脆弱,並且易於破壞。

使用bundledDependencies是一種解決此問題的方法,通過確保您正確地推測,無論別的什麼都可能會發生變化,您將始終提供正確的依賴關係。

您也可以使用它來捆綁您自己的私有捆綁包並在安裝時交付它們。

+0

它如何始終提供正確的依賴關係?這是否意味着'npm update'不會影響bundledDependencies中的任何依賴項? – Sawtaytoes

+1

是的,正確的。請注意,捆綁的依賴關係可能不是以任何基本方式「正確」的。他們正在捆綁SAID的人是正確的。 –

+0

你必須在開玩笑吧,這個答案毫無意義! LMAO,它被批准爲正確的一個:D – Andy

20

其他的好處是你可以把你的內部依賴關係(應用程序組件)放在那裏,然後在你的應用程序中需要它們,就好像它們是獨立模塊,而不是混淆你的lib /並將它們發佈到npm。

如果/當它們成熟到可以作爲獨立模塊生存時,您可以輕鬆將它們放在npm上,而無需修改代碼。

82

對於快速讀者:這個QA是關於package.json bundledDependencies場,有關package

什麼bundledDependencies做

「bundledDependencies」 是什麼顧名思義。應該在你的項目中的依賴關係。所以功能基本上與正常的依賴關係相同。當運行npm pack時,它們也將被打包。

當他們使用

普通的依賴通常是從故宮註冊表安裝。

  • 你想重新使用第三方庫,沒有來自NPM註冊表或修改
  • 要重新使用自己的項目爲:當 因此捆綁的依賴是非常有用模塊
  • 要一些文件與模塊

這種方式分發,您不必創建(和維護)自己NPM庫,但讓你從NPM包得到同樣的好處。

要使用捆綁的依賴

開發時,我不認爲主要的一點是,以防止意外的更新雖然。我們有更好的工具,即代碼倉庫(git,mercurial,svn ...)或現在鎖定文件。

要固定你的包的版本,你可以使用:

  • 選項1:使用較新的版本NPM 5自帶的節點8.使用package-lock.json文件(見node blog和節點8日發佈)

  • 選項2:使用yarn而不是npm。 它是來自Facebook的包管理器,比npm快,它使用yarn.lock文件。否則使用相同的package.json

這與在其他包管理等捆紮機 或貨物的lockfiles。它與npm的npm-shrinkwrap.json相似,但它不是有損的,它會產生可重現的結果。

npm實際上從yarn複製了該功能等等。

  • 選項3:這是以前推薦的方法,我不再推薦。這個想法大部分時間都是使用npm shrinkwrap,有時候把整個東西,包括node_module文件夾放到代碼庫中。或可能使用shrinkpack。當時的最佳做法在node.js blogjoyent developer網站上進行了討論。

看到這是問題的範圍之外了一點,但我想提的最後一種依賴關係(據我所知):peer dependencies。另請參閱此related SO question以及bundledDependencies上的文檔yarn

+4

這應該是被接受的答案! 「 – dolzenko

+6

」包括node_module文件夾「 - 這是一個非常奇怪的事情,它會污染你的回購與生成的代碼...尤其是當你使用本地模塊... – Oleksandr

+0

@Olexandr在這之間,並冒着一個軟件包打破你的應用程序的風險,我猜選擇很簡單。請注意,你可以放入一個單獨的分支(例如,如果使用git)。同意,這遠非理想的解決方案。 – nha

0

在操作上,我將bundledDependencies看作模塊的專用模塊存儲,其中依賴性更公開,可以在模塊及其依賴項(和子依賴項)之間解決。你的模塊可能依賴於舊版本的反應,但依賴需要最新和最好的版本。您的軟件包/安裝將導致您的固定版本爲node_modules/$yourmodule/node_modules/react,而您的依賴關係將在node_modules/react(或node_modules/$dependency/node_modules/react,如果他們傾向於)獲得版本。

一個告誡:我最近遇到了一個依賴項,它沒有正確配置它對依賴關係的反應,並且在bundledDependencies中做出反應,導致依賴模塊在運行時失敗。