自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

前端核心工具:yrn、npm、cnpm三者如何優(yōu)雅的在一起使用 ?

開發(fā) 開發(fā)工具
在 JavaScript 編寫中,我們盡量不要定義全局變量,封裝函數(shù)盡量不要有副作用,因?yàn)槿孔兞康牟樵儠r(shí)間會比局部變量的查詢慢,更是考慮在Node的環(huán)境中無法被垃圾回收的問題

 一位用不好包管理器的前端,是一個入門級前端,一個用不好 webpack 的前端,是一個初級前端

[[267421]]

三個包管理器是可以一起用的,只要你夠膽大心細(xì),就沒任何問題!

在 JavaScript 編寫中,我們盡量不要定義全局變量,封裝函數(shù)盡量不要有副作用,因?yàn)槿孔兞康牟樵儠r(shí)間會比局部變量的查詢慢,更是考慮在Node的環(huán)境中無法被垃圾回收的問題

老規(guī)矩 先看原理

npm

  • npm 是Node.js 能夠如此成功的主要原因之一。npm 團(tuán)隊(duì)做了很多的工作,以確保 npm 保持向后兼容,并在不同的環(huán)境中保持一致。
  • npm是圍繞著 語義版本控制(semver)的思想而設(shè)計(jì)。
  • 給定一個版本號:主版本號.次版本號.補(bǔ)丁版本號, 以下這三種情況需要增加相應(yīng)的版本號:
  • 主版本號: 當(dāng)API發(fā)生改變,并與之前的版本不兼容的時(shí)候
  • 次版本號: 當(dāng)增加了功能,但是向后兼容的時(shí)候
  • 補(bǔ)丁版本號:當(dāng)做了向后兼容的缺陷修復(fù)的時(shí)候
  • npm 2 會安裝每一個包所依賴的所有依賴項(xiàng)。如果我們有這么一個項(xiàng)目,它依賴項(xiàng)目A,項(xiàng)目A依賴項(xiàng)目B,項(xiàng)目B依賴項(xiàng)目C,那么依賴樹將如下所示:

 

  • 這個結(jié)構(gòu)可能會很長。這對于基于Unix的操作系統(tǒng)來說只不過是一個小煩惱,但對于Windows來說卻是個破壞性的東西,因?yàn)橛泻芏喑绦驘o法處理超過260個字符的文件路徑名。
  • npm 3采用了扁平依賴關(guān)系樹來解決這個問題,所以我們的3個項(xiàng)目結(jié)構(gòu)現(xiàn)在看起來如下所示:

存了已經(jīng)下載的每個版本的壓縮包。本地緩存的內(nèi)容可以通過npm cache ls命令進(jìn)行查看。本地緩存的設(shè)計(jì)有助于減少安裝時(shí)間。

 

  • 這樣,一個原來很長的文件路徑名就從./node_modules/package-A/node_modules/package-B/node-modules/some-file-name-in-package-c.js變成了/node_modules/some-file-name-in-package-c.js。
  • 這種方法的缺點(diǎn)是,npm必須首先遍歷所有的項(xiàng)目依賴關(guān)系,然后再決定如何生成扁平的node_modules目錄結(jié)構(gòu)。npm必須為所有使用到的模塊構(gòu)建一個完整的依賴關(guān)系樹,這是一個耗時(shí)的操作,是npm安裝速度慢的一個很重要的原因。
  • 想當(dāng)然的以為每次運(yùn)行npm install命令時(shí),NPM都得從互聯(lián)網(wǎng)上下載所有內(nèi)容。
  • 但是,npm是有本地緩存的,它保存了已經(jīng)下載的每個版本的壓縮包。本地緩存的內(nèi)容可以通過npm cache ls命令進(jìn)行查看。本地緩存的設(shè)計(jì)有助于減少安裝時(shí)間。

cnpm

  • cnpm跟npm用法完全一致,只是在執(zhí)行命令時(shí)將npm改為cnpm。
  • npm安裝插件是從國外服務(wù)器下載,受網(wǎng)絡(luò)影響大,可能出現(xiàn)異常,如果npm的服務(wù)器在中國就好了,于是淘寶團(tuán)隊(duì)干了這事。來自官網(wǎng):“這是一個完整 npmjs.org鏡像,你可以用此代替官方版本(只讀),同步頻率目前為 10分鐘 一次以保證盡量與官方服務(wù)同步。”
  • 官方地址:http://npm.taobao.org
  • 安裝:npm install -g cnpm --registry=https://registry.npm.taobao.org

