You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Expo项目中@ouroboros/body模块被同时加载TS和JS版本导致单例实例重复的问题求助

React Native Expo项目中@ouroboros/body模块被同时加载TS和JS版本导致单例实例重复的问题求助

我维护着两个npm模块,情况如下:

  • Body:导出一个类的单例实例,核心导出逻辑是:
const body = new Body();
export default body;
  • Brain:依赖Body的这个单例实例,通过import body from '@ouroboros/body';导入,自身也导出单例:
const brain = new Brain();
export default brain;

两个包都包含完整的.ts、.d.ts和.js文件。

在使用前,必须给Body实例传入特定字符串,这个操作在顶层项目中完成:

import body from '@ouroboros/body';
body.domain('somedomain.com');

纯JavaScript项目里从来没出过问题,但最近在使用Expo的React Native项目(用TSX编写组件)中,Brain调用Body时总会抛出「缺少domain」的错误——明明已经在顶层设置过domain了。

为了排查问题,我给Body的构造函数加了一行控制台日志,结果发现构造函数被执行了两次:

typescript constructor                index.ts:111
javascript constructor                index.js:54

按TypeScript/JavaScript的模块机制,同一个模块不应该被加载两次,这说明TS和JS版本的Body文件被当成了两个独立模块,生成了两个完全分离的单例实例——顶层项目设置的是TS版本的实例,而Brain用的却是JS版本的实例,自然会出现domain未设置的错误。

我试过在tsconfig.json中设置preferTsExts: true,但问题依然没有解决。

复现步骤

$ npx create-expo-app@latest ExpoTest
$ cd ExpoTest
$ npm install @ouroboros/body @ouroboros/brain

然后在ExpoTest/app/_layout.tsx中添加以下代码:

import body from '@ouroboros/body';
import brain from '@ouroboros/brain';
body.domain('somedomain.com');

首次启动应用(不刷新、不热重载),就能看到Body的构造函数被调用两次,分别来自TS和JS文件。

如果需要验证,可以给Body的两个入口文件分别添加日志:

// Body的index.ts构造函数
constructor() {
   console.log('typescript constructor');
}
// Body的index.js构造函数
constructor() {
   console.log('javascript constructor');
}

启动后就能看到两次日志输出。

备注:内容来源于stack exchange,提问作者user28615423

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:09:34