close

老專案從yarn遷移到pnpm的心得記錄

步驟如下:

1. 安裝pnpm

2. 重新安裝node_modules

3. 遷移後的各種問題

4. 刪除yarn相關

 

 

1. 安裝pnpm

我一開始是依照網路上的方法

執行corepack enable,然後執行pnpm import

這樣做會直接安裝最新版本的pnpm

但如果專案是舊版本node.js,會因為版本不符而安裝失敗

 

強制安裝舊版本pnpm,去pnpm的github上挑了一個對應node版本的舊版本pnpm

npm install -g pnpm@8.15.8 --force

 

2. 重新安裝node_modules

建立一個.npmrc檔

輸入內容

enable-pre-post-scripts = true

讓package.json裡的pre和post的文本可以執行

預設是true,但不知道為什麼從yarn轉到pnpm就變成false

 

原本有設workspace的,也就是一個專案裡有很多個專案

要另外開一個檔案

pnpm-workspace.yaml

內容可以參考官方網站:

https://pnpm.io/pnpm-workspace_yaml

 

執行pnpm import,

會依據原本的yarn.lock和package.json產生pnpm-lock.yaml

 

如果碰到package.json的resolutions裡一些特殊字元造成解析失敗

可以嘗試刪掉特殊字元或是問AI要怎麼改

 

 

有了pnpm-lock.yaml之後,把現有node_modules刪除,然後用pnpm重新安裝一次

pnpm install

之後要檢查幾個點:

1. 安裝完後,pnpm dev啟動專案,看有沒有碰到問題

2. 用pnpm tsc檢查typescript型別,看有沒有碰到問題

3. pnpm build輸出網站,看有沒有碰到問題

 

3. 遷移後的各種問題

問題1:

幽靈依賴(ghost dependencies)的問題

簡單的說,就是A包依賴B包,但實際上只有安裝A包

所以在使用B包資源時會出現找不到的問題

 

這個問題有三種解法:

一、設定 public-hoist-pattern[] (推薦做法)

在.npmrc裡設定public-hoist-pattern[] = <包的名字>

把需要的包拉進node_modules,例如:

public-hoist-pattern[] = gatsby-react-router-scroll

就是把gatsby-react-router-scroll這個包拉進來

 

另一個常用的例子:

public-hoist-pattern[] = *type*

*type*代表所有名字中包含type的包,經常會用到

 

再舉一個例子,ant-design的type全都在rc開頭的包裡,所以rc開頭的包都要拉進來

public-hoist-pattern[] = rc*

 

可以參考官方網頁:

https://pnpm.io/npmrc#public-hoist-pattern

 

二、設定shamefully-hoist=true

在.npmrc裡設定shamefully-hoist=true

把全部的包都拉進node_modules,但這樣就變成和yarn、npm一樣

失去了使用pnpm的優勢

 

三、安裝缺少的packages

這樣做會碰到版本問題

例如說A包依賴B包,A包升級了,B包也要跟著升級

如果A包依賴了很多包,全部都要手動升級會很累

 

問題2:

ant-design/icons出現型別問題,說缺了translate這個屬性

後來發現是@types/react版本問題

 

因為package.json裡resolution那邊是16.9.11

所以pnpm產生的pnpm-lock.yaml也是16.9.11

自然就是安裝16.9.11,然後就會出錯

 

後來才發現原本專案裡的@types/react是16.14.0

不知道為什麼沒有被resolution限制在16.9.11,真神奇

 

解決方法:先在package.json裡resolution版本改成16.14.0

然後重新pnpm import和pnpm install
 

問題3:

我要commit的時候,出現以下錯誤:

ERR_PNPM_FETCH_404  GET https://registry.npmjs.org/--no-install: Not Found - 404

--no-install is not in the npm registry, or you have no permission to fetch it.

No authorization header was set for the request.

解決方法:pnpm dlx husky install

我也不懂為什麼,好像是husky的問題

參考網址:

https://github.com/pnpm/pnpm/issues/4790

 

4. 刪除yarn相關

最後確定都沒問題後,移除yarn相關:

1. 刪除yarn.lock

2. 移除.gitignore裡yarn相關

3. 移除lerna,執行pnpm remove lerna

4. README.md改寫

 

以上

arrow
arrow
    創作者介紹
    創作者 讀樂島主 的頭像
    讀樂島主

    讀樂島

    讀樂島主 發表在 痞客邦 留言(0) 人氣()