React Native 0.74 结合 TypeScript:开源移动端项目组件复用与原生模块(相机 / 定位)调用
·
React Native 0.74 + TypeScript:组件复用与原生模块调用指南
一、组件复用策略(TypeScript实现)
核心原则:通过泛型接口定义可复用组件契约
interface ReusableComponentProps<T> {
data: T[];
renderItem: (item: T) => React.ReactNode;
}
const GenericList = <T,>({ data, renderItem }: ReusableComponentProps<T>) => (
<FlatList
data={data}
keyExtractor={(item, index) => `${index}-${JSON.stringify(item)}`}
renderItem={({ item }) => renderItem(item)}
/>
);
// 使用示例
<GenericList
data={users}
renderItem={(user) => <Text>{user.name}</Text>}
/>
最佳实践:
- 使用
tsconfig.json路径别名简化导入
{
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"@components/*": ["components/*"]
}
}
}
- 通过高阶组件注入通用逻辑(如网络请求状态)
- 使用
React.memo优化渲染性能
二、原生模块调用(相机/定位)
相机模块实现:
- 安装依赖:
yarn add react-native-vision-camera - 类型化相机组件:
import { Camera, useCameraDevice } from 'react-native-vision-camera';
const CameraView = () => {
const device = useCameraDevice('back');
if (!device) return <Text>Camera not available</Text>;
return <Camera device={device} isActive={true} />;
};
定位模块实现:
- 安装依赖:
yarn add react-native-geolocation-service - 封装定位服务:
import Geolocation from 'react-native-geolocation-service';
type Position = {
coords: {
latitude: number;
longitude: number;
accuracy: number;
};
};
const getLocation = (): Promise<Position> => {
return new Promise((resolve, reject) => {
Geolocation.getCurrentPosition(
resolve,
reject,
{ enableHighAccuracy: true, timeout: 15000 }
);
});
};
三、项目架构优化建议
src/
├── components/ # 复用组件库
│ ├── camera/
│ ├── maps/
│ └── ui/
├── native-modules/ # 原生模块桥接层
├── hooks/ # 自定义Hook
├── types/ # 全局类型定义
└── utils/ # 工具函数
关键优化点:
- 使用
react-native-builder-bob构建跨平台模块 - 通过
TurboModule实现类型安全的原生通信(RN 0.74+) - 在
metro.config.js中配置模块加速:
module.exports = {
resolver: {
unstable_enablePackageExports: true,
},
};
四、开源项目实践方案
-
组件发布:
- 使用
bit.dev管理可复用组件 - 配置
tsup构建类型声明文件
tsup src/index.tsx --dts --format esm,cjs - 使用
-
原生模块封装:
- 创建
NativeModule类型定义文件
declare module 'react-native-native-module' { export function openCamera(options: { quality: number }): Promise<string>; } - 创建
-
CI/CD流程:
# GitHub Actions 示例 - name: Type Check run: yarn tsc --noEmit - name: Build Android run: yarn android:build
调试建议:使用
react-native-debugger配合Redux DevTools进行类型化状态管理检查,重点关注原生模块的TypeScript接口契约一致性。
更多推荐
所有评论(0)