使用Expo构建APK时报错Cannot find module crypto,如何解决?
Expo构建APK提示Cannot find module crypto错误解决方案
完整报错信息如下:
While trying to resolve module `crypto` from file `C:\Users\EDGAR\Desktop\DStarMobileApp\node_modules\jws\node_modules\jwa\index.js`, the package `C:\Users\EDGAR\Desktop\DStarMobileApp\node_modules\crypto\package.json` was successfully found. However, this package itself specifies a `main` module field that could not be resolved (`C:\Users\EDGAR\Desktop\DStarMobileApp\node_modules\crypto\index.js`. Indeed, none of these files exist: * C:\Users\EDGAR\Desktop\DStarMobileApp\node_modules\crypto\index.js(.native|.ios.ts|.native.ts|.ts|.ios.tsx|.native.tsx|.tsx|.ios.js|.native.js|.js|.ios.jsx|.native.jsx|.jsx|.ios.json|.native.json|.json) * C:\Users\EDGAR\Desktop\DStarMobileApp\node_modules\crypto\index.js\index(.native|.ios.ts|.native.ts|.ts|.ios.tsx|.native.tsx|.tsx|.ios.js|.native.js|.js|.ios.jsx|.native.jsx|.jsx|.ios.json|.native.json|.json) Error: While trying to resolve module `crypto` from file `C:\Users\EDGAR\Desktop\DStarMobileApp\node_modules\jws\node_modules\jwa\index.js`, the package `C:\Users\EDGAR\Desktop\DStarMobileApp\node_modules\crypto\package.json` was successfully found. However, this package itself specifies a `main` module field that could not be resolved (`C:\Users\EDGAR\Desktop\DStarMobileApp\node_modules\crypto\index.js`. Indeed, none of these files exist: * C:\Users\EDGAR\Desktop\DStarMobileApp\node_modules\crypto\index.js(.native|.ios.ts|.native.ts|.ts|.ios.tsx|.native.tsx|.tsx|.ios.js|.native.js|.js|.ios.jsx|.native.jsx|.jsx|.ios.json|.native.json|.json)
错误根因
crypto是Node.js服务端内置模块,React Native(Expo)运行环境不存在该原生模块的官方实现- 项目依赖的
jwa/jws是服务端JWT相关库,默认会调用Node内置crypto模块,项目中安装的空占位crypto包没有实际实现代码,所以找不到入口文件
修复步骤
- 第一步:卸载错误安装的空crypto包
npm用户执行:npm uninstall crypto
yarn用户执行:yarn remove crypto - 第二步:安装Expo环境兼容的crypto替代实现
执行:npx expo install expo-crypto - 第三步:修改项目根目录的
metro.config.js,添加模块别名配置,让所有依赖调用crypto时都指向expo-crypto,参考配置如下:
const { getDefaultConfig } = require('expo/metro-config'); const config = getDefaultConfig(__dirname); config.resolver.alias = { ...config.resolver.alias, 'crypto': 'expo-crypto', }; module.exports = config;
- 第四步:清除缓存后重新构建
开发测试执行:npx expo start --clear
构建APK前先执行:npx expo prebuild --clean清理旧构建缓存
备用方案
如果上述方案不生效,说明项目中的jws/jwa依赖无法适配expo-crypto,直接替换服务端JWT库为React Native兼容版本:
卸载原有jws/jsonwebtoken等服务端JWT库,换成jwt-decode等专门适配RN环境的JWT处理库,避免调用Node原生模块。
内容的提问来源于stack exchange,提问作者Edgar256
相关产品推荐
相关产品推荐

