开发适配Node.js/React/React Native的TypeScript包遇依赖问题求助
跨Node.js/React/React Native的TypeScript包兼容问题
包背景
我正在开发一款可通过npm install直接安装的TypeScript包,适配Node.js、React和React Native(RN)环境。包的核心功能可在纯JS环境正常运行,同时包含React/RN专属模块——比如React项目可从/react目录导入专属hooks。
代码分离实现方式
我通过两种方式实现平台代码分离:
- 动态导入:仅在特定配置开启时加载对应平台模块,示例代码:
private async _setupRN(config: PackageConfig) { const { subscribeForAppStateChanges } = await import("./rn"); // ...其他业务逻辑 }; if (config?.enableReactNative) { this._setupRN(config); }
- 用户手动导入:比如React专属hooks,用户未导入则该模块不会被使用或打包
遇到的问题
- 本地复制包文件:直接将包文件夹复制到ts-node/React/RN项目中,所有功能(包括平台专属功能)均可正常运行
- 发布原.ts文件到npm:安装后仅RN环境正常,React环境会抛出类型定义或导入/导出语句错误
- 编译为.js后发布:Node.js和RN环境正常,但React环境报错:
Module not found: Error: Can't resolve 'react-native' in '.../node_modules/@appklaar/appklaar_sdk/rn'
更诡异的是:即使完全移除所有导入react-native的代码(相关代码绝不会被执行),仍会出现上述错误,似乎React会解析未使用的文件
当前配置与疑问
react和react-native已设为包的peerDependencies,但因仅设peerDependencies时无法构建,临时将RN设为devDependency- 疑问:为何Node.js环境正常,只有React环境出现模块解析错误?
- 诉求:可接受发布前执行
tsc --build,希望实现单包跨环境兼容,不想拆分为三个独立包,确信已接近解决方案
内容的提问来源于stack exchange,提问作者Evok
相关产品推荐
相关产品推荐