Yarn

  • Yarn一開始的主要目標(biāo)是解決上一節(jié)中描述的由于語義版本控制而導(dǎo)致的npm安裝的不確定性問題。雖然可以使用npm shrinkwrap來實(shí)現(xiàn)可預(yù)測的依賴關(guān)系樹,但它并不是默認(rèn)選項(xiàng),而是取決于所有的開發(fā)人員知道并且啟用這個選項(xiàng)。
  • Yarn采取了不同的做法。每個yarn安裝都會生成一個類似于npm-shrinkwrap.json的yarn.lock文件,而且它是默認(rèn)創(chuàng)建的。除了常規(guī)信息之外,yarn.lock文件還包含要安裝的內(nèi)容的校驗(yàn)和,以確保使用的庫的版本相同。
  • yarn是經(jīng)過重新設(shè)計(jì)的嶄新的npm客戶端,它能讓開發(fā)人員并行處理所有必須的操作,并添加了一些其他改進(jìn)。
  • 運(yùn)行速度得到了顯著的提升,整個安裝時(shí)間也變得更少
  • 像npm一樣,yarn使用本地緩存。`與npm不同的是,yarn無需互聯(lián)網(wǎng)連接就能安裝本地緩存的依賴項(xiàng),它提供了離線模式`。
  • 允許合并項(xiàng)目中使用到的所有的包的許可證
  • 通常情況下不建議通過npm進(jìn)行安裝。npm安裝是非確定性的,程序包沒有簽名,并且npm除了做了基本的SHA1哈希之外不執(zhí)行任何完整性檢查,這給安裝系統(tǒng)程序帶來了安全風(fēng)險(xiǎn)。(作者曾經(jīng)在一個上百個依賴包的項(xiàng)目中使用npm丟***,代價(jià)非常大,淚水不自覺掉下來)

首先看一次非常失敗的包下載 竟然是從全局讀取的資源(不配置webpack別名是因?yàn)榫瓦@一個路徑這么長)

首先我們從原理入手 ,我們使用npm init,yarn init,cnpm init 的時(shí)候 發(fā)生了什么 ?

  • 生成package.json文件
  • json文件內(nèi)部聲明初始的版本信息、作者信息等,如果你是需要上傳到npm上作為命令行工具,應(yīng)該配置bin等聲明入口字段

那么當(dāng)我們使用npm i, yarn add,cnpm i操作時(shí)候會發(fā)生什么 ?

  • 首先會根據(jù)你的命令行后綴是否加了 -g或者global判斷,下載的包是放在全局的環(huán)境,還是當(dāng)前package.json文件對應(yīng)的node_module文件夾目錄下(這點(diǎn)尤其重要,有人出BUG,就是因?yàn)樵谟胣pm, cnpm時(shí)候沒有注明添加的是全局依賴還是本地依賴,導(dǎo)致json文件上沒有對應(yīng)的包名,項(xiàng)目永遠(yuǎn)起不來)
  • 然后根據(jù)你的指令--save或者-D、--save -dev判斷是開發(fā)依賴還是線上依賴,其實(shí)這點(diǎn)在yarn上沒有問題,因?yàn)閥arn有自己的一套檢查包完整性的機(jī)制,不會丟包,還會自動判斷添加依賴,出bug一般是cnpm和npm,沒有明確-g或者--save,npm只有檢查程序員簽名的機(jī)制,沒有檢查包完整性的機(jī)制,也不會自動添加依賴到j(luò)son文件,那么就會出現(xiàn)丟包的假象,所以建議主要使用 yarn

yarn 和 npm 對比

 

  • npm 的缺點(diǎn)匯總:同一個項(xiàng)目,安裝的時(shí)候無法保持一致性。由于package.json文件中版本號的特點(diǎn),下面三個版本號在安裝的時(shí)候代表不同的含義。
  1. "5.0.3"
  2.    "~5.0.3"
  3.    "^5.0.3" 
  • “5.0.3”表示安裝指定的5.0.3版本,“~5.0.3”表示安裝5.0.X中***的版本,“^5.0.3”表示安裝5.X.X中***的版本。這就麻煩了,常常會出現(xiàn)同一個項(xiàng)目,有的同事是OK的,有的同事會由于安裝的版本不一致出現(xiàn)bug。
  • 安裝的時(shí)候,包會在同一時(shí)間下載和安裝,中途某個時(shí)候,一個包拋出了一個錯誤,但是npm會繼續(xù)下載和安裝包。因?yàn)閚pm會把所有的日志輸出到終端,有關(guān)錯誤包的錯誤信息就會在一大堆npm打印的警告中丟失掉,并且你甚至永遠(yuǎn)不會注意到實(shí)際發(fā)生的錯誤。

yarn 的優(yōu)點(diǎn)

  • 速度快 。速度快主要來自以下兩個方面:
  • 并行安裝:無論 npm 還是Yarn在執(zhí)行包的安裝時(shí),都會執(zhí)行一系列任務(wù)。npm是按照隊(duì)列執(zhí)行每個package,也就是說必須要等到當(dāng)前package安裝完成之后,才能繼續(xù)后面的安裝。而 Yarn 是并行執(zhí)行所有任務(wù),提高了性能。

