解决 pdf.mjs 因 MIME 类型错误导致的模块加载失败问题

Mozilla PDF.js V4 开始,它官方分发确实只提供了 ESM 模块(.mjs),没有以前的 pdf.js、pdf.worker.js UMD 版本了。

这个问题本质上是 浏览器要求以 application/javascript MIME 类型加载 ES Module,而你引入的 pdf.mjs 文件服务器返回的 Content-Type 不是标准的 JS MIME(通常是 text/html 或者 text/plain),所以会报:

Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "text/html"

先介绍一下.mjs文件

什么是 .mjs 文件?

.mjs(Module JavaScript)是 ECMAScript 模块的专用文件扩展名,用于明确标识 JavaScript 模块文件。这是 ES6 模块系统的标准扩展名。

与普通 .js 文件的主要区别

特性.mjs 文件传统 .js 文件
模块类型ES6 模块传统脚本或 CommonJS 模块
严格模式默认启用需要手动启用
顶层 thisundefined指向全局对象
导入/导出支持 import/export需要特定环境支持
文件识别明确标识为模块需要解析内容判断

.mjs 文件的核心特性

1. 明确的模块标识

// math.mjs
export const add = (a, b) => a + b;
export const multiply = (a, b) => a * b;// 默认导出
export default function calculator() {console.log('Calculator module loaded');
}

2. 导入语法

// app.mjs
import calculator, { add, multiply } from './math.mjs';console.log(add(2, 3)); // 输出: 5
console.log(multiply(2, 3)); // 输出: 6
calculator(); // 输出: Calculator module loaded

3. 动态导入

// 动态导入示例
const loadModule = async () => {const module = await import('./dynamic-module.mjs');module.doSomething();
};

为什么使用 .mjs 扩展名?

优势:

  1. 明确性:一眼就能识别出是 ES6 模块
  2. 兼容性:避免与 CommonJS 模块混淆
  3. 工具支持:构建工具和运行时能够正确识别模块类型
  4. 服务器配置:便于正确设置 MIME 类型

环境支持

支持的运行时:

  1. Node.js (v12+ 完全支持)
  2. 现代浏览器 (Chrome、Firefox、Safari、Edge)
  3. Deno (原生支持)
  4. Bun (原生支持)

Node.js 中的使用:

// package.json 配置
{"type": "module", // 或者使用 .mjs 扩展名"scripts": {"start": "node src/index.mjs"}
}

回归正题

常见解决方案:

1. 确认服务器返回的 MIME 类型

在服务端配置里,确保 .mjs 文件返回:

Content-Type: application/javascript
  • Nginx 配置:
http {types {application/javascript  mjs;}
}
  • Apache 配置:
AddType application/javascript .mjs

2. 如果你不能改服务器配置
  • pdf.mjs 改名为 .js,然后在 HTML 中这样引入:
<script type="module" src="/path/to/pdf.js"></script>

因为大多数服务器对 .js 都会返回正确的 application/javascript


3. 使用构建工具打包

如果你项目里有 Webpack / Vite / Rollup,把 pdf.mjs 作为依赖打包进去,这样最终生成的都是标准 JS 文件,不会受 MIME 类型影响。


4. 确认引入方式

要用 ES Module 的方式加载:

<script type="module">import * as pdfjsLib from '/path/to/pdf.mjs';// ...
</script>

  1. 如果是 uniapp 下使用 npm i pdfjs-dist 安装的 pdfjs,引入方式如下:
import * as pdfjsLib from "pdfjs-dist";
import pdfjsWorker from "pdfjs-dist/build/pdf.worker?url";
pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorker;
  1. 如果是官网下载的zip包,引入方式如下:
import * as pdfjsLib from "@/static/pdf.mjs";const worker = new Worker(new URL("@/static/pdf.worker.mjs", import.meta.url), { type: "module" });
pdfjsLib.GlobalWorkerOptions.workerPort = worker;

由于我使用的是docker,直接用 cat 命令无法编辑mime.types文件(页也可以自行安装 vim 命令)。

这里介绍一下 docker cp 命令。

  • 从宿主机复制文件到容器
docker cp ./hello.txt nginx_container:/hello.txt
  • 从容器复制文件到宿主机:
docker cp nginx_container:/hello.txt ./hello.txt
  • 修改后需要重启nginx
