pnpm v10 來了!這些更新你一定不能錯過
Hello,大家好,我是 Sunday。
在包管理工具的賽道上,pnpm 一直是開發(fā)者眼中的 “性能之選”。它通過獨特的硬鏈接機制和優(yōu)秀的性能表現(xiàn),成功的在包管理工具上占據(jù)了一席之地。
而就在最近,pnpm v10 正式發(fā)布,這次發(fā)布包含了眾多重大更新和功能改進,尤其是對安全性和性能的提升!
今天,咱們就一起來看看 v10 帶來了哪些變化,以及這些變化將如何影響我們的日常開發(fā)。
核心變化一覽
1. 默認禁用依賴生命周期腳本
pnpm v10 默認不再執(zhí)行依賴的生命周期腳本(如 postinstall 和 preinstall)。這是一個顯著的安全增強,可以有效防止惡意腳本在安裝依賴時被執(zhí)行。
如果需要允許某些特定依賴執(zhí)行生命周期腳本,可以在 package.json 中通過 pnpm.onlyBuiltDependencies 字段進行顯式配置。例如:
{
"pnpm": {
"onlyBuiltDependencies": ["fsevents"]
}
}
2. 改進的 pnpm link
pnpm link 的行為在 v10 中進行了優(yōu)化:
- 工作區(qū)中:pnpm link 現(xiàn)在會將鏈接信息添加到工作區(qū)的根級 package.json,從而讓所有項目都能共享相同的鏈接。
- 全局鏈接:想要全局鏈接一個包,只需在包的目錄下運行 pnpm link,不再需要額外指定 -g 參數(shù)。
3. 安全性升級:全面切換到 SHA256 哈希算法
pnpm v10 將多個關(guān)鍵部分的哈希算法更新為 SHA256,以提升安全性和一致性:
- node_modules/.pnpm 中長路徑的哈希。
- 鎖定文件中的長依賴項哈希。
- pnpm-lock.yaml 文件的多項校驗值(如 packageExtensionsChecksum 和 sideEffects)。
- 側(cè)效緩存(Side Effects Cache)的校驗值。
4. 配置管理更加智能
pnpm v10 對配置的管理也進行了優(yōu)化:
- manage-package-manager-versions 默認啟用:pnpm 會根據(jù) package.json 中的 packageManager 字段自動管理版本。
- 公共提升(public hoisting)模式更新:默認情況下,不再提升任何包到 node_modules 根目錄。這對依賴沖突的處理更加友好。
- 減少腳本執(zhí)行中的環(huán)境變量:僅保留必要的環(huán)境變量(如 npm_package_name 和 npm_package_version),減少了不必要的污染。
5. 更智能的依賴安裝
pnpm v10 對依賴安裝的邏輯進行了多處優(yōu)化:
- 即使 NODE_ENV=production,也會安裝所有依賴。這解決了一些生產(chǎn)環(huán)境下依賴缺失的問題。
- 更快的重復安裝:在重復執(zhí)行安裝命令時,pnpm 會快速校驗 node_modules 是否已經(jīng)是最新狀態(tài),無需重新生成。
- 增強的依賴驗證:新增 verify-deps-before-run 設(shè)置,可控制在運行腳本前對依賴的檢查策略(如自動安裝、警告或拋出錯誤)。
6. 全球存儲與索引優(yōu)化
pnpm v10 對全局存儲和依賴索引進行了優(yōu)化:
- 存儲版本升級到 v10:支持同一內(nèi)容的不同包名或版本共享索引文件,從而提升一致性。
- 更高效的副作用緩存索引:僅記錄文件差異,而非所有文件,節(jié)省了存儲空間。
- 更可靠的依賴校驗:通過存儲內(nèi)容哈希和包標識符,確保鎖定文件中的完整性與一致性。
7. 新增支持:配置依賴(Configurational Dependencies)
pnpm v10 引入了一種新的依賴類型 配置依賴(configurational dependencies),這些依賴會在其他依賴之前優(yōu)先安裝。
配置依賴無法擁有自己的依賴或生命周期腳本,必須使用確切的版本號和校驗值進行安裝,例如:
{
"pnpm": {
"configDependencies": {
"my-configs": "1.0.0+sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="
}
}
}