Spectrum跨平台开发:React Native与Web共享代码
Spectrum跨平台开发:React Native与Web共享代码
在当今快速迭代的开发环境中,跨平台解决方案已成为提升开发效率的关键。Spectrum项目通过精心设计的代码共享策略,成功实现了React Native与Web平台的无缝协同,显著降低了维护成本并加速了功能迭代。本文将深入剖析Spectrum的跨平台架构设计、核心共享模块实现及最佳实践,帮助开发团队构建高效的多端应用。
跨平台架构概览
Spectrum采用"共享核心+平台适配"的分层架构,将业务逻辑与UI组件分离,确保代码复用最大化。项目目录结构清晰区分共享代码与平台特定实现:
核心架构特点:
- 共享层:包含数据模型、业务逻辑和通用工具函数,位于
shared/目录 - 平台层:Web端代码在
src/目录,React Native端通过条件导入实现平台适配 - 通信层:使用Apollo Client实现GraphQL数据交互,确保两端数据一致性
共享代码实现策略
1. 通用工具函数共享
shared/目录集中存放跨平台通用工具,如字符串处理、日期格式化等纯逻辑功能。以shared/time-formatting.js为例,该模块提供统一的时间格式化功能:
// 跨平台时间格式化工具
export function formatRelativeTime(date) {
const now = new Date();
const diff = Math.floor((now - date) / (1000 * 60));
if (diff < 1) return '刚刚';
if (diff < 60) return `${diff}分钟前`;
// ...更多格式化逻辑
}
2. GraphQL数据层共享
项目使用Apollo Client作为数据通信层,shared/graphql/目录包含所有GraphQL操作和类型定义,实现数据请求逻辑的完全复用:
// shared/graphql/queries/getCommunity.js
import gql from 'graphql-tag';
export const GET_COMMUNITY = gql`
query GetCommunity($slug: String!) {
community(slug: $slug) {
id
name
description
// ...其他字段
}
}
`;
Apollo客户端配置在shared/graphql/apollo-client-options.js中定义,通过getSharedApolloClientOptions函数提供跨平台一致的缓存策略和错误处理。
3. 富文本编辑逻辑共享
shared/draft-utils/目录实现了基于Draft.js的富文本编辑功能,通过Flow类型注释确保跨平台类型安全:
// @flow
/**
* This file is shared between server and client.
* ⚠️ DON'T PUT ANY NODE.JS OR BROWSER-SPECIFIC CODE IN HERE ⚠️
*/
export function toPlainText(editorState) {
return editorState.getCurrentContent().getPlainText();
}
export function fromPlainText(text) {
if (!text || text === '')
return EditorState.createWithContent(emptyContentState);
return EditorState.createWithContent(ContentState.createFromText(text));
}
平台差异化处理
条件导入与平台适配
对于平台特定实现,Spectrum采用文件名后缀区分策略:
// Web平台导入
import Renderer from './renderer.web.js';
// React Native平台导入
// import Renderer from './renderer.native.js';
样式解决方案
项目使用styled-components实现样式隔离,通过Platform.select实现平台特定样式:
const Container = styled.View`
${Platform.select({
web: css`
max-width: 1200px;
margin: 0 auto;
`,
default: css`
flex: 1;
padding: 16px;
`
})}
`;
测试与构建策略
Spectrum采用统一测试策略确保跨平台功能一致性,测试文档详见docs/testing/intro.md。主要测试类型包括:
- 单元测试:验证共享工具函数正确性
- 集成测试:确保跨平台数据流一致性
- E2E测试:使用Cypress验证关键用户流程
构建脚本在package.json中定义,通过不同命令区分平台构建:
{
"scripts": {
"dev:web": "cross-env NODE_PATH=./ react-app-rewired start",
"dev:mobile": "react-native start",
"build:web": "cross-env NODE_PATH=./ react-app-rewired build",
"build:mobile": "react-native bundle --platform ios --entry-file index.js"
}
}
最佳实践与经验总结
- 共享代码边界控制:严格区分纯逻辑与平台相关代码,避免在共享模块中引入平台API
- 类型安全保障:使用Flow类型系统(shared/types.js)确保跨平台数据结构一致性
- 资源路径统一:图片等静态资源使用相对路径,如public/img/connect.svg
- 渐进式适配:优先实现核心共享逻辑,再逐步扩展平台特定功能
通过这套跨平台架构,Spectrum团队成功将代码复用率提升至70%以上,同时保持各平台原生体验。项目的模块化设计和清晰的边界划分,为后续扩展更多平台(如桌面应用)奠定了坚实基础。
官方文档:docs/readme.md
API参考:api/schema.js
测试示例:shared/test/get-mentions.test.js
更多推荐


所有评论(0)