目錄
安裝&查詢指令
首頁 web前端 js教程 NPM機制深入理解

NPM機制深入理解

Mar 29, 2019 am 10:00 AM
css html html5 javascript node.js

這篇文章帶給大家的內容是關於NPM機制深入理解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

使用NPM安裝的時候會經常出現套件衝突(例如多個主模組的子模組版本不一致等),導致在開發過程中會遇到各種或大或小的問題。所有在這會介紹以下內容:

  1. NPM 主要安裝方式
  2. NPM 套件資訊查詢
  3. NPM 安裝機制(主要)

安裝&查詢指令

NPM 各種安裝方式

  • npm install packageName[@next | @versionNumber]

    • 在node_modules 中沒有指定模組時安裝,(不檢查~/.npm目錄)
  • ##npm install packageName - -f | -- force

      一個模組不管是否安裝過,npm都要
    • 強制重新安裝
  • #npm update packageName

      如果遠端版本較新、或本機版本不存在時安裝

#NPM 查詢服務

NPM透過registry的查詢服務,從而知道每個模組的最新版本。

可以透過npm view packageName [version] 查詢對映模組的資訊

NPM 安裝機制輸入npm install 指令並敲下回車後,會經歷以下幾個階段(以npm 5.5.1 為例):

#1. 執行工程本身preinstall

目前npm 工程如果定義了preinstall 鉤子此時會被執行。

2. 確定首層依賴模組

    首先需要做的是確定工程中的首層依賴,也就是
  • dependencies

    devDependencies
      屬性中直接指定的模組(假設此時沒有新增npm install 參數)。
    • 工程本身是整棵
    • 依賴樹
    • 的根節點,每個首層依賴模組都是根節點下面的子樹,npm 會開啟多進程從每個首層依賴模組開始逐步尋找更深層的節點。
    • 如果查詢node_modules目錄之中已經存在指定模組,那麼不再重新安裝
  • #3. 取得模組

    ## 取得模組是一個
      遞歸
    • 的過程,分為以下幾步:
  • 取得模組資訊

      在下載模組之前,首先要確定其版本,這是因為package.json 中往往是semantic version(semver,語義化版本)
    • 此時如果版本描述檔(npm-shrinkwrap.json 或package-lock.json)中有該模組資訊直接拿即可
  • 如果沒有則從倉庫取得(向registry查詢)。如 packaeg.json 中某個套件的版本是 ^1.1.0,npm 就會去倉庫中取得符合 1.x.x 形式的最新版本。

取得模組實體。

上一步會取得到模組的壓縮包位址(resolved 欄位),npm 會用此位址檢查本地緩存,快取中有就直接拿,如果沒有則從倉庫下載。

尋找該模組依賴

如果有依賴則回到第1步,如果沒有則停止。

  • 4. 模組扁平化(dedupe)

一步獲取到的是一棵完整的依賴樹,其中可能包含大量重複模組。例如 A 模組依賴 loadsh,B 模組同樣依賴 lodash。在 npm3 以前會嚴格按照依賴樹的結構進行安裝,因此會造成模組冗餘。



npm3 版本

開始預設加入了一個 dedupe 的過程。它會遍歷所有節點,逐一將模組放在根節點下面,也就是 node-modules 的第一層。當發現有重複模組時,則將其丟棄。


這裡需要對重複模組進行一個定義,它指的是

模組名稱相同且 semver 相容

。每個semver 都對應一段版本允許範圍,如果兩個模組的版本允許範圍存在交集,那麼就可以獲得一個相容版本,而不必版本號完全一致,這可以使更多冗餘模組在dedupe 過程中被去掉。

例如

node-modules 下 foo 模組依賴 lodash@^1.0.0,bar 模組依賴 lodash@^1.1.0,則 ^1.1.0 為相容版本。

