NPM---Node 包管理器

npm(“Node 包管理器”)是 JavaScript 運行時 Node.js 的默認程序包管理器煌抒。[1]

npm 由兩個主要部分組成:

  • 用于發(fā)布和下載程序包的 CLI(命令行界面)工具
  • 托管 JavaScript 程序包的 在線存儲庫

為了更直觀地解釋囱怕,我們可以將存儲庫 npmjs.com 視為一個物流集散中心,該中心從賣方(npm 包裹的作者)那里接收貨物的包裹,并將這些貨物分發(fā)給買方(npm 包裹的用戶)瘫怜。

為了促進此過程扇售,npmjs.com 物流集散中心雇用了一群勤勞的袋熊(npm CLI),他們將被分配給每個 npmjs.com 用戶作為私人助理膝藕。 因此式廷,dependencies(依賴項)會如下傳遞給 JavaScript 開發(fā)人員:

image

發(fā)布 JS 軟件包的過程如下:

image

package.json

每個 JavaScript 項目(無論是 Node.js 還是瀏覽器應用程序)都可以被當作 npm 軟件包,并且通過 package.json 來描述項目和軟件包信息芭挽。

我們可以將 package.json 視為快遞盒子上的運輸信息滑废。

當運行 npm init 初始化 JavaScript/Node.js 項目時,將生成 package.json文件袜爪,文件內的內容(基本元數(shù)據(jù))由開發(fā)人員提供:

  • name:JavaScript 項目或庫的名稱蠕趁。
  • version:項目的版本。通常辛馆,在應用程序開發(fā)中俺陋,由于沒有必要對開源庫進行版本控制,因此經(jīng)常忽略這一塊昙篙。但是倔韭,仍可以用它來定義版本。
  • description:項目的描述瓢对。
  • license:項目的許可證寿酌。

npm scripts

package.json 還支持一個 scripts 屬性,可以把它當作在項目本地運行的命令行工具硕蛹。例如醇疼,一個 npm 項目的 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"
  }
}

eslintprettier法焰,ncc秧荆,jest 不是安裝為全局可執(zhí)行文件,而是安裝在項目本地的 node_modules/.bin/ 中埃仪。

最新引入的 npx 使我們可以像在全局安裝程序一樣運行這些 node_modules 項目作用域命令乙濒,方法是在其前面加上 npx ...(即npx prettier --write ** / *。ts)。

package-lock.json

該文件描述了 npm JavaScript 項目中使用的依賴項的確切版本颁股。如果 package.json 是通用的描述性標簽么库,則 package-lock.json 是成分表。

就像我們通常不會讀取食品包裝袋上的成分表(除非你太無聊或需要知道)一樣甘有,package-lock.json 并不會被開發(fā)人員一行一行進行讀取诉儒。

package-lock.json 通常是由 npm install 命令生成的,也可以由我們的 NPM CLI 工具讀取亏掀,以確保使用 npm ci 復制項目的構建環(huán)境忱反。

dependencies vs devDependencies

devDependencies 里面的插件只用于開發(fā)環(huán)境,不用于生產(chǎn)環(huán)境滤愕,而 dependencies 是需要發(fā)布到生產(chǎn)環(huán)境的温算。[2]

這兩個以鍵值對象的形式出現(xiàn),其中 npm 庫的名稱為鍵间影,其語義格式版本為值米者。 大家可以看看 Github 的 TypeScript 操作模板中的示例:

{
  "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 命令安裝。 它們分別用于生產(chǎn)和開發(fā)/測試環(huán)境宇智。 在下一節(jié)中蔓搞,我們將更深入地研究這些軟件包的安裝。

同時随橘,理解語義版本前面的符號非常重要(假設你已經(jīng)閱讀 semvermajor.minor.patch 模型):

  • ^:表示最新的次版本喂分,例如, ^1.0.4 可能會安裝主版本系列 1 的最新次版本 1.3.0机蔗。
  • ?:表示最新的補丁程序版本蒲祈,與 ^ 類似, ?1.0.4 可能會安裝次版本系列 1.0 的最新次版本1.0.7萝嘁。

所有這些確切的軟件包版本都將記錄在 package-lock.json 文件中梆掸。

npm install

這是現(xiàn)在我們開發(fā) JavaScript/Node.js 應用程序時最常用的命令。

默認情況下牙言,npm install <package-name> 將安裝帶有 ^ 版本號的軟件包的最新版本酸钦。npm 項目上下文中的 npm install 將根據(jù) package.json 規(guī)范將軟件包下載到項目的 node_modules 文件夾中,從而升級軟件包的版本(并重新生成 package-lock.json )咱枉。 npm install <package-name> 可以基于 ^? 版本匹配卑硫。

如果要在全局上下文中安裝程序包,可以在機器的任何地方使用它蚕断,則可以指定全局標志 -g(例如 live-server)欢伏。

npm i module_name  -S  = >  npm install module_name --save    寫入到 dependencies 對象

npm i module_name  -D  => npm install module_name --save-dev   寫入到 devDependencies 對象

npm i module_name  -g  全局安裝

參考文章


  1. 什么是 npm —— 寫給初學者的編程教程 ?

  2. npm -i 與npm install -s與-d的區(qū)別 ?

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市亿乳,隨后出現(xiàn)的幾起案子硝拧,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件障陶,死亡現(xiàn)場離奇詭異滋恬,居然都是意外死亡,警方通過查閱死者的電腦和手機咸这,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門夷恍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魔眨,“玉大人媳维,你說我怎么就攤上這事《舯” “怎么了侄刽?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長朋凉。 經(jīng)常有香客問我州丹,道長,這世上最難降的妖魔是什么杂彭? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任墓毒,我火速辦了婚禮,結果婚禮上亲怠,老公的妹妹穿的比我還像新娘所计。我一直安慰自己,他們只是感情好团秽,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布主胧。 她就那樣靜靜地躺著,像睡著了一般习勤。 火紅的嫁衣襯著肌膚如雪踪栋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天图毕,我揣著相機與錄音夷都,去河邊找鬼。 笑死予颤,一個胖子當著我的面吹牛损肛,可吹牛的內容都是我干的。 我是一名探鬼主播荣瑟,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼治拿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笆焰?” 一聲冷哼從身側響起劫谅,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捏检,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荞驴,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年贯城,在試婚紗的時候發(fā)現(xiàn)自己被綠了熊楼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡能犯,死狀恐怖鲫骗,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情踩晶,我是刑警寧澤执泰,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站渡蜻,受9級特大地震影響术吝,放射性物質發(fā)生泄漏。R本人自食惡果不足惜茸苇,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一排苍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧学密,春花似錦淘衙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至西壮,卻和暖如春遗增,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背款青。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工做修, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抡草。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓饰及,卻偏偏與公主長得像,于是被迫代替她去往敵國和親康震。 傳聞我的和親對象是個殘疾皇子燎含,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內容