摘要:做為項目的包管理工具,由于其與的緊密配合和出自一人之手,目前已經基本沒有競爭對手。依賴樹不同于很多語言的依賴管理,使用的是依賴樹。潛在的運行時沖突。希望以上的介紹能夠幫助你更好的理解的依賴管理。
npm做為Javascript項目的包管理工具,由于其與Node.js的緊密配合(npm和Node.js出自一人之手),目前已經基本沒有競爭對手。
包管理工具要解決的主要問題就是依賴包的安裝,在Javascript項目中,包的依賴關系是由package.json給出的,這篇文件將介紹package.json中描述的依賴信息。
依賴管理在package.json中,有如下幾項涉及到依賴包的描述:
dependencies
項目中使用到的包,但不包括測試所使用的包
devDependencies
主要是在測試時使用的包,也包括一些代碼編譯的包,比如將coffee-script編譯為javascript。也就是說在僅僅使用該項目的時候(而不進行測試等環節),不需要安裝的包可以放在devDependencies中
peerDependencies
如果改項目需要指明一些有協作關系的包的版本時,使用peerDependencies。這里使用了協作,而不是依賴,是我個人的理解。peerDependencies并不是必須安裝的包,但如果一旦要安裝,就要符合要求。比如react-dom的package.json中有如下的描述:
"peerDependencies": { "react": "^15.6.1" },
peerDependencies至少打消了一些顧慮,比如react生態中用到的一些包在升級的時候會不會不匹配?
optionalDependencies
如果有一些依賴包即使安裝失敗,項目仍然能夠運行或者希望npm繼續運行,就可以使用optionalDependencies。另外optionalDependencies會覆蓋dependencies中的同名依賴包,所以不要在兩個地方都寫。
bundledDependencies/bundleDependencies
如果在打包發布的使用希望一些依賴包也出現在最終的包里,那么可以將包的名字放在bundledDependencies,bundledDependencies的值是一個字符串數組,如:
"name": "awesome-web-framework", "version": "1.0.0", "bundledDependencies": [ "renderized", "super-streams" ]
npm pack會將renderized 和super-streams放入生成的包awesome-web-framework-1.0.0.tgz中,并且在npm install awesome-web-framework-1.0.0.tgz時,renderized 和super-streams也會被一同安裝。
這些項的內容形式都是一樣的(除了bundledDependencies),只是作用不同,如:
"dependencies": { "base62": "~0.1.1", "commoner": "~0.7.0", "esprima": "https://github.com/facebook/esprima/tarball/ca28795124d45968e62a7b4b336d23a053ac3a84", "recast": "~0.4.8", "source-map": "~0.1.22" }
key就是項目的名詞,而value可以有多種形式
version,遵循semver
一個tarball的url
一個git url
本地路徑
關于semver會在另一篇文章中介紹(先挖個坑)。
依賴樹不同于很多語言的依賴管理,npm使用的是依賴樹。也就是說每個依賴包會有一套自己指定的(在package.json中說明的)依賴包,而不會和其他包共享。
例如,mod-a依賴mod-b@1.0.0,mod-c依賴mod-b@2.0.0,而現在有一個項目依賴mod-a和mod-c,那么最終安裝的依賴包如下:
├─┬ node_modules │ ├─┬ mod-a │ │ ├── mod-b@1.0.0 │ ├─┬ mod-c │ │ ├── mod-b@2.0.0
而Node.js在加載依賴包的時候會處理這個問題。之所以文章最開始說npm和Node.js的緊密合作也是這個原因。
使用依賴樹來管理包帶來了一個明顯的好處,不用處理依賴沖突的問題。這個問題在早期的Java項目中比較常見,而在使用了Maven和Gradle之后,情況有所緩解,但只能減輕同一個包多個版本被放入發布的包中這種情況,仍然無法解決依賴沖突這個根本問題。
依賴樹也有一些缺點:
代碼量增加。由于不能共享相同的包(在npm v3中,嘗試著共享相同版本的庫,但還是比較弱),導致最終打包的時候有同一個庫的多個版本的代碼出現在最終包中。
潛在的運行時沖突。以上面的例子為例,可能有些時候,mod-b的兩個版本無法同時運行,而這只有在運行或者測試的時候才能被發現。
希望以上的介紹能夠幫助你更好的理解npm的依賴管理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83668.html
摘要:例子修飾類自定義參數值此例和上面功能基本一致,唯一差別在于值是參考修飾函數傳過來的例子修飾方法修飾函數,對方法進行只讀操作嘗試修改函數,在控制臺會報錯上例中,我們對類中的方法使用修飾器進行修飾,使得方法不能被修改。 什么是修飾器 修飾器(Decorator)是ES7的一個提案,它的出現能解決兩個問題: 不同類間共享方法 編譯期對類和方法的行為進行改變 用法也很簡單,就是在類或方法...
摘要:第三篇腳手架依賴的核心庫的源碼解析。這三篇文章都是我在日常學習中總結出來的,文章中涉及到的所有代碼可以從我的上找到。 react作為當前十分流行的前端框架,相信很多前端er都有蠢蠢欲動的學習它的想法。工欲善其事,必先利其器。這篇文章就簡單的給大家介紹一下如何我快速的搭建一個react前端開發環境。主要針對于react小白,大神不喜勿噴。從標題可以看出,這里不會僅僅只介紹一下react的...
摘要:就是一個類似于的包管理工具,它是由推出并開源。二的安裝用法和基本工作流安裝以為例你可以通過包管理工具安裝。在使用一個包之前,你需要執行以下命令將其加入依賴項列表會被加入到文件中的依賴列表,同時也會被更新。 一、yarn的背景和介紹一直以來,我們在安裝和管理依賴的時候基本上都會使用npm,npm是一個非常優秀全面且廣受歡迎的包管理工具,它奠定了前端模塊化開發的基石,為前端的發展做出了不可...
摘要:內容結構是中列出的每個依賴項的大型列表,應安裝的特定版本,模塊的位置,驗證模塊完整性的哈希,它需要的包列表,以及依賴項列表。期望與真實行為之間的這種沖突在中引發了一個非常有趣的問題線索。此更改是作為的一部分發布的,該版本于年月日上線。 showImg(https://segmentfault.com/img/bVbkuXN?w=1440&h=1080); 想閱讀更多優質文章請猛戳Git...
閱讀 771·2023-04-25 20:47
閱讀 2534·2019-08-30 15:53
閱讀 947·2019-08-26 14:05
閱讀 894·2019-08-26 11:59
閱讀 1678·2019-08-26 11:43
閱讀 1679·2019-08-26 10:57
閱讀 1355·2019-08-23 18:23
閱讀 2639·2019-08-23 12:57