升级至Expo SDK 50后出现Module not found: Can't resolve 'crypto'错误
升级至Expo SDK 50后出现Module not found: Can't resolve 'crypto'错误
看起来你在升级到Expo SDK 50后遇到了Node.js核心模块crypto的解析问题,这其实是版本升级带来的常见变化——Expo SDK 50基于React Native 0.73,而这个版本开始默认不再自动polyfill Node.js的核心模块(比如crypto),之前依赖自动polyfill的代码自然就会报错。
下面给你两种解决方案,优先推荐第一种官方适配的方式:
方案一:使用Expo官方的expo-crypto库(推荐)
Expo专门为移动端环境提供了加密工具库expo-crypto,完全可以替代Node.js的crypto模块生成UUID,兼容性和稳定性都更有保障。
- 首先安装依赖:
npx expo install expo-crypto
- 修改你的UUID生成代码,替换掉原来的
crypto引用:
import v35 from './lib/v35'; import { Uuidv5Namespace } from './uuid.types'; import * as Crypto from 'expo-crypto'; function uuidv4() { try { // 使用expo-crypto提供的原生适配方法生成UUID return Crypto.randomUUID(); } catch (error) { throw Error("无法生成UUID,请确认expo-crypto已正确安装并配置"); } }
这样修改后,代码就能在Expo环境下正常运行,完全不需要依赖Node.js的crypto模块。
方案二:手动polyfill Node.js的crypto模块(适合无法修改依赖代码的场景)
如果你的项目依赖了第三方库,没办法直接替换crypto的使用,那可以通过配置Metro来手动添加polyfill:
- 安装所需的polyfill依赖:
npm install crypto-browserify react-native-polyfill-globals
- 修改
metro.config.js,配置Metro解析crypto时指向polyfill库:
const { getDefaultConfig } = require('expo/metro-config'); const config = getDefaultConfig(__dirname); // 添加crypto的polyfill映射 config.resolver.extraNodeModules = { ...config.resolver.extraNodeModules, crypto: require.resolve('crypto-browserify'), }; module.exports = config;
- 在项目的入口文件(比如
App.js或者index.js)顶部添加polyfill的导入:
// 自动polyfill Node.js核心模块 import 'react-native-polyfill-globals/auto';
完成这些配置后,Metro会自动将require('crypto')解析为crypto-browserify,从而解决模块找不到的问题。
备注:内容来源于stack exchange,提问作者Essa Mohammad
相关产品推荐
相关产品推荐

