Skip to content

cttailearn/FileCompare

Repository files navigation

文件比对工具(纯前端网页)开发文档

1. 项目概述

1.1 项目简介

开发一个运行在浏览器中的多格式文件比对工具,支持 Excel、Word、PDF、文本文件、代码文件及配置文件的差异比对。用户在网页中选择两个文件后,应用在本地浏览器内完成解析、比对、可视化展示与统计报告生成。

本项目不包含后端服务:不上传文件、不依赖服务器存储与计算,部署形态为静态站点(HTML/CSS/JS)。

1.2 设计边界(重要)

  • 仅靠网页实现:解析、比对、渲染、导出均在浏览器侧完成
  • 默认离线可用:页面加载后即可断网使用(可选 PWA 缓存)
  • 隐私优先:不将文件内容发送到网络;历史记录与配置仅保存在本机浏览器存储
  • 受浏览器限制:大文件受内存、线程与单页渲染性能影响,需要分块与渐进式展示

1.3 核心目标

  • 支持多种文件格式的统一比对体验
  • 提供清晰的差异标记和直观的可视化展示
  • 生成详细的比对统计报告
  • 确保用户友好的交互界面

2. 功能需求

2.1 核心功能

  1. 多格式文件上传

    • 支持批量选择或拖拽上传
    • 文件格式限制:.xlsx/.xls, .docx/.doc, .pdf, .txt, .json, .xml, .yaml, .yml, .js, .py, .java等
    • 最大文件大小限制:50MB
    • 不上传服务器:仅在浏览器内读取 File 对象
  2. 文件解析与内容提取

    • Excel:解析工作表、单元格值/公式/格式(可配置是否比较格式)
    • Word:提取段落文本、样式标记、表格数据(可配置是否比较格式/忽略图片)
    • PDF:按页提取文本与位置信息,尽量保留段落与换行结构
    • 文本/代码:保留原始格式、行号,支持语法高亮(可选)
    • 结构化配置:JSON/YAML/XML 解析成对象后进行结构化比对(顺序无关)
  3. 智能比对引擎

    • 文本内容比对(基于行/单词/字符)
    • 结构化数据比对(Excel表格、Word表格)
    • 格式差异检测(字体、颜色、样式等)
    • 语义相似度分析(可选扩展)
  4. 差异可视化

    • 并排对比视图
    • 差异高亮显示(添加、删除、修改)
    • 差异位置导航
    • 代码文件的语法高亮(可选:highlight.js 或 Monaco Editor)
  5. 统计报告

    • 差异数量统计
    • 相似度百分比
    • 修改类型分布
    • 导出统计报告

2.2 辅助功能

  1. 比对历史记录
  2. 比对配置选项(忽略空格、大小写敏感等)
  3. 结果导出(HTML、文本;PDF 建议使用浏览器打印为 PDF)
  4. 书签和批注功能

3. 技术架构

3.1 前端架构(Vue 3,纯前端)

├── src/
│   ├── components/
│   │   ├── FileUploader.vue      # 文件上传组件
│   │   ├── FileComparator.vue    # 主比对组件
│   │   ├── DiffViewer.vue        # 差异展示组件
│   │   ├── StatsPanel.vue        # 统计面板组件
│   │   └── NavigationBar.vue     # 差异导航组件
│   ├── views/
│   │   ├── HomeView.vue          # 主页
│   │   └── HistoryView.vue       # 历史记录页
│   ├── utils/
│   │   ├── fileParser.js         # 文件解析工具
│   │   ├── diffEngine.js         # 比对算法
│   │   └── exportUtils.js        # 导出工具
│   ├── store/
│   │   └── comparisonStore.js    # 状态管理
│   ├── workers/
│   │   ├── parse.worker.js        # 解析任务(可选:Web Worker)
│   │   └── diff.worker.js         # 比对任务(可选:Web Worker)
│   └── assets/
│       └── styles/               # 样式文件

3.2 纯前端数据流(推荐)

  1. 用户选择两个文件(File/Blob)
  2. 主线程做轻量校验(大小/扩展名/MIME)
  3. 解析与比对放入 Web Worker(大文件必选),主线程仅负责 UI 渲染与交互
  4. 比对结果采用分页/分段结构返回,支持渐进式渲染与导航
  5. 配置与历史记录存 IndexedDB(或 LocalStorage,视数据量而定)

