詞彙表
建置指令碼
指套件安裝後立即執行的任務;通常是清單中的 postinstall
指令碼,在清單的 scripts
欄位中設定。
建置指令碼應留給原生相依項,純 JavaScript 套件幾乎沒有理由使用它們。它們對使用者的專案有 顯著的副作用,因此請仔細權衡是否真的需要它們。
另請參閱:生命週期指令碼
相依項
相依項(列在清單的 dependencies
欄位中)描述兩個套件之間的關係。
當套件 A 有依賴項 B 時,Yarn 保證如果安裝成功,A 將能夠存取 B。請注意,這是我們對一般依賴項所做的唯一承諾:特別是,無法保證套件 B 會與應用程式其他部分所使用的版本相同。
描述符
描述符是套件名稱(例如 lodash
)和套件 範圍(例如 ^1.0.0
)的組合。描述符用於識別一組套件,而不是一個唯一的套件。
開發依賴項
依賴項(列在清單中 devDependencies
清單的欄位)描述兩個套件之間的關係。
開發依賴項非常類似於一般依賴項,但它們只對本機套件有影響。從遠端登錄檔(例如 npm)擷取的套件將無法存取其開發依賴項,但從本機來源(例如 工作區 或 portal:
協定)安裝的套件可以。
擷取器
擷取器是負責從 參考 擷取完整套件資料的元件。例如,npm 擷取器會從 npm 登錄檔下載套件 tarball。
提升
提升是將相依性樹狀結構轉換為最佳化的動作,藉此移除盡可能多的節點。沒有單一的方式來決定如何轉換樹狀結構,不同的套件管理員會做出不同的權衡(有些最佳化套件的普及性、套件大小、最高版本,...)。基於這個原因,無法保證最終的提升配置 - 除非套件永遠都能夠存取在 清單 中列出的相依性。
由於提升與檔案系統和 Node 解析緊密連結,其設計很容易出錯,並意外存取未適當定義為相依性的套件 - 因此在提升過程中不會考慮這些套件,導致它們的存在難以預測。基於這個原因和其他原因,提升從 Yarn 2 開始被擱置,轉而採用 即插即用解析。
連結器
連結器是同時使用相依性樹狀結構和套件資料儲存的元件,並產生特定於目標環境的磁碟成品。例如,即插即用 連結器會產生單一的 .pnp.cjs
檔案。
本機快取
本機快取或離線鏡像是保護專案免於套件登錄中斷的方式。
當本機快取啟用時,Yarn 會在 .yarn/cache
資料夾中產生所有您安裝套件的副本,然後您可以將其新增到您的儲存庫。後續的安裝會重複使用這個資料夾中的套件,而不是重新下載。
雖然不總是實用(它會導致儲存庫大小增加,儘管我們有方法大幅減輕),但它呈現了各種有趣的特性
- 它不需要額外的基礎架構,例如 Verdaccio 代理
- 它不需要額外的設定,例如登錄驗證
- 安裝取得步驟盡可能快速,完全沒有資料傳輸
- 如果您也使用 PnP 連結器,則可以達到零安裝
若要啟用本機快取,請將enableGlobalCache
設為false
,執行安裝,並將新的成品新增至您的儲存庫(您可能想要相應地更新您的 gitignore)。
定位器
定位器是套件名稱(例如lodash
)和套件參考(例如1.2.3
)的組合。定位器用於識別單一唯一的套件(有趣的是,所有有效的定位器也都是有效的描述符)。
清單
清單是定義與套件相關聯的元資料(其名稱、版本、相依性...)的檔案。在 JavaScript 生態系統中,它是package.json
檔案。
單一儲存庫
單一儲存庫是包含多個套件的儲存庫。Babel、Jest,甚至是Yarn 本身都是此類儲存庫的範例 - 它們各包含數十個彼此相依的小套件。
Yarn 透過「工作區」提供對單一儲存庫的原生支援。它可以透過執行單一安裝來輕鬆安裝多個本機套件的相依性,並將它們全部連結在一起,以便在變更可以讓專案的其他部分重複使用之前,不必發布它們。
套件
套件是相依性樹的節點。簡單來說,套件是一組原始碼,通常以其根目錄中的 package.json
為特徵。套件可以定義 相依性,這些相依性是其他套件,需要讓這些套件可用才能正常運作。
同儕相依性
相依性(列在清單的 peerDependencies
欄位中)描述兩個套件之間的關係。
與一般相依性相反,具有對 B 的同儕相依性的套件 A 並不能保證 A 能夠存取 B - 這取決於相依於 A 的套件手動提供與 A 要求相容的 B 版本。此缺點也有好處:A 將存取的 B 套件實例保證與 A 的祖先所使用的實例完全相同。當 B 使用 instanceof
檢查或單例時,這很重要。
同儕相依套件
同儕相依套件是列出同儕相依性的套件。
另請參閱:虛擬套件
外掛程式
外掛程式是 Yarn 2+ 中引入的新概念。透過使用外掛程式,可以擴充 Yarn 並使其更強大 - 無論是透過新增 解析器、擷取器 或 連結器。
即插即用
即插即用是一種替代安裝策略,它不會產生典型的 node_modules
目錄,而是產生一個單一檔案,然後注入到 Node 中,讓 Node 知道在哪裡可以找到已安裝的套件。從 v2 開始,即插即用成為 JavaScript 專案的預設安裝策略。
另請參閱:即插即用
PnP
請參閱 即插即用
入口
入口是一個使用 portal:
協定,指向位於磁碟上的套件的依賴項。
與 link:
協定(可以指向任何位置,但不能有依賴項)相反,Yarn 會以一種方式設定其依賴項對應,不僅依賴的套件可以存取透過入口參照的文件,入口本身也可以存取自己的依賴項。甚至是同儕依賴項!
專案
專案一詞用於涵蓋所有屬於同一個依賴項樹的 工作樹。
另請參閱:工作區
範圍
範圍是一個字串,當與套件名稱結合時,可用於選擇單一套件的多個版本。範圍通常遵循 semver,但可以使用任何受支援的 Yarn 協定。
另請參閱:協定
參照
參照是一個字串,當與套件名稱結合時,可用於選擇單一套件的單一版本。參照通常遵循 semver,但可以使用任何受支援的 Yarn 協定。
另請參閱:協定
解析器
解析器是負責將 描述符 轉換為 定位器,並從套件 定位器 中提取套件 清單 的元件。例如,npm 解析器會檢查 npm 登錄檔中有哪些版本可用,並傳回滿足 semver 需求的所有候選版本,然後會查詢 npm 登錄檔以擷取與所選解析度相關聯的完整元資料。
範圍
範圍是一個術語,源自 npm 登錄檔;它們用於描述一組所有屬於同一個實體的套件。例如,與 v2 相關的所有 Yarn 套件都屬於 npm 登錄檔上的 berry
範圍。範圍傳統上以 @
符號為前綴。
單例套件
單例套件是一個在依賴項樹中單次實例化的套件。
雖然單例套件並非一級公民,但可以使用 同儕相依性 輕鬆建立,方法是使用其其中一個屬性:由於同儕相依性所依賴的套件保證與其直接祖先所使用的套件是完全相同的實例,因此在整個相依性分支中使用同儕相依性,一直到最近的工作區,將可確保只建立套件的單一實例,使其成為事實上的單例套件。
另請參閱:同儕相依性
傳遞相依性
傳遞相依性是您所依賴套件的相依性。
想像一下 react
的情況。您的應用程式依賴它(您已在清單中自行列出它),因此它是直接相依性。但 react
也依賴於 prop-types
!這使得 prop-types
成為傳遞相依性,因為您沒有直接宣告它。
未連接套件
使用 Yarn PnP,大多數套件都保留在其 zip 檔案中,而不是解壓縮到磁碟中。然後在執行階段將檔案掛載到檔案系統,並透明地存取。掛載是唯讀的,這樣一來,如果某些東西嘗試寫入檔案,檔案就不會損毀。
然而,在某些情況下,將套件保持唯讀狀態可能會很困難(例如,當套件列出安裝後指令碼時,建置步驟通常需要產生建置成品,這使得唯讀資料夾不切實際)。對於這些情況,Yarn 可以解壓縮特定套件,並將它們保留在各自的資料夾中。此類套件稱為「未連接」。
套件在以下幾個情況下會未連接
- 明確地將
dependenciesMeta[].unplugged
欄位設定為true
- 明確地將套件設定其
preferUnplugged
欄位為true
- 當套件列出安裝後指令碼時隱含
- 當套件包含原生檔案時隱含
虛擬套件
因為對等相依套件有效地定義了可能的相依集的範圍,而不是單一的靜態相依集,因此對等相依套件可能有多個相依集。發生這種情況時,需要為每個這樣的集合至少實例化一次套件。
由於在 Node-land 中,JS 模組是根據它們的路徑實例化的(任何給定路徑的檔案絕不會被實例化兩次),而且由於 PnP 使得套件只在任何給定的專案中安裝一次,因此實例化這些套件多次的唯一方法是給它們多個路徑,同時仍然參考到相同的磁碟位置。這就是虛擬套件派上用場的地方。
虛擬套件是對等相依套件的特殊實例,編碼此特定實例應使用的相依集。每個虛擬套件都會獲得一個唯一的檔案系統路徑,以確保它引用的指令碼將使用它們適當的相依集進行實例化。
過去虛擬套件是使用符號連結實作的,但最近已更改,現在它們是透過虛擬檔案系統層實作的。這避免了建立數百個令人困惑的符號連結的需要,提高了與 Windows 的相容性,並防止了呼叫 realpath
的第三方工具會產生的問題。
工作區
一般來說,工作區是 Yarn 功能,用於處理儲存在同一個儲存庫中的多個專案。
在 Yarn 的詞彙中,工作區是直接屬於專案的本機套件。
另請參閱:工作區
工作樹
工作樹是一個私人工作區,它將新的子工作區新增到目前的專案。
另請參閱:工作區
Yarn
Yarn 是一個用於管理程式設計環境的命令列工具。它使用 Javascript 編寫,主要與其他 Javascript 專案一起使用,但它具備使其適用於各種情況的功能。
零安裝
另請參閱:零安裝