NPM學習筆記
NPM 是什麼
npm(“Node 包管理器”)是 JavaScript 運作時 Node.js 的預設程式包管理器。
npm 由兩個主要部分組成:
- 用于釋出和下載下傳程式包的 CLI(指令行界面)工具
- 托管 JavaScript 程式包的線上存儲庫
package.json
每個 JavaScript 項目(無論是 Node.js 還是浏覽器應用程式)都可以被當作 npm 軟體包,并且通過
package.json
來描述項目和軟體包資訊。
當運作
npm init
初始化 JavaScript/Node.js 項目時,将生成
package.json
檔案,檔案内的内容(基本中繼資料)由開發人員提供:
-
:JavaScript 項目或庫的名稱。name
-
:項目的版本。通常,在應用程式開發中,由于沒有必要對開源庫進行版本控制,是以經常忽略這一塊。但是,仍可以用它來定義版本。version
-
:項目的描述。description
-
:項目的許可證。license
npm scripts
package.json
還支援一個
scripts
屬性,可以把它當作在項目本地運作的指令行工具。
{
"scripts": {
"build": "tsc",
"format": "prettier --write **/*.ts",
"format-check": "prettier --check **/*.ts",
"lint": "eslint src/**/*.ts",
"pack": "ncc build",
"test": "jest",
"all": "npm run build && npm run format && npm run lint && npm run pack && npm test"
}
}
eslint
,
prettier
,
ncc
,
jest
不是安裝為全局可執行檔案,而是安裝在項目本地的
node_modules/.bin/
中
dependencies vs devDependencies
這兩個以鍵值對象的形式出現,其中 npm 庫的名稱為鍵,其語義格式版本為值。
{
"dependencies": {
"@actions/core": "^1.2.3",
"@actions/github": "^2.1.1"
},
"devDependencies": {
"@types/jest": "^25.1.4",
"@types/node": "^13.9.0",
"@typescript-eslint/parser": "^2.22.0",
"@zeit/ncc": "^0.21.1",
"eslint": "^6.8.0",
"eslint-plugin-github": "^3.4.1",
"eslint-plugin-jest": "^23.8.2",
"jest": "^25.1.0",
"jest-circus": "^25.1.0",
"js-yaml": "^3.13.1",
"prettier": "^1.19.1",
"ts-jest": "^25.2.1",
"typescript": "^3.8.3"
}
}
這些依賴通過帶有
--save
或
--save-dev
标志的
npm install
指令安裝。 它們分别用于生産和開發/測試環境。
-
:表示最新的次版本,例如,^
可能會安裝主版本系列^1.0.4
的最新次版本1
。1.3.0
-
:表示最新的更新檔程式版本,與〜
類似,^
可能會安裝次版本系列〜1.0.4
的最新次版本1.0
。1.0.7
- 以上版本方法都是major.minor.patch 模型
major.minor.patch這三部分分别表示的含義。
1、major
major表示目前MyBatis的主版本号,它的變化通常意味着MyBatis的巨大的變化,MyBatis的前世是ibatis,是在3.0版本釋出之後才更名的,之前一直叫ibatis。
2、minor
minor稱之為MyBatis的次版本号,它通常隻反映了一些較大的更改,比如MyBatis的API的增加等等,但是這些更改并不影響與舊版本源代碼和二進制代碼之間的相容性。
3、patch
patch通常稱之為更新檔版本,通常情況下如果隻是對MyBatis内部函數的修改而不影響API接口的話都會導緻patch的變化。
package-lock.json
該檔案描述了 npm JavaScript 項目中使用的依賴項的确切版本。如果
package.json
是通用的描述性标簽,則
package-lock.json
是成分表。
npm install
這是現在我們開發 JavaScript/Node.js 應用程式時最常用的指令。
預設情況下,
npm install <package-name>
将安裝帶有
^
版本号的軟體包的最新版本。npm 項目上下文中的
npm install
将根據
package.json
規範将軟體包下載下傳到項目的
node_modules
檔案夾中,進而更新軟體包的版本(并重新生成
package-lock.json
)。
npm install <package-name>
可以基于
^
和
〜
版本比對
安裝不同版本
install 指令總是安裝子產品的最新版本,如果要安裝子產品的特定版本,可以在子產品名後面加上@和版本号。
npm init 初始化 package.json 檔案
用來初始化生成
package.json
檔案。在這個過程中會向使用者提問一系列問題,如果你覺得不用修改預設配置,一路回車就可以了。
如果使用了
-f
(代表
force
)、
-y
(代表
yes
),則跳過提問階段,直接生成一個新的
package.json
檔案。
避免系統權限
預設情況下,
Npm
全局子產品都安裝在系統目錄(比如
/usr/local/lib/
),普通使用者沒有寫入權限,需要用到
sudo
指令。這不是很友善,我們可以在沒有
root
權限的情況下,安裝全局子產品。
首先,在主目錄下建立配置檔案
.npmrc
,然後在該檔案中将
prefix
變量定義到主目錄下面。
prefix = /home/yourUsername/npm
然後在主目錄下建立
npm
子目錄
$ mkdir ~/npm
此後,全局安裝的子產品都會安裝在這個子目錄中,
npm
也會到
~/npm/bin
目錄去尋找指令。
最後,将這個路徑在
.bash_profile
檔案(或
.bashrc
檔案)中加入
PATH
變量。
export PATH=~/npm/bin:$PATH
npm uninstall
npm uninstall指令,解除安裝已安裝的子產品
$ npm uninstall [package name]
# 解除安裝全局子產品
$ npm uninstall [package name] -global
npm run
npm 不僅可以用于子產品管理,還可以用于執行腳本。package.json 檔案有一個 scripts 字段,可以用于指定腳本指令,供npm直接調用。
npm run 指令會自動在環境變量 $PATH 添加 node_modules/.bin 目錄,是以 scripts 字段裡面調用指令時不用加上路徑,這就避免了全局安裝 NPM 子產品。
npm run 如果不加任何參數,直接運作,會列出 package.json 裡面所有可以執行的腳本指令。
yarn
初始化一個新項目
yarn init
添加依賴包
yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]
将依賴項添加到不同依賴項類别中
分别添加到
devDependencies
、
peerDependencies
和
optionalDependencies
類别中:
yarn add [package] --dev
yarn add [package] --peer
yarn add [package] --optional
更新依賴包
yarn upgrade [package]
yarn upgrade [package]@[version]
yarn upgrade [package]@[tag]
移除依賴包
yarn remove [package]
安裝項目的全部依賴
yarn
或者
yarn install
Yarn和npm指令對比
npm | yarn |
npm install | yarn |
npm install react --save | yarn add react |
npm uninstall react --save | yarn remove react |
npm install react --save-dev | yarn add react --dev |
npm update --save |