镜像自地址
https://github.com/lhly/search-syntax-pro.git
已同步 2026-10-20 22:37:48 +08:00
- 新增全局快捷键支持(Ctrl+Shift+F/Command+Shift+F) - 添加快捷键命令类型定义(chrome-commands.d.ts) - 实现版本管理工具(version.ts) - 新增模板和快捷键相关类型定义 - 优化搜索表单组件支持外部控制高级选项 - 新增引擎选择器组件(EngineSelector) - 改进全局样式和按钮样式 - 在设置页面新增快捷键配置选项 - 添加测试页面和调试工具 - 更新文档包括发布说明和测试指南 本次提交包含多项功能新增和优化,主要围绕快捷键功能的实现和用户体验提升。
12 KiB
12 KiB
架构设计建议
文档版本: v1.0 更新日期: 2025-11-10
当前架构分析
优势
✅ 适配器模式 - 每个搜索引擎独立适配器,扩展性强 ✅ TypeScript 类型系统 - 完善的类型定义和接口 ✅ React 组件化 - UI 组件清晰,可复用性好 ✅ Vite 构建 - 快速的开发和构建体验
待改进
❌ 状态管理分散 - useState 分散在各组件 ❌ 存储层单一 - 仅使用 Chrome Storage API ❌ 缺少插件化 - 功能硬编码,难以扩展 ❌ 模块耦合 - 业务逻辑和 UI 耦合
架构升级方案
1. 状态管理升级
当前方案:
// 分散在各组件
const [searchParams, setSearchParams] = useState<SearchParams>({...});
const [history, setHistory] = useState<SearchHistory[]>([]);
const [settings, setSettings] = useState<UserSettings | null>(null);
推荐方案: Zustand (轻量级状态管理)
// 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. 存储层优化
混合存储策略:
// 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. 插件化系统
插件接口设计:
// 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),
// ...
};
}
}
示例插件:
// 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. 代码分割
// 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. 懒加载
// 组件懒加载
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. 虚拟滚动
// 历史记录虚拟滚动
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 防护
// 用户输入清理
import DOMPurify from 'dompurify';
const sanitizedInput = DOMPurify.sanitize(userInput);
2. CSP 配置
// manifest.json
{
"content_security_policy": {
"extension_pages": "script-src 'self'; object-src 'self'; style-src 'self' 'unsafe-inline'"
}
}
3. 权限最小化
{
"permissions": [
"storage",
"activeTab"
],
"optional_permissions": [
"downloads"
]
}
迁移路径
Phase 1: 状态管理迁移
- 安装 Zustand
- 创建 store 定义
- 逐个组件迁移到 Zustand
- 移除旧的 useState
Phase 2: 模块化重构
- 创建新目录结构
- 迁移核心业务逻辑
- Feature-based 模块划分
- 清理旧代码
Phase 3: 存储层升级
- 实现 HybridStorage
- 数据迁移脚本
- 灰度发布和验证
Phase 4: 插件系统
- 插件接口设计
- PluginManager 实现
- 示例插件开发
- 文档和 SDK