解決 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
英文地址,請注明出處:http://en.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多租戶無法在運…