refactor(server): 重构服务层代码结构 feat(server): 添加基础设施、跨境电商、AI决策等核心服务 docs: 完善前端业务说明书和开发进度文档 style: 格式化代码和文档
511 lines
11 KiB
Markdown
511 lines
11 KiB
Markdown
# 前端优化指南 (Crawlful Hub)
|
||
|
||
> **定位**:Crawlful Hub 前端优化指南 - 详细说明交互优化的具体实施方法。
|
||
> **更新日期**: 2026-03-18
|
||
> **最高优先级参考**: [Frontend_Design.md](./Frontend_Design.md)
|
||
|
||
---
|
||
|
||
## 1. 文档概述
|
||
|
||
本指南旨在提供 Crawlful Hub 前端系统的优化策略和实施方法,涵盖交互优化、性能优化、用户体验优化、响应式设计优化和可访问性优化等方面。通过本指南,开发团队可以系统性地提升前端系统的质量和用户体验。
|
||
|
||
## 2. 交互优化的重要性
|
||
|
||
良好的交互设计是提升用户体验的关键因素,它可以:
|
||
- 提高用户满意度和忠诚度
|
||
- 减少用户操作错误和挫折感
|
||
- 提升系统的易用性和可理解性
|
||
- 增加用户的使用效率和 productivity
|
||
- 增强系统的专业性和品牌形象
|
||
|
||
## 3. 具体优化策略和实施方法
|
||
|
||
### 3.1 表单交互优化
|
||
|
||
#### 3.1.1 实时验证
|
||
|
||
**实施方法**:
|
||
- 使用 Ant Design Form 的 `validateTrigger` 属性设置为 `onChange`,实现实时验证
|
||
- 为每个表单项添加 `rules` 配置,定义验证规则
|
||
- 使用 `validateStatus` 和 `help` 属性提供即时反馈
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
<Form.Item
|
||
name="email"
|
||
label="邮箱"
|
||
rules={[
|
||
{ required: true, message: '请输入邮箱' },
|
||
{ type: 'email', message: '请输入有效的邮箱地址' }
|
||
]}
|
||
validateTrigger="onChange"
|
||
>
|
||
<Input placeholder="请输入邮箱" />
|
||
</Form.Item>
|
||
```
|
||
|
||
#### 3.1.2 自动保存
|
||
|
||
**实施方法**:
|
||
- 使用 `useEffect` 监听表单数据变化
|
||
- 设置防抖函数,避免频繁保存
|
||
- 使用 `localStorage` 或 `sessionStorage` 存储草稿
|
||
- 在组件卸载时自动保存
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
import { debounce } from '../utils/PerformanceOptimization';
|
||
|
||
const FormWithAutoSave = () => {
|
||
const [form] = Form.useForm();
|
||
|
||
const autoSave = debounce((values) => {
|
||
localStorage.setItem('formDraft', JSON.stringify(values));
|
||
}, 1000);
|
||
|
||
useEffect(() => {
|
||
const draft = localStorage.getItem('formDraft');
|
||
if (draft) {
|
||
form.setFieldsValue(JSON.parse(draft));
|
||
}
|
||
|
||
return () => {
|
||
autoSave(form.getFieldsValue());
|
||
};
|
||
}, []);
|
||
|
||
useEffect(() => {
|
||
form.watch((values) => {
|
||
autoSave(values);
|
||
});
|
||
}, [form]);
|
||
|
||
// 表单内容...
|
||
};
|
||
```
|
||
|
||
#### 3.1.3 智能填充
|
||
|
||
**实施方法**:
|
||
- 维护历史数据存储
|
||
- 根据用户输入的上下文提供智能建议
|
||
- 使用 `Select` 组件的 `showSearch` 和 `filterOption` 属性实现智能搜索
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
<Form.Item name="platform" label="平台">
|
||
<Select
|
||
showSearch
|
||
filterOption={(input, option) =>
|
||
option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||
}
|
||
>
|
||
<Option value="AMAZON">Amazon</Option>
|
||
<Option value="EBAY">eBay</Option>
|
||
<Option value="SHOPIFY">Shopify</Option>
|
||
</Select>
|
||
</Form.Item>
|
||
```
|
||
|
||
### 3.2 列表交互优化
|
||
|
||
#### 3.2.1 虚拟滚动
|
||
|
||
**实施方法**:
|
||
- 使用 `VirtualList` 组件处理长列表
|
||
- 设置合理的 `itemHeight` 和 `containerHeight`
|
||
- 实现数据的分批加载
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
import { VirtualList } from '../components/VirtualList';
|
||
|
||
const LongList = () => {
|
||
return (
|
||
<VirtualList
|
||
items={items}
|
||
itemHeight={48}
|
||
containerHeight={400}
|
||
renderItem={(item, index) => (
|
||
<div key={item.id} style={{ height: 48, padding: '12px' }}>
|
||
{item.name}
|
||
</div>
|
||
)}
|
||
keyExtractor={(item) => item.id}
|
||
/>
|
||
);
|
||
};
|
||
```
|
||
|
||
#### 3.2.2 列排序和筛选
|
||
|
||
**实施方法**:
|
||
- 使用 Ant Design Table 的 `sorter` 和 `filters` 属性
|
||
- 实现服务器端排序和筛选
|
||
- 保存用户的排序和筛选偏好
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
const columns = [
|
||
{
|
||
title: '商品名称',
|
||
dataIndex: 'name',
|
||
sorter: (a, b) => a.name.localeCompare(b.name),
|
||
},
|
||
{
|
||
title: '平台',
|
||
dataIndex: 'platform',
|
||
filters: [
|
||
{ text: 'Amazon', value: 'AMAZON' },
|
||
{ text: 'eBay', value: 'EBAY' },
|
||
],
|
||
onFilter: (value, record) => record.platform === value,
|
||
},
|
||
// 其他列...
|
||
];
|
||
|
||
<Table columns={columns} dataSource={data} />
|
||
```
|
||
|
||
### 3.3 页面过渡优化
|
||
|
||
#### 3.3.1 加载状态
|
||
|
||
**实施方法**:
|
||
- 使用骨架屏代替简单的加载动画
|
||
- 为不同类型的内容设计不同的骨架屏
|
||
- 实现渐进式加载
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
const SkeletonLoader = () => (
|
||
<div style={{ padding: 24 }}>
|
||
<Skeleton active paragraph={{ rows: 4 }} />
|
||
<Skeleton active paragraph={{ rows: 4 }} style={{ marginTop: 16 }} />
|
||
</div>
|
||
);
|
||
|
||
const PageWithSkeleton = () => {
|
||
const { data, isLoading } = useQuery({...});
|
||
|
||
if (isLoading) {
|
||
return <SkeletonLoader />;
|
||
}
|
||
|
||
return <PageContent data={data} />;
|
||
};
|
||
```
|
||
|
||
#### 3.3.2 错误处理
|
||
|
||
**实施方法**:
|
||
- 使用错误边界捕获组件错误
|
||
- 提供清晰的错误信息和恢复方案
|
||
- 实现错误日志记录
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
import { ErrorBoundary } from 'react-error-boundary';
|
||
|
||
const ErrorFallback = ({ error, resetErrorBoundary }) => (
|
||
<div style={{ padding: 24, textAlign: 'center' }}>
|
||
<Alert
|
||
message="出错了"
|
||
description={error.message}
|
||
type="error"
|
||
action={
|
||
<Button size="small" type="primary" onClick={resetErrorBoundary}>
|
||
重试
|
||
</Button>
|
||
}
|
||
/>
|
||
</div>
|
||
);
|
||
|
||
const SafeComponent = () => (
|
||
<ErrorBoundary FallbackComponent={ErrorFallback}>
|
||
<ComponentThatMightError />
|
||
</ErrorBoundary>
|
||
);
|
||
```
|
||
|
||
## 4. 性能优化
|
||
|
||
### 4.1 组件懒加载
|
||
|
||
**实施方法**:
|
||
- 使用 `React.lazy` 和 `Suspense` 实现组件懒加载
|
||
- 按路由或功能模块进行代码拆分
|
||
- 预加载关键组件
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
import React, { lazy, Suspense } from 'react';
|
||
|
||
const LazyComponent = lazy(() => import('./LazyComponent'));
|
||
|
||
const App = () => (
|
||
<Suspense fallback={<div>Loading...</div>}>
|
||
<LazyComponent />
|
||
</Suspense>
|
||
);
|
||
```
|
||
|
||
### 4.2 图片优化
|
||
|
||
**实施方法**:
|
||
- 实现图片懒加载
|
||
- 使用适当的图片格式和大小
|
||
- 支持 WebP 格式
|
||
- 实现图片压缩
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
import { LazyLoad } from '../components/LazyLoad';
|
||
|
||
const ImageWithLazyLoad = ({ src, alt }) => (
|
||
<LazyLoad>
|
||
<img src={src} alt={alt} />
|
||
</LazyLoad>
|
||
);
|
||
```
|
||
|
||
### 4.3 状态管理优化
|
||
|
||
**实施方法**:
|
||
- 合理使用 Redux,避免过度使用
|
||
- 使用 `useMemo` 和 `useCallback` 优化渲染性能
|
||
- 实现状态的细粒度管理
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
const ExpensiveComponent = React.memo(({ data, onUpdate }) => {
|
||
const processedData = useMemo(() => {
|
||
// expensive data processing
|
||
return processData(data);
|
||
}, [data]);
|
||
|
||
const handleUpdate = useCallback((value) => {
|
||
onUpdate(value);
|
||
}, [onUpdate]);
|
||
|
||
return <div>{processedData}</div>;
|
||
});
|
||
```
|
||
|
||
## 5. 用户体验优化
|
||
|
||
### 5.1 全局通知系统
|
||
|
||
**实施方法**:
|
||
- 使用 Ant Design 的 `message` 和 `notification` 组件
|
||
- 实现统一的通知管理服务
|
||
- 支持不同类型的通知(成功、错误、警告、信息)
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
import { message, notification } from 'antd';
|
||
|
||
export const notify = {
|
||
success: (content) => message.success(content),
|
||
error: (content) => message.error(content),
|
||
warning: (content) => message.warning(content),
|
||
info: (content) => message.info(content),
|
||
|
||
notification: {
|
||
success: (title, content) => notification.success({ title, description: content }),
|
||
error: (title, content) => notification.error({ title, description: content }),
|
||
warning: (title, content) => notification.warning({ title, description: content }),
|
||
info: (title, content) => notification.info({ title, description: content }),
|
||
},
|
||
};
|
||
```
|
||
|
||
### 5.2 操作引导
|
||
|
||
**实施方法**:
|
||
- 使用 `react-joyride` 等库实现新用户引导
|
||
- 为重要功能添加工具提示
|
||
- 实现上下文帮助
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
import JoyRide from 'react-joyride';
|
||
|
||
const Tour = () => {
|
||
const steps = [
|
||
{
|
||
target: '.first-element',
|
||
content: '这是第一个元素',
|
||
placement: 'bottom',
|
||
},
|
||
{
|
||
target: '.second-element',
|
||
content: '这是第二个元素',
|
||
placement: 'top',
|
||
},
|
||
];
|
||
|
||
return <JoyRide steps={steps} />;
|
||
};
|
||
```
|
||
|
||
## 6. 响应式设计优化
|
||
|
||
### 6.1 响应式布局
|
||
|
||
**实施方法**:
|
||
- 使用 Ant Design 的 `Row` 和 `Col` 组件
|
||
- 结合 `useMediaQuery` 钩子实现响应式逻辑
|
||
- 为不同屏幕尺寸设计不同的布局
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
import { useMediaQuery } from 'react-responsive';
|
||
import { Row, Col } from 'antd';
|
||
|
||
const ResponsiveLayout = () => {
|
||
const isMobile = useMediaQuery({ maxWidth: 768 });
|
||
|
||
return (
|
||
<Row gutter={16}>
|
||
<Col xs={24} sm={12} md={8} lg={6}>
|
||
<Card>Card 1</Card>
|
||
</Col>
|
||
<Col xs={24} sm={12} md={8} lg={6}>
|
||
<Card>Card 2</Card>
|
||
</Col>
|
||
<Col xs={24} sm={12} md={8} lg={6}>
|
||
<Card>Card 3</Card>
|
||
</Col>
|
||
<Col xs={24} sm={12} md={8} lg={6}>
|
||
<Card>Card 4</Card>
|
||
</Col>
|
||
</Row>
|
||
);
|
||
};
|
||
```
|
||
|
||
### 6.2 移动端适配
|
||
|
||
**实施方法**:
|
||
- 使用 `ResponsiveLayout` 组件
|
||
- 优化移动端的触摸交互
|
||
- 实现汉堡菜单和底部导航
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
import { ResponsiveLayout } from '../components/ui/ResponsiveLayout';
|
||
|
||
const App = () => {
|
||
return (
|
||
<ResponsiveLayout
|
||
menuItems={menuItems}
|
||
selectedKey={selectedKey}
|
||
onMenuSelect={onMenuSelect}
|
||
>
|
||
<PageContent />
|
||
</ResponsiveLayout>
|
||
);
|
||
};
|
||
```
|
||
|
||
## 7. 可访问性优化
|
||
|
||
### 7.1 键盘导航
|
||
|
||
**实施方法**:
|
||
- 确保所有交互元素都可以通过键盘访问
|
||
- 实现合理的 tab 顺序
|
||
- 添加键盘快捷键
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
const AccessibleButton = () => {
|
||
const handleKeyDown = (e) => {
|
||
if (e.key === 'Enter' || e.key === ' ') {
|
||
e.preventDefault();
|
||
// 执行按钮操作
|
||
}
|
||
};
|
||
|
||
return (
|
||
<button
|
||
tabIndex={0}
|
||
onKeyDown={handleKeyDown}
|
||
style={{ outline: 'none' }}
|
||
>
|
||
点击我
|
||
</button>
|
||
);
|
||
};
|
||
```
|
||
|
||
### 7.2 屏幕阅读器
|
||
|
||
**实施方法**:
|
||
- 使用语义化的 HTML 元素
|
||
- 添加适当的 `aria-*` 属性
|
||
- 确保所有内容都可以被屏幕阅读器访问
|
||
|
||
**示例代码**:
|
||
```tsx
|
||
<div role="region" aria-labelledby="section-title">
|
||
<h2 id="section-title">商品列表</h2>
|
||
<Table aria-label="商品列表" />
|
||
</div>
|
||
```
|
||
|
||
## 8. 最佳实践
|
||
|
||
### 8.1 代码规范
|
||
|
||
- 使用 TypeScript 严格模式
|
||
- 遵循 ESLint 和 Prettier 规范
|
||
- 保持代码的可读性和可维护性
|
||
- 编写清晰的注释
|
||
|
||
### 8.2 测试策略
|
||
|
||
- 编写单元测试和集成测试
|
||
- 使用 Jest 和 React Testing Library
|
||
- 实现端到端测试
|
||
- 定期运行测试套件
|
||
|
||
### 8.3 性能监控
|
||
|
||
- 使用 React DevTools 分析组件性能
|
||
- 实现前端性能监控
|
||
- 定期进行性能审计
|
||
- 优化关键渲染路径
|
||
|
||
## 9. 测试和监控
|
||
|
||
### 9.1 性能测试
|
||
|
||
**实施方法**:
|
||
- 使用 Lighthouse 进行性能审计
|
||
- 监控首屏加载时间
|
||
- 分析关键渲染路径
|
||
- 优化资源加载
|
||
|
||
### 9.2 用户体验测试
|
||
|
||
**实施方法**:
|
||
- 进行用户测试
|
||
- 收集用户反馈
|
||
- 分析用户行为数据
|
||
- 持续优化用户体验
|
||
|
||
## 10. 相关资源
|
||
|
||
- [React 官方文档](https://reactjs.org/)
|
||
- [Ant Design 官方文档](https://ant.design/)
|
||
- [Web Performance Best Practices](https://web.dev/fast/)
|
||
- [WCAG 2.1 Guidelines](https://www.w3.org/TR/WCAG21/)
|
||
- [React Performance Optimization](https://reactjs.org/docs/optimizing-performance.html)
|
||
|
||
---
|
||
|
||
*本文档基于 Crawlful Hub 前端架构设计,最后更新: 2026-03-18* |