Electron环境下window['pdfjs-dist/build/pdf']为undefined 求原因及解决方案
pdf.js在Electron客户端突发pdfjsLib undefined问题的原因及解决方案
问题根因
你所使用的//mozilla.github.io/pdf.js/build/路径下的资源是Mozilla官方托管的滚动更新版本,代码会随官方版本迭代自动更新,不会固定在你上线时的版本。2021年8月中旬pdf.js发布了突破性版本更新,调整了全局变量挂载逻辑:
- 旧版本默认将库实例挂载到
window['pdfjs-dist/build/pdf']属性上,适配所有通过script标签引入的场景 - 新版本取消了默认全局挂载,仅在检测到纯浏览器UMD加载场景时才会暴露有限全局变量,Electron渲染进程因存在Node环境标识(如
process、require等变量),被判定为非纯浏览器环境,不会触发全局挂载逻辑,因此你从window上取到的值为undefined - 浏览器版本运行正常是因为新版对纯浏览器场景的兼容适配仍保留,和Electron的环境判定结果不同,才会出现两端表现不一致的情况
解决方案
方案1:使用固定版本静态资源(最稳妥的修复方案)
停止使用官方滚动更新的CDN地址,将pdf.js和对应worker文件下载到本地项目托管,从根本上避免官方迭代带来的兼容性问题。代码可调整为:
// 引入固定版本pdf.js后,可直接获取新版暴露的全局变量pdfjsLib,兼容旧逻辑可做兜底 const pdfjsLib = window.pdfjsLib || window['pdfjs-dist/build/pdf'] // worker路径替换为本地固定版本的资源路径 pdfjsLib.GlobalWorkerOptions.workerSrc = './static/pdf.worker.js'
方案2:调整Electron窗口配置(临时应急方案)
如果暂时无法替换资源,可以在主进程创建BrowserWindow时调整webPreferences配置,打通全局变量上下文,注意该方案会降低应用安全性,仅建议临时使用:
new BrowserWindow({ // 其他窗口配置保持不变 webPreferences: { contextIsolation: false, // 其余配置和你原有配置保持一致即可 } })
方案3:通过npm包引入(长期维护最优方案)
直接在项目中安装固定版本的pdfjs-dist依赖,通过模块化引入完全规避全局变量挂载问题:
# 安装2021年8月前的稳定兼容版本,可根据你的业务需求选择对应版本 npm install pdfjs-dist@2.9.359
import * as pdfjsLib from 'pdfjs-dist' pdfjsLib.GlobalWorkerOptions.workerSrc = require('pdfjs-dist/build/pdf.worker.entry')
内容的提问来源于stack exchange,提问作者SelangeJR
相关产品推荐
相关产品推荐

