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
相关产品推荐
相关产品推荐

