Expo React Native(Android)中使用@supabase/supabase-js出现‘events module not found’错误
Expo React Native(Android)中使用@supabase/supabase-js出现‘events module not found’错误
嘿,这个问题我之前开发React Native Expo项目时刚好踩过坑!原因很简单:Supabase的realtime-js依赖里用到了Node.js原生的events模块,但React Native/Expo的运行环境并不包含Node的核心模块,所以就抛出了这个找不到模块的错误。下面给你两个亲测有效的解决办法:
方法一:使用Supabase官方React Native专用包(推荐)
官方其实专门针对React Native环境做了优化包,比直接用通用的@supabase/supabase-js更适配,步骤如下:
- 先卸载原来的通用包:
npm uninstall @supabase/supabase-js - 安装React Native专用包:
npm install @supabase/react-native-supabase - 导入方式调整为专用包的格式,同时确认Android项目的
AndroidManifest.xml里有INTERNET权限(Expo项目默认已经配置,不过可以检查下以防万一)。
这个方法最省心,因为官方已经处理了所有环境兼容性问题,不用自己折腾polyfill。
方法二:手动添加Node核心模块的Polyfill(适合不想换包的场景)
如果你不想更换包,可以通过添加polyfill来模拟Node的events模块:
- 先安装需要的依赖:
npm install events react-native-url-polyfill - 在项目的入口文件(比如
App.js或者index.js)最顶部添加以下代码,全局挂载polyfill:import 'react-native-url-polyfill/auto'; import { EventEmitter } from 'events'; // 把EventEmitter挂载到全局,替代Node的events模块 global.EventEmitter = EventEmitter; global.events = { EventEmitter };
不过要注意,这种方法可能会带来其他潜在的兼容性问题,毕竟ws库原本是为Node环境设计的,React Native里用可能会有隐藏bug,所以还是更推荐第一种方法。
另外补充一点:如果你用的是Expo Go测试,可能有些原生依赖无法被正确加载,建议改用Expo Dev Client来运行项目,或者执行npx expo prebuild转为裸工作流后测试。
内容来源于stack exchange




