1. 報錯
在 Node.js 18.18.0 的版本中,遇到以下錯誤:
this[kHandle] = new _Hash(algorithm, xofLen);^
Error: error:0308010C:digital envelope routines::unsupported
這個錯誤通常發生在運行項目或構建時,尤其是在使用 Webpack、Vite 或其他構建工具時。
2. 報錯截圖
3. 錯誤原因
該錯誤的根本原因是 Node.js 17+ 默認使用了 OpenSSL 3.0,而 OpenSSL 3.0 移除了對一些舊版加密算法(如 MD4 、 MD5 等)的支持。如果你的項目或依賴庫中使用了這些舊版算法,就會觸發此錯誤。
4. 解決方案一:臨時解決方案:啟用舊版 OpenSSL 提供程序
通過設置環境變量 NODE_OPTIONS ,可以啟用舊版 OpenSSL 提供程序,從而解決兼容性問題。
4.1 Linux/MacOS
export NODE_OPTIONS=--openssl-legacy-provider
4.2 Windows
set NODE_OPTIONS=--openssl-legacy-provider
4.3 在 package.json 中設置
如果你希望在運行腳本時自動應用此設置,可以修改 package.json :
"scripts": {"dev:h5:set": "SET NODE_OPTIONS=--openssl-legacy-provider && npm run build:h5 -- --watch","dev:h5:export": "export NODE_OPTIONS=--openssl-legacy-provider && npm run build:h5 -- --watch"
}
5. 解決方案二:降級 Node.js 版本
如果你的項目對 Node.js 版本要求不高,可以降級到 Node.js 16 或更低版本,因為這些版本默認使用 OpenSSL 1.1.1,不會觸發此錯誤。
- 使用 nvm 切換 Node.js 版本:
nvm install 16
nvm use 16
6. 解決方案三:更新項目依賴
檢查項目中是否有依賴庫使用了舊版加密算法,并嘗試更新這些依賴庫到最新版本。通常,新版本會修復與 OpenSSL 3.0 的兼容性問題。
7. 解決方案四:修改 Webpack 配置
如果你使用的是 Webpack,可以通過修改配置來避免使用舊版加密算法:
module.exports = {output: {hashFunction: 'sha256', // 使用 SHA-256 替代 MD5},
};
8. 注意事項
- 臨時解決方案的風險 : --openssl-legacy-provider 是一個臨時解決方案,舊版 OpenSSL 提供程序可能存在安全風險,建議僅在開發環境中使用。
- 生產環境 :在生產環境中,應盡量避免使用臨時解決方案,而是通過更新依賴或降級 Node.js 版本來解決問題。
- 長期解決方案 :建議盡快更新項目或依賴庫,避免使用舊版加密算法。
9. Node.js 版本
由于使用的是 taro 3.6.7 框架,所以在本地開發時,存在 node 的版本要求,因此不對版本降級處理。
10. 本地使用臨時方案成功解決
11. 總結
錯誤是由于 Node.js 17+ 默認使用 OpenSSL 3.0 導致的。通過啟用舊版 OpenSSL 提供程序、降級 Node.js 版本或更新項目依賴,可以解決此問題。在開發環境中,可以使用臨時解決方案快速修復問題,但在生產環境中,建議采用更安全的長期解決方案。