3.3 关键依赖库(浏览器侧)

  • Vue 3 + Composition API
  • Element PlusAnt Design Vue:UI 组件库(二选一)
  • xlsx:Excel 解析(读取工作表/单元格)
  • mammoth:Word(docx)文本与结构提取(浏览器侧)
  • pdfjs-dist:PDF 解析与文本提取(推荐 PDF.js 发行包)
  • diff-match-patchjsdiff:文本差异算法
  • highlight.jsmonaco-editor:代码展示与语法高亮(可选)
  • js-yaml:YAML 解析(可选)
  • fast-xml-parser:XML 解析(可选)

不需要也不引入 HTTP 请求库:默认无后端、无上传接口。

4. 详细设计

4.1 文件上传模块

4.1.1 组件设计

  • 支持拖拽和点击上传
  • 实时文件验证(格式、大小)
  • 上传进度显示
  • 已选文件预览和删除

补充建议:

  • 使用 input[type=file] 与拖拽的 DataTransfer 统一产出 File
  • 对大文件显示“读取/解析/比对”三段进度,而不是网络上传进度

4.1.2 状态管理

{
  files: [
    {
      id: 'uuid',
      name: 'file1.xlsx',
      type: 'excel',
      size: 10240,
      content: {}, // 解析后的内容
      status: 'reading' // reading, parsed, error
    }
  ],
  comparison: {
    status: 'idle', // idle, comparing, done, error
    result: null,
    config: {} // 比对配置
  }
}

4.2 文件解析模块

4.2.1 Excel文件解析策略

  1. 数据提取

    • 读取所有工作表
    • 提取单元格数据(值、公式、格式)
    • 识别合并单元格
    • 保留行/列索引
    • 大文件策略:按工作表分段解析,优先解析视口相关区域(可选增强)
  2. 数据结构化

    {
      sheets: [
        {
          name: 'Sheet1',
          data: [[cell1, cell2, ...], ...],
          merges: [],
          dimensions: { rows: 100, cols: 26 }
        }
      ],
      metadata: { author, createdDate, ... }
    }

4.2.2 Word文件解析

  • 提取段落文本和样式
  • 表格数据转换
  • 图片占位符处理
  • 列表和标题识别

4.2.3 PDF文件解析

  • 文本内容提取(按页)
  • 页面分割与页码映射
  • 位置/字体等信息按需保留(用于更接近原排版的换行与段落)
  • 表格识别(可选扩展,优先以文本为主)

4.2.4 文本/代码解析

  • 默认按行保存原始文本与行号
  • 可选“忽略行尾空格/忽略空行/统一换行符”为预处理步骤

4.3 比对引擎设计

4.3.1 比对算法选择

  1. 文本比对

    • 使用Myers差分算法
    • 支持行级、单词级、字符级比对
    • 考虑空格和换行符处理
  2. 表格比对

    • 行列对齐算法
    • 单元格内容对比
    • 格式差异检测
  3. 配置文件比对

    • 根据文件类型(JSON、YAML)进行结构化比对
    • 键值对顺序无关比对
    • 输出差异路径(如 a.b[2].c)用于导航与统计

4.3.2 差异标记系统

interface DiffResult {
  type: 'added' | 'deleted' | 'modified' | 'unchanged';
  content: string;
  position: {
    line?: number;
    row?: number;
    col?: number;
    page?: number;
  };
  details?: {
    oldValue?: string;
    newValue?: string;
    formatChanges?: Array<{property: string, old: any, new: any}>;
  };
}

补充:为支持“渐进式渲染 + 导航”,推荐将结果组织为“文件级 -> 片段级 -> diff 条目”的树形结构,避免一次性把全量 diff 展示在 DOM 中。

4.4 可视化展示设计

4.4.1 并排对比视图

  • 左右面板同步滚动
  • 差异高亮颜色编码
    • 绿色:新增内容
    • 红色:删除内容
    • 黄色:修改内容
  • 行号/单元格引用显示
  • 大结果集渲染:虚拟列表/分段渲染,避免一次性渲染上万行

4.4.2 统计面板设计

  • 环形图:差异类型分布
  • 数字卡片:关键统计数据
  • 可展开的详细报告

4.4.3 导航功能

  • 差异列表快速跳转
  • 上一处/下一处差异导航
  • 书签功能

4.5 配置选项

const comparisonConfig = {
  // 通用配置
  ignoreWhitespace: true,
  caseSensitive: false,
  ignoreEmptyLines: true,
  
  // 文件类型特定配置
  excel: {
    ignoreFormatting: false,
    compareFormulas: true,
    sheetMatching: 'byName' // byName, byIndex
  },
  
  word: {
    compareFormatting: true,
    ignoreImages: true
  },
  
  code: {
    syntaxAware: true,
    ignoreComments: false,
    tabSize: 4
  }
};

