本篇文章主要記錄 node14 升級 node18 遇到的問題
1. npm i 報錯 ERESOLVE could not resolve
或RESOLVE unable to resolve dependency tree
(無法解析依賴關係樹)
當前專案安裝的包有對等依賴衝突。
npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR!
npm ERR! While resolving: @nestjs/elasticsearch@8.1.0
npm ERR! Found: @elastic/elasticsearch@5.6.22
npm ERR! node_modules/@elastic/elasticsearch
npm ERR! @elastic/elasticsearch@"~5.6.22" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer @elastic/elasticsearch@"^7.4.0 || ^8.0.0" from @nestjs/elasticsearch@8.1.0
npm ERR! node_modules/@nestjs/elasticsearch
npm ERR! @nestjs/elasticsearch@"~8.1.0" from the root project
npm ERR!
npm ERR! Conflicting peer dependency: @elastic/elasticsearch@8.2.1
npm ERR! node_modules/@elastic/elasticsearch
npm ERR! peer @elastic/elasticsearch@"^7.4.0 || ^8.0.0" from @nestjs/elasticsearch@8.1.0
npm ERR! node_modules/@nestjs/elasticsearch
npm ERR! @nestjs/elasticsearch@"~8.1.0" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
原因:
npm7 將 install 方式預設為按照 peer dependencies 方式安裝。
npm7之前不會中斷安裝過程,會保留兩個版本,一個放在一級目錄,一個放到專案的目錄下;npm7 升級之後,所有 peerDependencies 會自動安裝,但是如何某個包的 peerDependencies 和 root 層同樣報的版本衝突,會自動報錯。
解決方案:
1、按照報錯資訊解決包版本衝突
截圖中的報錯只是一個示例,並不一定都是 react 這個包報錯版本衝突,大部分包都會報錯版本衝突。
- 如果是內部的包,可以直接在內部包加 peer 解決版本衝突或者解決版本衝突
- 外部 npm 的包,可以去看一下版本是否可以相容
2、衝突太多無法暫時全部解決的,可以暫時使用下面的方式
- npm install --force 或 npm install --legacy-peer-deps
.npmrc 檔案配置 legacy-peer-deps = true
npm i -- force // 強制 npm 從遠端獲取資源,即使磁碟上存在副本 npm i --legacy-peer-deps // 繞過 peerDependency裡的依賴自動安裝,它告訴npm忽略專案中引入的各個依賴模組之前依賴相同但版本不同的問題,以npmV3-V6的方式繼續執行安裝操作。所以其實該命令並沒有真的解決衝突,而是忽略了衝突,以“過時”(v3-v6)的方式進行下載操作
使用上述方法後,不會彈出報錯資訊,只是直接跳過安裝依賴,不能解決包的使用問題。解決問題的辦法就是手動在頂層安裝衝突的依賴,雖然出現一些 warning 資訊,但是安裝的元件可以正常使用
具體可檢視:
- https://github.com/npm/cli/is...
- rfcs/0031-handling-peer-conflicts.md at main · npm/rfcs
- cli/CHANGELOG.md at latest · npm/cli
2. npm run build / start 報錯 Error:error:0308010C:digital enveloperoutines::unsupported
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:71:19)
at Object.createHash (node:crypto:133:10)
at module.exports (/github/myProject/socket/node_modules/webpack/lib/util/createHash.js:135:53)
at NormalModule._initBuildHash (/github/myProject/socket/node_modules/webpack/lib/NormalModule.js:417:16)
...
at process.processTicksAndRejections (node:internal/process/task_queues:83:21) {
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
}
原因:
node17以上會存在這個問題: https://github.com/nodejs/nod...
node17及以後版本中支援 OpenSSL3.0, 而OpenSSL3.0對允許演演算法和秘鑰大小增加了嚴格的限制,可能會對生態系統造成一些影響。
解法:
- 升級最新版本的 升級webpack@5.75 及react-scripts@5.0.1
配置環境變數 NODE_OPTIONS="--openssl-legacy-provider" ,讓 Nodejs 使用舊版本相容的 OpenSSL
參考: https://stackoverflow.com/que...
具體可檢視:
3. centos7 環境 使用node18 的報錯
# root @ centos7-build in ~/node-v18.3.0-linux-x64/bin [9:20:05]
$ ./node
./node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by ./node)
./node: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by ./node)
./node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by ./node)
./node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./node)
./node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by ./node)
./node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./node)
原因
Starting v18, Node.js no longer supports centos 7 and a few other Linux distros due to glibc version incompatibility. See NodeJS 18 revert to building on CentOS 7, RHEL 7, Ubuntu Bionic 18.04, other other LTS distros · Iss.
這個問題是當時在升級釋出系統的伺服器的 node版本時遇到的問題
解決方案
- 升級到支援的作業系統核心
參考node官方檔案,推薦生產環境作業系統https://github.com/nodejs/nod... - 原始碼編譯,升級gcc glibc(不推薦)
參考檔案: