基于React的两种方式使用React-pdf

官网提供两种方式使用,但是直接使用可能存在问题,下面是官网提供的:

javascript 复制代码
第一种方式:这段脚本是将node_modules/pdfjs-dist/build文件夹下的pdf.worker.mjs拷贝到项目的项目的输出文件夹

import path from 'node:path';
import fs from 'node:fs';

const pdfjsDistPath = path.dirname(require.resolve('pdfjs-dist/package.json'));
const pdfWorkerPath = path.join(pdfjsDistPath, 'build', 'pdf.worker.mjs');

fs.cpSync(pdfWorkerPath, './dist/pdf.worker.mjs', { recursive: true });


第二种方式:这里需要在使用react-pdf的组件中引入
import { pdfjs } from 'react-pdf';

pdfjs.GlobalWorkerOptions.workerSrc=`//unpkg.com/pdfjsdist@${pdfjs.version}/build/pdf.worker.min.mjs`;

首先存在的问题:

  1. 使用的pnpm的话,需要额外创建配置一个.npmrc文件,复制ist-pattern[]=pdfjs-dist进去。因为pnpm 的包管理方式与 npm/yarn 不同。它使用一种类似符号链接的机制,按默认方式将依赖安装在嵌套的 node_modules 目录结构中,以节省磁盘空间和加速安装。然而,某些包(比如 pdfjs-dist)在项目中可能要求依赖位于顶层的 node_modules。否则,它们会因为路径问题找不到依赖,从而导致运行时错误。

  2. 使用脚本拷贝的时候可能会出现报错,主要是因为package.json 文件中指定使用的 "type"类型。如果是"module",这意味着默认情况下所有 .js 文件都被当作 ES 模块 处理,而 require 是 CommonJS 的语法,不能直接用于 ES 模块。如果没有定义type类型,会自动根据脚本的代码判断使用哪种语法。而官网提供的既有import也有require。将脚本文件定义.js .cjs .mjs都会报错。解决办法;脚本文件类型定义为copyPdfWorker.cjs

    javascript 复制代码
    import path from 'node:path';
    import fs from 'node:fs';
    
    替换为:使用的是CommonJS语法
    const path = require('node:path');
    const fs = require('node:fs');
    
    还需要注意拷贝的文件夹dist是否存在,可以将文件拷贝在public下

    package.json 中添加一个脚本,运行这个拷贝文件的逻辑

    javascript 复制代码
    {
      "scripts": {
        "copy-pdf-worker": "node scripts/copyPdfWorker.cjs"
      }
    }

    运行脚本:pnpm run copy-pdf-worker

  3. 第二个问题是使用脚本拷贝,更简单的方式直接手动复制文件就行

  4. 拷贝之后组件中引入的问题,第一种方式也需要这一步

    javascript 复制代码
    import { pdfjs } from 'react-pdf';
    
    // 设置 Worker 路径为公共目录中的路径就是public下
    pdfjs.GlobalWorkerOptions.workerSrc = '/pdf.worker.mjs';
  5. 第二种方式直接使用可能会报错,如果你的项目在 HTTPS 下运行,确保 workerSrc 的路径也使用 HTTPS,否则会报错。

方法 1: 将 pdf.worker.mjs 文件拷贝到公共目录

你需要手动将 pdf.worker.mjs 文件从 pdfjs-dist 包中复制到你的项目的输出目录(如 dist 文件夹)。解决方案在上面已经提供。

方法 2: 使用外部 CDN,不要操作 pdf.worker.mjs,直接在组件中引入下面代码

如果你不想将 pdf.worker.mjs 文件复制到公共目录,可以直接使用公共 CDN(比如 unpkgcdnjs)提供的文件。

javascript 复制代码
import { pdfjs } from 'react-pdf';

// 使用 unpkg CDN 提供的 Worker 文件
pdfjs.GlobalWorkerOptions.workerSrc =`//unpkg.com/pdfjsdist@${pdfjs.version}/build/pdf.worker.min.mjs`;


 如果你的项目在 HTTPS 下运行,确保 workerSrc 的路径也使用 HTTPS,否则会报错。
pdfjs.GlobalWorkerOptions.workerSrc =`https://unpkg.com/pdfjsdist@${pdfjs.version}/build/pdf.worker.min.mjs`;

对比两种方法:

方法 优点 缺点
拷贝到公共目录 本地文件加载更快,不依赖网络;更加稳定。 需要额外的脚本管理文件复制。
使用外部 CDN 无需额外操作,快速实现。 依赖外部网络,若 CDN 不可用或慢,可能会出问题。
相关推荐
从不讲道理20 分钟前
使用vue3+el-form实现动态新增名称,值,并对名称进行必填校验
前端·javascript·vue.js
小二·22 分钟前
详细介绍VUE,带你了解VUE!!!
前端·javascript·vue.js
徐同保23 分钟前
nginx vue history模式 try_files
前端
ABCHERRY733 分钟前
uniapp发布成harmony时报错找不到@uni_modules/uni-push包跟这个包@uni_modules/hmr-for-uni-app
前端·uni-app·打包·harmony
微网兔子1 小时前
在网页跑3D多人互动之渲染效能瓶颈
服务器·前端·网络·c++·3d·unity·架构
锐小制1 小时前
RidgeUI页面脚本开发系列:获取照片中的中国诗词
前端·javascript
ssshooter1 小时前
浏览器 67 个实用 Debug 技巧
前端·javascript·debug
摆烂为不摆烂1 小时前
JavaScript中异步方法原理与实现3.21
前端
不想说话的麋鹿1 小时前
「项目实战」从0搭建NestJS后端服务(三):环境变量的配置和CORS处理
前端·node.js
用户1911122668401 小时前
React Native iOS报Node版本错误
前端