5. 用户界面设计

5.1 页面布局

┌─────────────────────────────────────────────────────┐
│  Header:Logo、导航菜单、用户信息                   │
├─────────────────────────────────────────────────────┤
│  │                                                 │
│  │  上传区域                                      │
│  │  ┌─────────────┐  ┌─────────────┐             │
│  │  │  文件1上传  │  │  文件2上传  │             │
│  │  └─────────────┘  └─────────────┘             │
│  │                                                 │
│  │  配置面板                                      │
│  │  [ ] 忽略空格  [ ] 忽略大小写 ...              │
│  │                                                 │
│  │  比对按钮                                      │
│  │  [       开始比对        ]                     │
│  │                                                 │
│ 主  ──────────────────────────────────────        │
│  │                                                 │
│ 内  结果展示区                                    │
│  │  ┌─────────────────┬─────────────────┐        │
│ 容   │  文件1内容     │  文件2内容     │        │
│ 区   │  差异高亮显示  │  差异高亮显示  │        │
│  │   │                │                │        │
│  │   │                │                │        │
│  │   └─────────────────┴─────────────────┘        │
│  │                                                 │
│  │  统计面板(可折叠)                            │
│  │  ┌─────────────────────────────────────┐      │
│  │  │  差异统计:添加X处,删除Y处...      │      │
│  │  └─────────────────────────────────────┘      │
│  │                                                 │
│  │  操作工具栏                                    │
│  │  [导出] [下一处差异] [添加批注] ...            │
│  │                                                 │
└─────────────────────────────────────────────────────┘

5.2 响应式设计

  • 桌面端:完整功能展示
  • 平板端:自适应布局
  • 移动端:单列视图,简化功能

6. 性能优化策略

6.1 大文件处理

  • 分块读取和比对
  • 虚拟滚动技术
  • 懒加载差异内容
  • Web Worker进行后台解析与比对(主线程保持交互流畅)
  • 结果分页/分段:只在需要时生成与渲染对应片段

6.2 内存管理

  • 及时释放不再使用的文件内容
  • 限制同时比对的文件大小
  • 渐进式结果展示
  • Worker 与主线程之间传输时,优先传结构化摘要或使用可转移对象(可选优化)

6.3 用户体验优化

  • 比对进度指示器
  • 可中断的比对操作
  • 本地缓存比对结果
  • 快捷键支持

7. 测试策略

7.1 测试范围

  1. 单元测试

    • 文件解析函数
    • 比对算法
    • 工具函数
  2. 组件测试

    • 上传组件功能
    • 比对交互逻辑
    • 差异显示正确性
  3. 集成测试

    • 完整比对流程
    • 多格式文件支持
    • 错误处理
  4. 性能测试

    • 大文件处理能力
    • 内存使用情况
    • 响应时间

7.2 测试数据准备

  • 各种格式的样本文件
  • 包含不同类型差异的测试用例
  • 边界情况测试文件

8. 部署与维护

8.1 构建配置

  • 静态站点构建(建议使用 Vite 或同等工具链)
  • 代码分割和懒加载(按格式解析器拆包)
  • 静态资源优化(字体/高亮主题按需加载)
  • 可选 PWA:离线缓存与版本更新策略(不影响“无后端”前提)

8.2 浏览器兼容性

  • 现代浏览器支持(Chrome 80+, Firefox 75+, Edge 80+)
  • 渐进增强策略
  • 降级方案(对于不支持的文件格式)

9. 后续扩展规划

9.1 短期增强

  1. 更多文件格式支持(PPT、图片OCR文本)
  2. 局域网点对点协同(WebRTC,可选扩展,仍不引入后端)
  3. 批量比对功能
  4. 插件系统

10. 风险评估与缓解

10.1 技术风险

  1. 大文件处理性能

    • 缓解:分块处理,进度反馈,超时设置
  2. 文件解析准确性

    • 缓解:多解析库备选,手动解析选项
  3. 浏览器内存限制

    • 缓解:文件大小限制,优化算法

10.2 安全考虑

  1. 文件处理在本地浏览器完成:不上传、不落盘(除非用户主动导出/保存)
  2. 隐私保护:历史记录与配置仅保存在本地浏览器存储,可提供“一键清除”能力
  3. 依赖安全:锁定依赖版本,避免引入会请求外网的资源(如在线高亮/字体)
  4. 防御型渲染:对导出 HTML 做内容转义,避免将文件内容当作可执行脚本插入页面

About

文件比对工具,支持excel,word,pdf等文件,也支持文本,代码,配置文件

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors