You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动