在实际项目中使用 Garfish 时,需要遵循一定的最佳实践和开发规范,以确保项目的可维护性和可扩展性。
项目架构设计
1. 主应用设计
- 职责明确:主应用负责路由管理、子应用加载、全局状态管理
- 轻量化:避免在主应用中包含过多业务逻辑
- 统一规范:制定统一的开发规范和代码风格
- 示例:
javascript// 主应用入口 import Garfish from 'garfish'; Garfish.run({ apps: [ { name: 'app1', entry: '//localhost:3001', activeWhen: '/app1', props: { shared: { userInfo: getUserInfo(), theme: getTheme() } } } ], beforeLoad: (app) => { console.log('Loading app:', app.name); } });
2. 子应用设计
- 独立部署:每个子应用独立开发和部署
- 生命周期管理:正确实现生命周期钩子
- 资源清理:确保卸载时完全清理资源
- 示例:
javascript// 子应用生命周期 export async function bootstrap() { console.log('App bootstrap'); } export async function mount(props) { const { container, shared } = props; ReactDOM.render(<App shared={shared} />, container); } export async function unmount(props) { const { container } = props; ReactDOM.unmountComponentAtNode(container); }
开发规范
1. 命名规范
- 应用名称:使用小写字母和连字符,如
user-center - 路由前缀:与应用名称保持一致
- 组件命名:遵循框架的命名规范
- 样式类名:使用 BEM 或 CSS Modules
2. 代码规范
- 统一代码风格:使用 ESLint 和 Prettier
- 类型检查:使用 TypeScript 或 Flow
- 代码审查:建立代码审查机制
- 文档完善:编写清晰的文档和注释
3. 版本管理
- 语义化版本:遵循 SemVer 规范
- 版本兼容:确保子应用版本兼容性
- 更新策略:制定版本更新策略
- 回滚机制:准备版本回滚方案
团队协作
1. 团队分工
- 主应用团队:负责主应用开发和维护
- 子应用团队:负责各自子应用的开发
- 架构团队:负责整体架构设计和技术选型
- 测试团队:负责集成测试和质量保证
2. 协作流程
- 需求评审:统一评审跨应用需求
- 接口定义:提前定义应用间接口
- 联调测试:定期进行联调测试
- 发布协调:协调各应用的发布时间
3. 沟通机制
- 定期会议:定期召开技术会议
- 文档共享:共享技术文档和设计文档
- 问题反馈:建立问题反馈机制
- 知识分享:组织技术分享会
测试策略
1. 单元测试
- 测试覆盖率:确保核心逻辑的测试覆盖
- 测试隔离:确保测试之间相互独立
- Mock 依赖:使用 Mock 隔离外部依赖
- 示例:
javascript// 测试生命周期函数 describe('SubApp lifecycle', () => { it('should mount correctly', async () => { const container = document.createElement('div'); await mount({ container }); expect(container.innerHTML).not.toBe(''); }); });
2. 集成测试
- 应用集成:测试主应用和子应用的集成
- 路由测试:测试路由切换和应用加载
- 通信测试:测试应用间通信机制
- 示例:
javascript// 测试应用加载 describe('App loading', () => { it('should load sub-app when route changes', async () => { await Garfish.router.push('/app1'); expect(document.querySelector('#app1')).toBeTruthy(); }); });
3. E2E 测试
- 用户流程:测试完整的用户操作流程
- 跨应用场景:测试跨应用的用户场景
- 性能测试:测试应用性能指标
- 示例:
javascript// E2E 测试 describe('User flow', () => { it('should complete user journey across apps', async () => { await page.goto('/'); await page.click('#app1-link'); await page.waitForSelector('#app1-content'); await page.click('#navigate-to-app2'); await page.waitForSelector('#app2-content'); }); });
部署策略
1. 独立部署
- CI/CD 流程:为每个应用建立独立的 CI/CD 流程
- 环境管理:管理开发、测试、生产环境
- 发布策略:采用灰度发布或蓝绿部署
- 回滚机制:快速回滚到稳定版本
2. 资源管理
- CDN 加速:使用 CDN 加速静态资源
- 缓存策略:合理设置资源缓存
- 版本控制:使用版本号管理资源
- 资源压缩:压缩 JavaScript、CSS、图片
3. 监控告警
- 性能监控:监控应用性能指标
- 错误监控:监控应用错误和异常
- 用户行为:监控用户行为和使用情况
- 告警机制:建立告警机制及时发现问题
常见问题解决
1. 样式冲突
- 问题:不同子应用样式相互影响
- 解决:使用样式隔离方案,如 Shadow DOM 或 CSS 作用域
2. 状态共享困难
- 问题:跨应用状态共享复杂
- 解决:使用 Garfish 的共享状态机制或事件总线
3. 性能问题
- 问题:应用加载慢或运行卡顿
- 解决:优化加载策略,使用代码分割和懒加载
4. 调试困难
- 问题:微前端调试复杂
- 解决:使用 Garfish 提供的调试工具和浏览器 DevTools
通过遵循这些最佳实践,可以构建高质量、可维护的微前端应用。