# React 集成
For React Projects

React 包提供原生组件体验。组件内部通过共享 core 能力直接挂载完整预览器, props、事件、ref、调试链路都留在 React 项目内。

## 安装 新项目优先使用标准包名: ```bash npm install @file-viewer/react @file-viewer/preset-office ``` 历史包名仍同步维护: ```bash npm install @flyfish-group/file-viewer-react ``` React 16.8 / 17 老项目可以使用 `@file-viewer/react-legacy`,props、options 和 controller 语义保持一致。 如果你只安装 `@file-viewer/react`,得到的是最轻的 React 原生组件和 core 基础能力;PDF、Office、CAD、Typst、压缩包等格式能力需要安装对应 preset 或 renderer。非 Vite 项目优先通过 `options.preset` 显式注入: ```tsx import officePreset from '@file-viewer/preset-office' const viewerOptions = { preset: officePreset, rendererMode: 'replace', theme: 'light', toolbar: { position: 'bottom-right' } } ``` Vite 项目可以额外加入插件,插件会自动发现已安装的 `@file-viewer/preset-*` 并省去手动 import: ```bash npm install -D @file-viewer/vite-plugin ``` ```ts import { defineConfig } from 'vite' import { fileViewerRenderers } from '@file-viewer/vite-plugin' export default defineConfig({ plugins: [ fileViewerRenderers({ copyAssets: true }) ] }) ``` 重度用户需要完整能力时,把 `@file-viewer/preset-office` 换成 `@file-viewer/preset-all` 即可: ```bash npm install @file-viewer/react @file-viewer/preset-all ``` 如果希望一个包直接获得完整格式矩阵,使用 full 包即可。React 18 / 19 使用 `@file-viewer/react-full`,React 16.8 / 17 使用 `@file-viewer/react-legacy-full`: ```bash npm install @file-viewer/react-full ``` ```tsx import FileViewer from '@file-viewer/react-full' export function Preview() { return (
) } ``` 需要更强自定义时,再配置 `formats`、`renderers`、`scan:true`、`inject:false` 或 `chunkStrategy:'renderer'`;默认推荐保持 `fileViewerRenderers({ copyAssets:true })`,让插件根据已安装 preset 自动激活能力。 ## 最短示例 ```tsx import FileViewer from '@file-viewer/react' import officePreset from '@file-viewer/preset-office' export function Preview() { return (
{ console.log(event.type, event.payload) }} options={{ preset: officePreset, rendererMode: 'replace', theme: 'light', toolbar: { position: 'bottom-right' }, watermark: { text: '内部预览', opacity: 0.14 }, archive: { cache: true, workerTimeoutMs: 30000 } }} />
) } ``` 父容器必须有明确高度;预览器会填满父容器。 ## 预览鉴权文件 如果文件必须由宿主系统鉴权下载,请先拿到 `Blob`,再传给组件。传 `Blob` 或 `ArrayBuffer` 时一定要同时传 `name`,用于识别扩展名。 ```tsx import { useEffect, useState } from 'react' import FileViewer, { type FileRef } from '@file-viewer/react' export function PrivatePreview() { const [file, setFile] = useState() useEffect(() => { fetch('/api/files/contract', { credentials: 'include' }) .then(response => response.blob()) .then(setFile) }, []) return (
) } ``` ## 移动端 / H5 / React Native WebView React 组件支持手机浏览器和 H5 WebView。关键是让承载容器拥有稳定高度,并把通用工具栏放到右下角,减少对文档正文的遮挡。PDF、Word、PPTX、图片、CAD、XMind、Mermaid / PlantUML 等渲染链路都会优先按当前可用宽度做自适应;用户仍可通过组件内部的缩放 provider 做放大、缩小和还原,不建议在外层直接用 CSS `transform: scale()`。 ```tsx import FileViewer from '@file-viewer/react' import officePreset from '@file-viewer/preset-office' export function MobilePreview() { return (
) } ``` React Native 不能直接运行 DOM 版组件,请在 `WebView` 中承载 H5 页面或 `@file-viewer/web-full` IIFE 页面,再通过业务桥接传入文件 URL、鉴权 token 或下载后的 Blob URL。推荐把预览页设置为独立路由,并开启 WebView 的 JavaScript、DOM Storage 和文件下载能力;如果业务使用严格 CSP 或离线内网环境,仍按 Web 方案运行 `file-viewer-copy-assets` 或使用 `@file-viewer/vite-plugin` 的 `copyAssets:true` 自托管 Worker / WASM / 字体资源。 ## 可用参数 | 参数 | 类型 | 说明 | | --- | --- | --- | | `url` | `string` | 可直接被浏览器访问的文件地址 | | `file` | `File \| Blob \| ArrayBuffer` | 本地文件或鉴权下载后的二进制内容,优先级高于 `url` | | `name` | `string` | `Blob` / `ArrayBuffer` 的文件名,建议带扩展名 | | `options` | `FileViewerOptions` | 主题、操作栏、水印、搜索、统一缩放、打印、导出、压缩包 Worker / 缓存 / 体积限制等运行配置 | | `onEvent` | `(event) => void` | 接收加载、卸载、操作能力、搜索状态和当前位置变化 | `options.beforeOperation`、`options.hooks` 等函数型配置可以直接传入 React 组件。下载、打印、导出、缩放等按钮操作会在预览器内部根据文件类型动态显隐,并在执行前触发权限校验钩子。 ## 本地调试 仓库内置了 React + 纯 JS + Vue3 + jQuery + Svelte 多入口演示: ```bash pnpm dev:components ``` 打开页面后,React 面板应当能显示同一份本地 DOCX 示例,并能触发生命周期事件、搜索、缩放和操作按钮状态变化。 ## 自托管资源 React 标准接入不需要额外配置静态页面地址。只有当你希望固定 Worker、WASM 或示例文件的访问路径时,才需要复制资源: ```bash npx file-viewer-copy-assets ./public/file-viewer ``` 压缩包、CAD、Typst 等重型格式都会按需加载;部署路径特殊时,可以在 `options.archive`、`options.typst` 或 CAD 相关参数中指定自托管资源地址。