升級 node18 遇到的問題總結

IOneStar發表於2023-02-03
本篇文章主要記錄 node14 升級 node18 遇到的問題

1. npm i 報錯 ERESOLVE could not resolveRESOLVE 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 資訊,但是安裝的元件可以正常使用

具體可檢視:

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對允許演演算法和秘鑰大小增加了嚴格的限制,可能會對生態系統造成一些影響。

解法:

  1. 升級最新版本的 升級webpack@5.75 及react-scripts@5.0.1
  2. 配置環境變數 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版本時遇到的問題

解決方案

  1. 升級到支援的作業系統核心
    參考node官方檔案,推薦生產環境作業系統https://github.com/nodejs/nod...
  2. 原始碼編譯,升級gcc glibc(不推薦)

參考檔案:

參考

相關文章