離線模式:如果之前已經(jīng)安裝過一個軟件包,用Yarn再次安裝時(shí)之間從緩存中獲取,就不用像npm那樣再從網(wǎng)絡(luò)下載了。

  • 安裝版本統(tǒng)一:為了防止拉取到不同的版本,Yarn 有一個鎖定文件 (lock file)記錄了被確切安裝上的模塊的版本號。每次只要新增了一個模塊,Yarn 就會創(chuàng)建(或更新)yarn.lock 這個文件。這么做就保證了,每一次拉取同一個項(xiàng)目依賴時(shí),使用的都是一樣的模塊版本。npm 其實(shí)也有辦法實(shí)現(xiàn)處處使用相同版本的 packages,但需要開發(fā)者執(zhí)行 npm shrinkwrap命令。這個命令將會生成一個鎖定文件,在執(zhí)行 npm install的時(shí)候,該鎖定文件會先被讀取,和 Yarn 讀取 yarn.lock 文件一個道理。npm 和 Yarn 兩者的不同之處在于,Yarn 默認(rèn)會生成這樣的鎖定文件,而 npm 要通過 shrinkwrap 命令生成 npm-shrinkwrap.json 文件,只有當(dāng)這個文件存在的時(shí)候,packages版本信息才會被記錄和更新。
  • 更簡潔的輸出:npm的輸出信息比較冗長。在執(zhí)行npm install 的時(shí)候,命令行里會不斷地打印出所有被安裝上的依賴。相比之下,Yarn 簡潔太多:默認(rèn)情況下,結(jié)合了emoji直觀且直接地打印出必要的信息,也提供了一些命令供開發(fā)者查詢額外的安裝信息。
  • 多注冊來源處理:所有的依賴包,不管他被不同的庫間接關(guān)聯(lián)引用多少次,安裝這個包時(shí),只會從一個注冊來源去裝,要么是 npm 要么是 bower, 防止出現(xiàn)混亂不一致。
  • 更好的語義化: yarn改變了一些npm命令的名稱,比如 yarn add/remove,感覺上比npm原本的 install/uninstall 要更清晰。

那不是標(biāo)題黨? 說了yarn這么多優(yōu)點(diǎn),我們?yōu)槭裁催€要npm呢?

你不用npm publish ,你怎么上傳包到npm? 你不用cnpm,是下載不了一些包的

搞清楚三者下載包(依賴)的本質(zhì)結(jié)果:

  • 首先向?qū)?yīng)的node_module文件夾下面下載包(如果你非要下到全局,那么再見)
  • 再然后是json文件中添加對應(yīng)的依賴字段,確定是線上依賴還是開發(fā)依賴
  • 只要做到這兩者 你就下包成功
  • 總結(jié)就是 只要結(jié)果 過程管你是啥

使用yarn下載過的包,再使用npm cnpm下載 會重復(fù)下載,刪除之前的包

  • puppeteer這個包所依賴的mini版谷歌瀏覽器使用cnpm下載就可以***解決
  • prerender-spa-plugin這個包依賴上面的木偶戲 puppeteer這個包,也可以用cnpm下載
  • 混合使用包管理器切記,不要重復(fù)下載依賴,npm cnpm下載依賴,一定要添加注明是什么依賴,是否全局安裝
  • yarn和npm i兩者,選擇前者,原因在上面有提到,總體來說,yarn是不二選擇,但是其他兩者也不可缺少,比如electron這個依賴,使用cnpm就可以***一鍵安裝

References

  • [1] 手寫優(yōu)化版React腳手架: https://segmentfault.com/a/1190000019126657
  • [2] 手寫Vue的腳手架: https://segmentfault.com/a/1190000019207033
  • [3] 前端性能優(yōu)化不完全手冊: https://segmentfault.com/a/1190000018827395
責(zé)任編輯:武曉燕 來源: Segmentfault
相關(guān)推薦

2009-11-06 08:57:31

WCF開發(fā)

2018-02-01 21:18:40

戴爾

2015-10-20 16:48:06

AnsibleDocker可擴(kuò)展設(shè)計(jì)

2016-08-12 09:49:06

Intel

2013-08-06 09:49:01

2023-03-30 16:23:09

人工智能AI

2013-05-31 09:03:47

SkypeLync集成

2011-01-20 11:42:49

同事

2019-01-03 13:58:53

人工智能大數(shù)據(jù)數(shù)據(jù)分析

2020-09-16 11:20:40

PythonBashLinux

2015-03-05 10:27:56

蘋果IBM

2017-06-28 16:58:14

華為 開發(fā)者

2020-12-22 06:02:48

JS聚合聊天

2017-08-17 10:38:05

2017華為開發(fā)者大賽直播

2015-10-21 16:57:14

聽云

2023-11-30 07:40:05

URLCMS

2021-03-15 10:26:29

邊緣計(jì)算云計(jì)算混合云

2022-10-28 07:27:17

Netty異步Future

2015-02-09 19:49:19

暢捷通

2015-04-22 17:22:05

eBay京東
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號