webpack
的前端,是一個初級前端推薦兩篇文章前端
javeScript
編寫中,咱們儘可能不要定義全局變量,封裝函數儘可能不要有反作用,由於所有變量的查詢時間會比局部變量的查詢慢,更是考慮在Node的環境中沒法被垃圾回收的問題npm
是 Node.js
可以如此成功的主要緣由之一。npm
團隊作了不少的工做,以確保 npm 保持向後兼容,並在不一樣的環境中保持一致。npm 2
會安裝每個包所依賴的全部依賴項。若是咱們有這麼一個項目,它依賴項目A,項目A依賴項目B,項目B依賴項目C,那麼依賴樹將以下所示:
npm 3
採用了扁平依賴關係樹來解決這個問題,因此咱們的3個項目結構如今看起來以下所示:存了已經下載的每一個版本的壓縮包。本地緩存的內容能夠經過npm cache ls命令進行查看。本地緩存的設計有助於減小安裝時間。
node
./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
。npm
必須首先遍歷全部的項目依賴關係,而後再決定如何生成扁平的node_modules目錄結構。npm必須爲全部使用到的模塊構建一個完整的依賴關係樹,這是一個耗時的操做,是npm安裝速度慢的一個很重要的緣由。npm install
命令時,NPM
都得從互聯網上下載全部內容。npm
是有本地緩存的,它保存了已經下載的每一個版本的壓縮包。本地緩存的內容能夠經過npm cache ls
命令進行查看。本地緩存的設計有助於減小安裝時間。cnpm
跟npm
用法徹底一致,只是在執行命令時將npm
改成cnpm
。npm
安裝插件是從國外服務器下載,受網絡影響大,可能出現異常,若是npm的服務器在中國就行了,因而淘寶團隊幹了這事。來自官網:「這是一個完整 npmjs.org
鏡像,你能夠用此代替官方版本(只讀),同步頻率目前爲 10分鐘 一次以保證儘可能與官方服務同步。」http://npm.taobao.org
npm install -g cnpm --registry=https://registry.npm.taobao.org
Yarn
一開始的主要目標是解決上一節中描述的因爲語義版本控制而致使的npm安裝的不肯定性問題。雖然可使用npm shrinkwrap
來實現可預測的依賴關係樹,但它並非默認選項,而是取決於全部的開發人員知道而且啓用這個選項。Yarn
採起了不一樣的作法。每一個yarn安裝都會生成一個相似於npm-shrinkwrap.json的yarn.lock文件,並且它是默認建立的。除了常規信息以外,yarn.lock
文件還包含要安裝的內容的校驗和,以確保使用的庫的版本相同。與npm不一樣的是,yarn無需互聯網鏈接就能安裝本地緩存的依賴項,它提供了離線模式
。npm
丟包過,代價很是大,淚水不自覺掉下來)
首先看一次很是失敗的包下載 居然是從全局讀取的資源(不配置
webpack
別名是由於就這一個路徑這麼長)
首先咱們從原理入手 ,咱們使用npm init
,yarn init
,cnpm init
的時候 發生了什麼 ?
package.json
文件json
文件內部聲明初始的版本信息、做者信息等,若是你是須要上傳到npm上做爲命令行工具,應該配置bin
等聲明入口字段那麼當咱們使用npm i
,yarn add
,cnpm i
操做時候會發生什麼 ?
-g
或者global
判斷,下載的包是放在全局的環境,仍是當前package.json
文件對應的node_module
文件夾目錄下(這點尤爲重要,有人出BUG,就是由於在用npm
, cnpm
時候沒有註明添加的是全局依賴仍是本地依賴,致使json
文件上沒有對應的包名,項目永遠起不來)--save
或者-D
、--save -dev
判斷是開發依賴仍是線上依賴,其實這點在yarn
上沒有問題,由於yarn
有本身的一套檢查包完整性的機制,不會丟包,還會自動判斷添加依賴,出bug
通常是cnpm
和npm
,沒有明確-g
或者--save
,npm
只有檢查程序員簽名的機制,沒有檢查包完整性的機制,也不會自動添加依賴到json
文件,那麼就會出現丟包的假象,因此建議主要使用yarn
yarn
和npm
對比
npm
的缺點彙總:"5.0.3", "~5.0.3", "^5.0.3"
bug
。npm
打印的警告中丟失掉,而且你甚至永遠不會注意到實際發生的錯誤。yarn
的優勢npm
仍是 Yarn
在執行包的安裝時,都會執行一系列任務。npm
是按照隊列執行每一個 package
,也就是說必需要等到當前 package
安裝完成以後,才能繼續後面的安裝。而 Yarn
是並行執行全部任務,提升了性能。離線模式:若是以前已經安裝過一個軟件包,用Yarn再次安裝時之間從緩存中獲取,就不用像npm那樣再從網絡下載了
。webpack
Yarn
有一個鎖定文件 (lock file)
記錄了被確切安裝上的模塊的版本號。每次只要新增了一個模塊,Yarn
就會建立(或更新)yarn.lock 這個文件。這麼作就保證了,每一次拉取同一個項目依賴時,使用的都是同樣的模塊版本。npm 其實也有辦法實現到處使用相同版本的 packages,但須要開發者執行 npm shrinkwrap
命令。這個命令將會生成一個鎖定文件,在執行 npm install
的時候,該鎖定文件會先被讀取,和 Yarn 讀取 yarn.lock 文件一個道理。npm
和 Yarn
二者的不一樣之處在於,Yarn
默認會生成這樣的鎖定文件,而 npm 要經過 shrinkwrap
命令生成 npm-shrinkwrap.json
文件,只有當這個文件存在的時候,packages
版本信息纔會被記錄和更新。npm
的輸出信息比較冗長。在執行 npm install <package>
的時候,命令行裏會不斷地打印出全部被安裝上的依賴。相比之下,Yarn 簡潔太多:默認狀況下,結合了 emoji
直觀且直接地打印出必要的信息,也提供了一些命令供開發者查詢額外的安裝信息。yarn
改變了一些npm
命令的名稱,好比 yarn add/remove,
感受上比 npm
本來的 install/uninstall
要更清晰。那不是標題黨? 說了yarn
這麼多優勢,咱們爲何還要npm
呢?
npm publish
,你怎麼上傳包到npm
? 你不用cnpm
,是下載不了一些包的搞清楚三者下載包(依賴)的本質結果:
node_module
文件夾下面下載包(若是你非要下到全局,那麼再見)json
文件中添加對應的依賴字段,肯定是線上依賴仍是開發依賴使用yarn
下載過的包,再使用npm cnpm
下載 會重複下載,刪除以前的包
puppeteer
這個包所依賴的mini
版谷歌瀏覽器使用cnpm
下載就能夠完美解決prerender-spa-plugin
這個包依賴上面的木偶戲 puppeteer
這個包,也能夠用cnpm
下載npm cnpm
下載依賴,必定要添加註明是什麼依賴,是否全局安裝yarn
和npm i
二者,選擇前者,緣由在上面有提到,整體來講,yarn
是不二選擇,可是其餘二者也不可缺乏,好比electron
這個依賴,使用cnpm
就能夠完美一鍵安裝只要膽大心細,就能夠把三者用得如魚得水,否則就會被按在地上摩擦,實踐過程踩坑也是正常 以爲寫得好別忘了關注個人專欄,給個贊再走~