如何在Tauri+SvelteKit应用中配置Pdfjs-dist的Worker?
Tauri + SvelteKit 中配置 pdfjs Worker 离线方案
针对你在发布版中无法加载pdfjs Worker的问题,以下两种离线可用的方案可以解决:
方案一:Blob URL 加载(推荐,无需额外资源配置)
直接将Worker源代码转为Blob URL,完全脱离文件路径依赖,开发和发布版通用:
import pdfjsLib from 'pdfjs-dist'; // 以raw形式导入Worker源代码 import pdfjsWorkerCode from 'pdfjs-dist/build/pdf.worker.mjs?raw'; // 创建Blob并生成URL const workerBlob = new Blob([pdfjsWorkerCode], { type: 'application/javascript' }); const workerUrl = URL.createObjectURL(workerBlob); // 配置pdfjs的Worker路径 pdfjsLib.GlobalWorkerOptions.workerSrc = workerUrl; // 正常解析PDF const myPdf = await pdfjsLib.getDocument(buffer).promise; // 注意:在PDF处理完成后,可释放Blob URL避免内存泄漏 // URL.revokeObjectURL(workerUrl);
方案二:Tauri 静态资源协议加载
将Worker文件作为静态资源,通过Tauri的tauri://asset协议访问:
- 复制
node_modules/pdfjs-dist/build/pdf.worker.mjs到SvelteKit的static/pdf/目录下; - 在代码中区分开发和发布环境配置路径:
import pdfjsLib from 'pdfjs-dist'; // 开发环境用原URL方式,发布环境用Tauri资产协议 const workerSrc = import.meta.env.PROD ? 'tauri://asset/pdf/pdf.worker.mjs' : new URL('pdfjs-dist/build/pdf.worker.mjs', import.meta.url).pathname; pdfjsLib.GlobalWorkerOptions.workerSrc = workerSrc; const myPdf = await pdfjsLib.getDocument(buffer).promise;
为什么之前的方法失效?
Tauri发布版使用tauri://协议运行,常规new URL()生成的路径无法匹配Tauri的资源加载规则;?url导入的路径在打包后也无法被Tauri正确解析,导致Worker加载失败。
内容的提问来源于stack exchange,提问作者Joss
相关产品推荐
相关产品推荐

