react-virtualized-diff
v0.1.6
Published
High-performance React diff viewer for large files
Readme
react-virtualized-diff
High-performance React diff viewer with virtualization for large text/code files.
At a glance
- Built for large files (
10k+lines) and long diff lists. - Designed for embedded code review UIs (PR/MR pages), internal review systems, and IDE plugin frontends.
- Positioning & personas: https://github.com/Zhang-JiahangH/react-virtualized-diff/blob/main/docs/positioning.md
Positioning
| Option | Performance (large files) | Bundle size | Customizability | React integration cost |
| --- | --- | --- | --- | --- |
| react-virtualized-diff | High (virtualized rendering) | Small-to-medium | High | Low |
| Traditional non-virtualized diff components | Medium-to-low | Medium | Medium | Low |
| In-house diff + virtualization | Depends on implementation | Uncertain | High | High |
- Demo: https://www.zhangjiahang.com/react-virtualized-diff
- Changelog: https://github.com/Zhang-JiahangH/react-virtualized-diff/blob/main/CHANGELOG.md
- Benchmark: https://github.com/Zhang-JiahangH/react-virtualized-diff/blob/main/benchmark-results/results.md
Install
pnpm add react-virtualized-diff
# or npm i react-virtualized-diff
# or yarn add react-virtualized-diffUsage
import { SimpleDiffViewer } from 'react-virtualized-diff';
export function App() {
return (
<SimpleDiffViewer
original={'line 1\nline 2'}
modified={'line 1\nline 2 changed'}
contextLines={2}
height={500}
/>
);
}API
SimpleDiffViewer props (recommended for 80% of cases)
original: stringmodified: stringheight?: number | string(default500)splitView?: boolean(defaulttrue)showDiffOnly?: boolean(defaulttrue)contextLines?: number(default2)hideLineNumbers?: boolean(defaultfalse)useDarkTheme?: boolean(defaultfalse)locale?: DiffViewerLocale
DiffViewer / AdvancedDiffViewer props
original?: stringmodified?: stringoldValue?: string(compatibility API)newValue?: string(compatibility API)splitView?: boolean(defaulttrue)showDiffOnly?: boolean(defaulttrue)contextLines?: number(default2)extraLinesSurroundingDiff?: number(compatibility alias)hideLineNumbers?: boolean(defaultfalse)highlightLines?: Array<'L-n' | 'R-n' | range>onLineNumberClick?: (lineId) => voidrenderContent?: (line: string) => ReactNodecompareMethod?: "CHARS" | "WORDS" | "WORDS_WITH_SPACE" | "LINES" | "TRIMMED_LINES" | "SENTENCES" | "CSS"disableWordDiff?: booleanleftTitle?: ReactNoderightTitle?: ReactNodelinesOffset?: number(default0)useDarkTheme?: booleanstyles?: Partial<DiffViewerStyles>codeFoldMessageRenderer?: ({ hiddenCount, expanded }) => ReactNoderef?.resetCodeBlocks(): voidheight?: number | string(default500)locale?: DiffViewerLocalelanguage?: string(reserved for future use)
DiffViewerLocale
collapse?: stringshowMoreLines?: (count: number) => string
License
MIT
