npm 是 Node.js 的包管理工具,Node.js package manger,包就是別人寫的 Node.js 模塊。我們通過 npm,可以方便的使用第三方開發的開源模塊,同時也可以把自己的模塊發布到 npm 供其它開發者使用。
在初始化 Node.js 項目的時候我們需要通過 npm init 命令,把自己的代碼初始化成為 npm 包,這樣我們才能更加方便地去使用別人的 npm 包。
npm 通過 Node.js 模塊根目錄的?package.json?文件獲取模塊元數據和依賴關系等。
yarn 是由 Facebook、Google、Exponent 和 Tilde 為了解決當時 npm 的一些缺陷而新推出的包管理工具。當時 npm 有以下問題:
1.速度慢:npm 按照隊列執行安裝每個 package,只有當前 package 安裝完成之后,才會進行后面的安裝。
2.同一個項目,npm 安裝的時候無法保持一致性,由于 package.json 文件中版本號的特點,下面三個版本號在安裝的時候代表不同的含義:
"5.0.3",? //安裝指定的5.0.3版本
"~5.0.3", //安裝5.0.X中的最新版本
"^5.0.3"? //安裝5.X.X中的最新版本
3.npm 安裝的時候,一個包拋出錯誤,npm 會繼續下載安裝包,而且因為 npm 會把所有的日志輸出到終端,有關錯誤包的錯誤信息就會淹沒在 npm 打印的警告中,你甚至不會發現錯誤的產生。
不過現在兩個差異不大,可根據喜好選擇。
Yarn 和 npm 命令對比:
npm install (npm i)? ? ? ? === yarn
npm install xxx? ? ? ? ? ? === yarn add xxx
npm uninstall xxx? ? ? ? ? === yarn remove xxx
npm install xxx --dev? ? ? === yarn add xxx --dev
npm install xxx --global? ? === yarn global add xxx
npm update? ? ? ? ? ? ? ? ? === yarn upgrade
全局安裝與本地安裝
全局安裝:全局安裝的包提供可以直接執行的命令。比如全局安裝 http-server:
yarn global add http-server
之后便可以全局使用 http-server 命令:
原理:全局安裝的 http-server 會將其 package.json 中的 bin 命令注入全局環境,使其可以全局執行
本地安裝:
一個包通常會在不同的項目上重復用到,如果只是全局安裝,那么當某個項目需要更新包的版本的時候,可能會影響其他項目。因此我們需要本地安裝,來避免全局安裝產生的包污染問題。
本地安裝有兩種方式:
yarn add xxx
yarn add xxx --dev
前者安裝項目本身需要用到的依賴,參與上線打包,存儲在 package.json 文件中的 "dependencies" 配置下;
后者安裝項目僅在本地開發使用到的依賴,不參與上線打包,存儲在 package.json 文件中的 "devDependencies" 配置下。(如 @types/node,以獲取 node.js 更加友好的代碼提示)
語義化版本號
x.y.z
z:修復 bug
y:增加新特性,保證兼容
x:大版本更新,不保證兼容
什么是 npx?
在創建 React 應用的時候,官網給出的命令是:
npxcreate-react-appmy-app
其中 npx 可以讓你在沒有全局安裝 create-react-app 這個包的情況下使用 create-react-app 命令。