docker exec nginx_container nginx -s reload

验证

curl -I https://your-domain.com/file.mjs

返回

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 26 Aug 2025 10:51:28 GMT
Content-Type: application/javascript; charset=utf-8,gbk
Content-Length: 1887718
Connection: keep-alive
Last-Modified: Tue, 26 Aug 2025 03:14:02 GMT
ETag: "68ad267a-1ccde6"
Accept-Ranges: bytes

至此,访问pdfjs 正常了!😃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94520.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32八大模式

前言&#xff1a;STM32存在八大模式&#xff0c;分别如下推挽输出&#xff0c;开漏输出&#xff0c;复用推挽输出&#xff0c;复用开漏输出浮空输入&#xff0c;上拉输入&#xff0c;下拉输入&#xff0c;模拟输入STM32标准IO结构图如下&#xff1a;其中如下电路为保护电路&…

OpenCV4.X库功能全解---个人笔记

文章目录前言1.Core核心功能1.1 基本数据类型和结构&#xff1a;1.2 数组操作&#xff1a;1.3 数学函数&#xff1a;1.4 随机数生成&#xff1a;1.5 线性代数运算&#xff1a;1.6 常用数据结构和算法&#xff1a;1.7 XML/YAML文件读写&#xff1a;1.8 错误处理&#xff1a;1.9时…

代码随想录刷题Day44

二叉搜索树的最近公共祖先 这道题&#xff0c;可以沿用二叉树的最近公共祖先的求法进行求解&#xff0c;也就是root判断-左右子树递归求LCA-根据左右子树的LCA结果返回值这一套。 但是&#xff0c;如果要用上搜索二叉树的有序性这个信息的话&#xff0c;就可以直接在递归时候确…

springmvc的数据校验和处理的一个例子

JSR-303是Java 的标准规范&#xff0c;而 Spring MVC 对其提供了完美的支持和集成 1.JSR-303 的身份 JSR-303 是 Java 标准 JSR&#xff1a;Java Specification Request&#xff08;Java 规范请求&#xff09; JSR-303&#xff1a;Bean Validation 1.0&#xff08;Bean 验证规范…

SlowFast使用指南(三)——自建数据集

写在前面 在前两个章节初步使用了SlowFast&#xff0c;使用的都是官方给出的数据集。 附上链接&#xff1a; SlowFast使用指南&#xff08;一&#xff09;——demo运行-CSDN博客 SlowFast使用指南&#xff08;二&#xff09;——训练ava数据集-CSDN博客 本文尝试了使用自己的数…

Day26 树的层序遍历 哈希表 排序算法 内核链表

day26 树的层序遍历 哈希表 排序算法 内核链表 实现树的层序遍历&#xff08;广度遍历&#xff09; 使用队列辅助实现二叉树的层序遍历。算法核心思想是&#xff1a;从根节点开始&#xff0c;依次将每一层的节点入队&#xff0c;出队时访问该节点&#xff0c;并将其左右子节点&…

【系统分析师】高分论文:论快速应用开发方法及应用

【摘要】 我在某县卫生健康委员会公共卫生信息中心工作&#xff0c;是信息中心的负责人。2021年5月&#xff0c;我中心受县痪病预防控制中心委托&#xff0c;为某种痪病疫苗3期临床项日开发受试对象拦截系统。我负责系统架构设计、需求分析以及后期的部分编码工作。通过与庆病预…

4056:【GESP2403八级】接竹竿

