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

目录

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

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

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

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

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

第一步报错

现象

pdfjsLib报错

原因

PDFJS.GlobalWorkerOptions.workerSrc 未配置,配置了就行。
main.js和vite.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

【完毕】

相关推荐
Felven12 分钟前
C. Brr Brrr Patapim
c语言·开发语言
FungLeo15 分钟前
成为全栈·Vue 管理后台篇·用 fetch 建一层可控的请求内核
前端·javascript·vue.js·http·fetch·formdata·接口封装
用户842981424181033 分钟前
ByteJS,让重要的 JavaScript 以字节码运行。
javascript
路溪非溪2 小时前
python标准库使用总结
开发语言·python
FungLeo2 小时前
成为全栈·Vue 管理后台篇·Vue Router如何守住多角色后台边界
前端·javascript·vue.js·rbac·vue router·路由守卫·前端权限
FungLeo3 小时前
成为全栈·Vue管理后台篇·仪表盘不是几张卡片:组合统计接口与角色视图
前端·javascript·vue.js·rbac·仪表盘·管理后台·tanstack query
程序员大阳3 小时前
HTML+CSS+JS对话式实战(7)-学生端活动报名功能开发
javascript·css·html·活动报名
SomeOtherTime3 小时前
Rust 面向对象介绍(AI回答)
开发语言·python·rust
zh_xuan3 小时前
kotlin常见面试题
开发语言·kotlin·面试题
西安小哥4 小时前
做 Agent 写到第三个小时,我开始给它算账
javascript