如何在不修改node_modules的前提下为TS版React Native项目接入NATS.io
无需修改node_modules的NATS接入方式完全可以实现,当前报错是因为nats依赖的Node.js核心模块util在React Native原生环境中不存在,按以下步骤配置即可解决:
1. 安装依赖包
安装缺失的polyfill以及环境兼容包:
yarn add util react-native-get-random-values text-encoding nats.ws
2. 入口文件预注入全局API
在项目入口文件(通常是index.js或App.tsx)的最顶部添加以下代码,提前全局挂载nats需要的API:
// 必须放在所有其他import语句之前 import 'react-native-get-random-values'; import { TextEncoder, TextDecoder } from 'text-encoding'; import util from 'util'; (global as any).util = util; (global as any).TextEncoder = TextEncoder; (global as any).TextDecoder = TextDecoder;
3. 配置Metro模块解析规则
修改项目根目录下的metro.config.js,添加Node核心模块的polyfill映射:
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); const config = { resolver: { extraNodeModules: { util: require.resolve('util'), // 后续如果出现其他Node核心模块(如buffer、stream)缺失报错,可在此处添加对应polyfill的映射 }, }, }; module.exports = mergeConfig(getDefaultConfig(__dirname), config);
4. 正确导入NATS
业务代码中导入NATS时,必须使用WebSocket适配版本,避免触发Node端专属的fs、net等模块依赖:
// 错误写法:加载Node端实现,会触发fs等模块缺失报错 // import * as nats from 'nats' // 正确写法:加载WebSocket适配版本,原生兼容React Native环境 import * as nats from 'nats.ws'
5. 清理缓存重启项目
执行以下命令清理所有缓存后重启服务,避免旧缓存导致配置不生效:
watchman watch-del-all && rm -rf /tmp/metro-* && yarn start --reset-cache
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

