search-syntax-pro/docs/improvements/05-architecture-recommendations.md
Zain 84a509b92d feat: 新增快捷键功能及多项优化
- 新增全局快捷键支持(Ctrl+Shift+F/Command+Shift+F)
- 添加快捷键命令类型定义(chrome-commands.d.ts)
- 实现版本管理工具(version.ts)
- 新增模板和快捷键相关类型定义
- 优化搜索表单组件支持外部控制高级选项
- 新增引擎选择器组件(EngineSelector)
- 改进全局样式和按钮样式
- 在设置页面新增快捷键配置选项
- 添加测试页面和调试工具
- 更新文档包括发布说明和测试指南

本次提交包含多项功能新增和优化,主要围绕快捷键功能的实现和用户体验提升。
2025-11-11 16:45:59 +08:00

501 行
12 KiB
Markdown

# 架构设计建议
> **文档版本**: v1.0
> **更新日期**: 2025-11-10
---
## 当前架构分析
### 优势
✅ **适配器模式** - 每个搜索引擎独立适配器,扩展性强
✅ **TypeScript 类型系统** - 完善的类型定义和接口
✅ **React 组件化** - UI 组件清晰,可复用性好
✅ **Vite 构建** - 快速的开发和构建体验
### 待改进
❌ **状态管理分散** - useState 分散在各组件
❌ **存储层单一** - 仅使用 Chrome Storage API
❌ **缺少插件化** - 功能硬编码,难以扩展
❌ **模块耦合** - 业务逻辑和 UI 耦合
---
## 架构升级方案
### 1. 状态管理升级
**当前方案**:
```typescript
// 分散在各组件
const [searchParams, setSearchParams] = useState<SearchParams>({...});
const [history, setHistory] = useState<SearchHistory[]>([]);
const [settings, setSettings] = useState<UserSettings | null>(null);
```
**推荐方案**: **Zustand** (轻量级状态管理)
```typescript
// src/stores/app-store.ts
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
interface AppStore {
// State
searchParams: SearchParams;
history: SearchHistory[];
bookmarks: SearchBookmark[];
templates: SearchTemplate[];
settings: UserSettings;
// Actions
setSearchParams: (params: SearchParams) => void;
addToHistory: (history: SearchHistory) => void;
addBookmark: (bookmark: SearchBookmark) => void;
updateSettings: (settings: Partial<UserSettings>) => void;
}
export const useAppStore = create<AppStore>()(
persist(
(set) => ({
// Initial state
searchParams: {...},
history: [],
bookmarks: [],
templates: [],
settings: DEFAULT_SETTINGS,
// Actions
setSearchParams: (params) => set({ searchParams: params }),
addToHistory: (history) =>
set((state) => ({
history: [history, ...state.history].slice(0, 1000)
})),
addBookmark: (bookmark) =>
set((state) => ({
bookmarks: [...state.bookmarks, bookmark]
})),
updateSettings: (settings) =>
set((state) => ({
settings: { ...state.settings, ...settings }
}))
}),
{
name: 'ssp-storage',
partialize: (state) => ({
settings: state.settings,
bookmarks: state.bookmarks
})
}
)
);
```
**优势**:
- 集中式状态管理
- 内置持久化支持
- 极小的包体积 (~1KB)
- TypeScript 友好
- 无需 Provider 包裹
---
### 2. 模块化重构
**推荐目录结构**:
```
src/
├── core/ # 核心业务逻辑
│ ├── adapters/ # 搜索引擎适配器
│ │ ├── base.ts
│ │ ├── baidu.ts
│ │ ├── google.ts
│ │ └── factory.ts
│ ├── templates/ # 模板管理
│ │ ├── template-manager.ts
│ │ ├── builtin-templates.ts
│ │ └── template-validator.ts
│ ├── analytics/ # 统计分析
│ │ ├── analytics-service.ts
│ │ └── metrics.ts
│ └── suggestions/ # 智能推荐
│ ├── suggestion-engine.ts
│ └── pattern-rules.ts
│
├── features/ # 功能模块 (Feature-based)
│ ├── search/
│ │ ├── components/
│ │ ├── hooks/
│ │ ├── services/
│ │ └── types.ts
│ ├── history/
│ ├── bookmarks/
│ ├── comparison/
│ └── templates/
│
├── shared/ # 共享资源
│ ├── ui/ # UI 组件库
│ │ ├── Button/
│ │ ├── Input/
│ │ ├── Modal/
│ │ └── index.ts
│ ├── hooks/ # 自定义 Hooks
│ │ ├── useStorage.ts
│ │ ├── useTheme.ts
│ │ └── useShortcut.ts
│ ├── utils/ # 工具函数
│ │ ├── validators.ts
│ │ ├── formatters.ts
│ │ └── helpers.ts
│ └── constants/
│ ├── config.ts
│ └── defaults.ts
│
├── infrastructure/ # 基础设施层
│ ├── storage/ # 存储抽象层
│ │ ├── chrome-storage.ts
│ │ ├── indexed-storage.ts
│ │ └── storage-adapter.ts
│ ├── i18n/ # 国际化
│ │ ├── translations/
│ │ ├── config.ts
│ │ └── provider.tsx
│ ├── analytics/ # 数据上报
│ │ └── telemetry.ts
│ └── api/ # API 客户端
│ └── template-api.ts
│
├── stores/ # 全局状态管理
│ ├── app-store.ts
│ ├── ui-store.ts
│ └── user-store.ts
│
└── types/ # 全局类型定义
├── search.ts
├── template.ts
├── analytics.ts
└── index.ts
```
---
### 3. 存储层优化
**混合存储策略**:
```typescript
// src/infrastructure/storage/storage-adapter.ts
interface StorageAdapter {
get<T>(key: string): Promise<T | null>;
set<T>(key: string, value: T): Promise<void>;
remove(key: string): Promise<void>;
clear(): Promise<void>;
}
class HybridStorage implements StorageAdapter {
private chromeStorage: ChromeStorageAdapter;
private indexedDB: IndexedDBAdapter;
/**
* 智能存储选择
* - 小数据 (<5KB): Chrome Storage
* - 大数据 (≥5KB): IndexedDB
*/
async set<T>(key: string, value: T): Promise<void> {
const size = new Blob([JSON.stringify(value)]).size;
if (size < 5 * 1024) {
// 使用 Chrome Storage (快速,同步)
await this.chromeStorage.set(key, value);
} else {
// 使用 IndexedDB (大容量,异步)
await this.indexedDB.set(key, value);
}
}
async get<T>(key: string): Promise<T | null> {
// 先尝试 Chrome Storage
let value = await this.chromeStorage.get<T>(key);
// 如果不存在,尝试 IndexedDB
if (value === null) {
value = await this.indexedDB.get<T>(key);
}
return value;
}
}
```
**数据分层存储**:
| 数据类型 | 存储方式 | 容量 | 访问速度 |
|---------|---------|------|---------|
| 用户设置 | Chrome Storage | <1KB | 极快 |
| 搜索模板 | Chrome Storage | ~10KB | 快 |
| 搜索历史 (100条) | Chrome Storage | ~50KB | 快 |
| 搜索历史 (1000+条) | IndexedDB | 无限 | 中等 |
| 收藏夹 | IndexedDB | 无限 | 中等 |
| 统计数据 | IndexedDB | 无限 | 中等 |
---
### 4. 插件化系统
**插件接口设计**:
```typescript
// src/core/plugin-system/plugin.ts
interface SearchPlugin {
id: string;
name: string;
version: string;
description: string;
// 生命周期钩子
activate(context: PluginContext): void | Promise<void>;
deactivate(): void | Promise<void>;
// 功能扩展点
provides?: {
adapters?: SearchEngineAdapter[];
templates?: SearchTemplate[];
syntaxRules?: SyntaxRule[];
uiComponents?: React.ComponentType[];
};
}
interface PluginContext {
// 访问核心服务
getService<T>(serviceName: string): T;
// 注册功能
registerAdapter(adapter: SearchEngineAdapter): void;
registerTemplate(template: SearchTemplate): void;
registerCommand(command: Command): void;
// 事件系统
on(event: string, handler: Function): void;
emit(event: string, data: any): void;
}
// 插件管理器
class PluginManager {
private plugins: Map<string, SearchPlugin> = new Map();
async register(plugin: SearchPlugin): Promise<void> {
// 验证插件
this.validatePlugin(plugin);
// 沙箱隔离
const context = this.createSandbox(plugin);
// 激活插件
await plugin.activate(context);
// 保存插件
this.plugins.set(plugin.id, plugin);
}
private createSandbox(plugin: SearchPlugin): PluginContext {
return {
getService: (name) => this.getService(name),
registerAdapter: (adapter) => this.registerAdapter(plugin.id, adapter),
// ...
};
}
}
```
**示例插件**:
```typescript
// plugins/github-enhanced/index.ts
export const GitHubEnhancedPlugin: SearchPlugin = {
id: 'github-enhanced',
name: 'GitHub Enhanced Search',
version: '1.0.0',
description: 'Enhanced GitHub search with advanced filters',
activate(context) {
// 注册增强的 GitHub 适配器
context.registerAdapter(new GitHubEnhancedAdapter());
// 注册预设模板
context.registerTemplate({
id: 'github-stars-1k',
name: 'GitHub 高星项目',
description: '搜索 1000+ stars 的项目',
category: 'tech',
params: {
engine: 'github',
customFilters: { minStars: 1000 }
}
});
// 监听搜索事件
context.on('search:execute', (params) => {
console.log('GitHub search:', params);
});
},
deactivate() {
console.log('GitHub Enhanced plugin deactivated');
}
};
```
---
## 技术栈建议
### 状态管理
**推荐**: Zustand
**理由**: 轻量、简单、TypeScript 友好
### 路由管理
**推荐**: 无需路由库 (单页扩展)
**理由**: Popup 和 Options 页面独立,无需复杂路由
### UI 组件库
**推荐**: 继续使用 Tailwind CSS + 自定义组件
**理由**: 轻量、灵活、定制性强
### 图表库 (统计功能)
**推荐**: Chart.js 或 Recharts
**理由**: 轻量、易用、图表丰富
### 测试框架
**推荐**: 继续使用 Jest + Playwright
**理由**: 已有配置,生态成熟
---
## 性能优化建议
### 1. 代码分割
```typescript
// vite.config.ts
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
'vendor': ['react', 'react-dom'],
'adapters': [
'./src/services/adapters/baidu.ts',
'./src/services/adapters/google.ts',
// ...
]
}
}
}
}
});
```
### 2. 懒加载
```typescript
// 组件懒加载
const TemplateMarketplace = lazy(() => import('./features/templates/Marketplace'));
const AnalyticsDashboard = lazy(() => import('./features/analytics/Dashboard'));
// 适配器懒加载
const getAdapter = async (engine: SearchEngine) => {
const module = await import(`./core/adapters/${engine}.ts`);
return new module.default();
};
```
### 3. 虚拟滚动
```typescript
// 历史记录虚拟滚动
import { FixedSizeList } from 'react-window';
<FixedSizeList
height={600}
itemCount={history.length}
itemSize={80}
width="100%"
>
{({ index, style }) => (
<HistoryItem style={style} item={history[index]} />
)}
</FixedSizeList>
```
---
## 安全性建议
### 1. XSS 防护
```typescript
// 用户输入清理
import DOMPurify from 'dompurify';
const sanitizedInput = DOMPurify.sanitize(userInput);
```
### 2. CSP 配置
```json
// manifest.json
{
"content_security_policy": {
"extension_pages": "script-src 'self'; object-src 'self'; style-src 'self' 'unsafe-inline'"
}
}
```
### 3. 权限最小化
```json
{
"permissions": [
"storage",
"activeTab"
],
"optional_permissions": [
"downloads"
]
}
```
---
## 迁移路径
### Phase 1: 状态管理迁移
1. 安装 Zustand
2. 创建 store 定义
3. 逐个组件迁移到 Zustand
4. 移除旧的 useState
### Phase 2: 模块化重构
1. 创建新目录结构
2. 迁移核心业务逻辑
3. Feature-based 模块划分
4. 清理旧代码
### Phase 3: 存储层升级
1. 实现 HybridStorage
2. 数据迁移脚本
3. 灰度发布和验证
### Phase 4: 插件系统
1. 插件接口设计
2. PluginManager 实现
3. 示例插件开发
4. 文档和 SDK
---
**相关文档**: [实施路线图](./06-implementation-roadmap.md) | [开发规范](./dev-guidelines.md)