pdf.js(pdfdist)踩坑workerSrc报错pdf.worker.mjs无法正确获取

目录

最近用pdf.js踩坑了几个点,其实本质都是workerSrc配置的问题,pdf.js引用了.mjs文件但又没做好处理,导致需要我们额外单独配置这一块。

第一次遇到的时候我习惯性交给AI,AI按照搜索结果修改了workerSrc配置,解决了引用的为题,但是最终部署服务器还是不能用。

后面还是人工花了些功夫把这个点搞明白,然后手动改了nginx配置才修复。

AI还得加油啊!你以后可是我们的赛博牛马

这里有两个问题!!!两个问题!!!一定要看完!!!
这里有两个问题!!!两个问题!!!一定要看完!!!
这里有两个问题!!!两个问题!!!一定要看完!!!

第一步报错

现象

pdfjsLib报错

原因

PDFJS.GlobalWorkerOptions.workerSrc 未配置,配置了就行。
main.jsvite.config.ts都要改,不复杂。

解决

javascript 复制代码
// main.js
// 手动设置workerSrc
// 设置为BASE_URL拼接,保证和部署环境路径一致
import * as PDFJS from 'pdfjs-dist';
PDFJS.GlobalWorkerOptions.workerSrc = `${import.meta.env.BASE_URL}assets/pdf.worker.mjs`;
javascript 复制代码
// vite.config.ts
export default defineConfig({
  plugins: [
    vue(),
    vueJsx(),
    ...
    // 复制 PDF.js worker 文件到输出目录
    viteStaticCopy({
      targets: [
        {
          src: 'node_modules/pdfjs-dist/build/pdf.worker.mjs',
          dest: 'assets'
        }
      ]
    })
  ],
  ...
})

结果

打包之后就能看到/dist/assets目录下面多了几个文件,这就是pdf.js需要的文件。

我们要的是pdf.worker.mjs这个文件。

现在项目文件就改完了,接下来还要改nginx配置

第二步报错【重要】

现象

现在把项目打包放到服务器上还是会报错

pdfdist 报错 Error: Setting up fake worker failed: "Failed to fetch dynamically imported module......

原因

pdf.worker.mjs文件是获取到了,不过header格式不对,文件类型需要改为js脚本文件才能被浏览器正确解析。

解决

改服务器nginx配置文件。(apache同理)

这里需要改http.types配置项,其他的文档讲得很模糊,我这里写得细一点。

目前大部分版本的nginx对文件MIME 类型配置都是在mime.types文件里列出来的,.mjs是ES模块,默认没有配置。

而我们要做的很简单,就是把.mjs类型支持加上。可以直接在http配置里加,也可以在http.types里加,任选其一即可。

【方案1】加在nginx.conf

javascript 复制代码
// nginx.conf

http {
    include mime.types;
    default_type application/octet-stream;

    types {
        # 添加 .mjs 文件的 MIME 类型映射
        application/javascript mjs;
    }
    ...
}

【方案2】加在http.types

javascript 复制代码
// http.types
	...
   application/javascript     js;
   application/javascript     mjs; # 添加这一行来正确处理mjs文件
   application/atom+xml       atom;
   ...

最后重启nginx

【完毕】

相关推荐
随风一样自由5 小时前
【前端独角兽】刚进入前端领域的前端开发用jQuery还是Vue3?
前端·javascript·vue3·jquery
西门吹-禅6 小时前
java springboot N+1问题
java·开发语言·spring boot
YHHLAI6 小时前
[特殊字符] 面试中的 Promise —— 从入门到精通
前端·javascript·面试
skywalk81636 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
weixin_BYSJ19876 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
沪飘大军7 小时前
ll-llm:一个零依赖、可插拔的 OpenAI 兼容 LLM 代理
javascript
IT笔记8 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
2zcode8 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn
逝水无殇8 小时前
C# 运算符重载详解
开发语言·后端·c#
TPBoreas9 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)
java·开发语言