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