/*4056&#xff1a;【GESP2403八级】接竹竿flag 数组 存储每个元素出现的位置&#xff0c;nxt[i]j;存储每个位置 后面第一次出现 与a【i】相等的位置//其中 a【i]a[j] :记录i的下一个位置 &#xff0c;flag 存储每个值的位置下一次 具有下一次&#xff0c;相当于的链表了&…

企业落地版 AutoGen 多智能体工程(完整示例)

企业生产级参考实现,目标是一套可直接部署的模板工程,包含: FastAPI HTTP API(任务提交、状态查询) Celery 异步任务队列(Redis Broker) PostgreSQL + pgvector(向量存储,RAG) SQLAlchemy + Alembic(ORM 与迁移) AutoGen 多智能体编排(Planner / Coder / Executor…

前端的请求协议对应java的接收

application/json前端发送 JSON 数据&#xff0c;后端用 RequestBody 接收并自动映射为 Java 对象。前端示例&#xff08;Axios&#xff09;&#xff1a;axios.post("/api/user", { name: "张三", age: 20 }, {headers: { "Content-Type": "…

esp32_hid_device 调试遇到的一些问题

nimble to windows10 22h2esp_hid_device 的keyboardReportMap在win10 22h2 csr4.0 下好像识别不了&#xff0c; Windows&#xff08;和大多数 BIOS/UEFI&#xff09;只认 6-byte key array 的 HID Keyboard 描述符。如果不是 6 个字节&#xff0c;Windows HID 驱动就会认为这不…

观察者模式 (Observer Pattern)与几个C++应用例子

1. 模式定义与核心思想 观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生变化时&#xff0c;它会自动通知所有观察者对象&#xff0c;使它们能够自动更新自己。核心思想&#xff1a; 解耦主题和观察者。主题…

[系统架构设计师]论文(二十三)

[系统架构设计师]论文&#xff08;二十三&#xff09; 一.论软件系统架构评估 1.架构所关注的质量属性主要有&#xff1a;性能&#xff0c;可用性&#xff0c;安全性&#xff0c;可修改性 1&#xff09;性能。性能是指系统的响应能力&#xff0c;即要经过多长时间才能对某个事件…

攻克 Java 分布式难题:并发模型优化与分布式事务处理实战指南

攻克 Java 分布式难题&#xff1a;并发模型优化与分布式事务处理实战指南 开场&#xff1a;从“摇摇欲坠”到“稳如磐石”&#xff0c;你的分布式系统进阶之路 你是否曾经遇到过这样的场景&#xff1f;精心打造的电商应用&#xff0c;在大促开启的瞬间&#xff0c;页面响应变得…

如何在Ubuntu中删除或修改已有的IP地址设置?

在 Ubuntu 中为新增加的网卡设置网络时&#xff0c;需要区分原有网卡和新网卡的配置&#xff0c;确保它们可以独立工作&#xff08;可在同一网段或不同网段&#xff09;。以下是具体步骤&#xff0c;假设你需要为新网卡配置静态 IP&#xff08;以 192.168.1.190/24 为例&#x…

Ansible Playbook 概述与实践案例(下)

#作者&#xff1a;张桐瑞 文章目录四、条件判断的实现五、循环的实现六、Jinja模板应用1、Jinja模板2、handlers组件七、角色 role1、角色介绍2、案例: 部署zabbix-agent四、条件判断的实现 when: 条件 - hosts: appserveruser: roottasks:- name: create userAuser: nameuser…

LeetCode 100 -- Day6

1. 哈希&#xff1a;49、128&#xff08;1&#xff09;49 字母异位词分组 -- 字典from collections import defaultdict class Solution(object):def groupAnagrams(self, strs):"""创建字典{sorted_string&#xff1a;原str}"""resultsdefaultd…

多因素认证(MFA/2FA)实战指南:如何保护你的账号

一、MFA/2FA 基础认知 1. 概念辨析与演进 单因素认证&#xff08;1FA&#xff09;的局限性&#xff1a;仅依赖 “知识因素”&#xff08;如密码&#xff09;&#xff0c;据 2024 年 Verizon 数据泄露报告&#xff0c;81% 的账户入侵源于密码泄露 —— 要么是用户使用弱密码&a…

vue3 字符 居中显示

在Vue 3中&#xff0c;要实现字符的居中显示&#xff0c;你可以使用多种方法&#xff0c;具体取决于你是想在HTML元素内居中文本&#xff0c;还是在CSS样式中实现。下面是一些常见的方法&#xff1a;1. 使用内联样式你可以直接在元素上使用style属性来实现文本的居中。<temp…

《Spring Boot 进阶:从零到一打造自定义 @Transactional》 ——支持多数据源、动态传播行为、可插拔回滚策略

《Spring Boot 进阶&#xff1a;从零到一打造自定义 Transactional》 ——支持多数据源、动态传播行为、可插拔回滚策略版本&#xff1a;Spring Boot 3.2.x JDK 17一、背景与痛点痛点默认 Transactional 限制多数据源只能绑定一个 DataSourceTransactionManager多租户无法在运…