而當 foo 依賴 lodash@^2.0.0,bar 依賴 lodash@^1.1.0,則依據 semver 的規則,二者不存在相容版本。會將一個版本放在 node_modules 中,另一個仍保留在依賴樹裡。

舉個例子,假設一個依賴樹原本是這樣:


node_modules
-- foo

---- lodash@version1


# -- bar

---- lodash@version2

假設version1 和version2 是相容版本,則經過dedupe 會成為下面的形式:

node_modules###-- foo# #####-- bar######-- lodash(保留的版本為相容版本)#######假設version1 和version2 為非相容版本,則後面的版本保留在依賴樹中: ######node_modules###-- foo###-- lodash@version1######-- bar###---- lodash@version2##########5 . 安裝模組######

這一步驟將會更新工程中的 node_modules,並執行模組中的生命週期函數(依照 preinstall、install、postinstall 的順序)。

6. 執行工程自身生命週期

目前 npm 工程如果定義了鉤子此時會被執行(依照 install、postinstall、prepublish、prepare 的順序)。

最後一步是產生或更新版本描述文件,npm install 過程完成。

這篇文章到這裡就已經全部結束了,更多其他精彩內容可以關注PHP中文網的JavaScript影片教學專欄!

以上是NPM機制深入理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML,CSS和JavaScript的角色:核心職責 HTML,CSS和JavaScript的角色:核心職責 Apr 08, 2025 pm 07:05 PM

HTML定義網頁結構,CSS負責樣式和佈局,JavaScript賦予動態交互。三者在網頁開發中各司其職,共同構建豐富多彩的網站。

vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

bootstrap怎麼寫分割線 bootstrap怎麼寫分割線 Apr 07, 2025 pm 03:12 PM

創建 Bootstrap 分割線有兩種方法:使用 標籤,可創建水平分割線。使用 CSS border 屬性,可創建自定義樣式的分割線。

H5指的是什麼?探索上下文 H5指的是什麼?探索上下文 Apr 12, 2025 am 12:03 AM

H5referstoHTML5,apivotaltechnologyinwebdevelopment.1)HTML5introducesnewelementsandAPIsforrich,dynamicwebapplications.2)Itsupportsmultimediawithoutplugins,enhancinguserexperienceacrossdevices.3)SemanticelementsimprovecontentstructureandSEO.4)H5'srespo

bootstrap怎麼調整大小 bootstrap怎麼調整大小 Apr 07, 2025 pm 03:18 PM

要調整 Bootstrap 中元素大小,可以使用尺寸類,具體包括:調整寬度:.col-、.w-、.mw-調整高度:.h-、.min-h-、.max-h-

bootstrap怎麼設置框架 bootstrap怎麼設置框架 Apr 07, 2025 pm 03:27 PM

要設置 Bootstrap 框架,需要按照以下步驟:1. 通過 CDN 引用 Bootstrap 文件;2. 下載文件並將其託管在自己的服務器上;3. 在 HTML 中包含 Bootstrap 文件;4. 根據需要編譯 Sass/Less;5. 導入定製文件(可選)。設置完成後,即可使用 Bootstrap 的網格系統、組件和样式創建響應式網站和應用程序。

bootstrap怎麼插入圖片 bootstrap怎麼插入圖片 Apr 07, 2025 pm 03:30 PM

在 Bootstrap 中插入圖片有以下幾種方法:直接插入圖片,使用 HTML 的 img 標籤。使用 Bootstrap 圖像組件,可以提供響應式圖片和更多樣式。設置圖片大小,使用 img-fluid 類可以使圖片自適應。設置邊框,使用 img-bordered 類。設置圓角,使用 img-rounded 類。設置陰影,使用 shadow 類。調整圖片大小和位置,使用 CSS 樣式。使用背景圖片,使用 background-image CSS 屬性。

了解HTML,CSS和JavaScript:初學者指南 了解HTML,CSS和JavaScript:初學者指南 Apr 12, 2025 am 12:02 AM

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

See all articles