TypeError: crypto$2.getRandomValues is not a function
这个错误 TypeError: crypto$2.getRandomValues is not a function
通常是因为 Node.js 的 crypto
模块在浏览器环境或某些构建工具中不可用或未正确引入。以下是几种可能的解决方案引入。以下是几种可能的解决方案:
1. 升级 Node.js 版本【推荐】
确保你使用的是较新的 Node.js 版本(建议 LTS 版本,如 18.x 或更高)。或者使用 nvm 切换一个高版本的 node。旧版本可能对 crypto
的支持不完善。(亲测使用18.20.8版本正常,16.20.2版本报错)
node -v # 检查当前版本
nvm install 18.20.8 # 或通过 nvm 升级# 或使用 nvm 切换版本
nvm list # 查看可用版本
nvm use 18.20.8 # 切换版本
使用nvm命令报错请移步:nvm : 无法将“nvm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
2. 检查 Vite 和依赖版本
确保 vite
和 @vitejs/plugin-vue
等核心依赖是最新版本:
npm update vite @vitejs/plugin-vue
# 或
yarn upgrade vite @vitejs/plugin-vue
3. 全局 Polyfill 配置
在 vite.config.js
中添加 crypto
的 polyfill 配置:
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';export default defineConfig({
plugins: [vue()],
define: {
// 确保全局 crypto 可用
global: {},
},
optimizeDeps: {
// 显式包含 crypto-browserify 或其他 polyfill
include: ['crypto-browserify'],
},
});
4. 安装 Polyfill 包
安装 crypto-browserify
并配置别名:
npm install crypto-browserify stream-browserify buffer
# 或
yarn add crypto-browserify stream-browserify buffer
然后在 vite.config.js
中配置别名:
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import path from 'path';export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
crypto: 'crypto-browserify',
stream: 'stream-browserify',
buffer: 'buffer',
},
},
});
5. 检查浏览器兼容性
如果问题出现在浏览器中,确保目标浏览器支持 Web Crypto API。对于旧浏览器,可以通过 polyfill.io
动态加载 polyfill:
<script src="https://polyfill.io/v3/polyfill.min.js?features=WebCrypto"></script>
6. 清理缓存并重试
删除 node_modules
和缓存后重新安装依赖:
rm -rf node_modules package-lock.json
npm cache clean --force
npm install
7. 检查项目配置
确保项目中没有自定义代码覆盖了全局 crypto
对象。例如,检查 main.js
或入口文件是否有类似 window.crypto = ...
的代码。
8. 降级 Vite(临时方案)
如果问题由 Vite 新版本引入,可以尝试降级到稳定版本:
npm install vite@4.4.0
验证修复
启动开发服务器,确认错误是否解决:
npm run dev