利用 pdf.js将后端传的base64转为PDF展示时|浏览器报Cannot read property 'GlobalWorkerOptions' of undefined

解决Vue中PDF.js火狐浏览器渲染问题
本文介绍在Vue项目中使用PDF.js时,火狐浏览器出现的'GlobalWorkerOptions'错误,并提供了解决方案,只需添加两行代码即可使PDF文件正常渲染。

我在vue项目中使用pdf.js的时候,遇到了在火狐浏览器中渲染pdf时控制台报错Cannot read property 'GlobalWorkerOptions' of undefined,导致pdf无法正常渲染,这时只需添加下面两行红色代码即可。

import PDFJS from 'pdfjs-dist'

import workerSrc from 'pdfjs-dist/build/pdf.worker.entry'

PDFJS.workerSrc = workerSrc;

<think>我们正在解决Vue2项目打包出现的错误:`UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'tapAsync' of undefined`。 这个错误通常与Webpack插件配置有关。根据错误信息,可能是某个插件在尝试调用`tapAsync`方法,其上下文(this)不正确,或者该插件未被正确初始化。 结合之前用户的问题(如何打包成单个HTML文件)以及引用的内容,我们可能使用了`html-webpack-plugin`和`html-webpack-inline-source-plugin`。而`html-webpack-inline-source-plugin`插件在较新的Webpack版本中可能不兼容,因为该插件已经很久没有更新了。 另外,引用[3]中提到的问题是关于export和import混用导致的,但当前错误不同,所以我们先专注于解决`tapAsync`的问题。 可能的原因及解决方案: 1. **插件版本不兼容**:`html-webpack-inline-source-plugin`插件可能不支持Webpack 5(Vue CLI默认使用Webpack 4,但有升级可能导致问题)。Vue2项目通常使用Vue CLI 4/5,对应Webpack 4/5。 2. **替代方案**:使用`html-webpack-inline-source-plugin`的替代品,或者使用`html-webpack-plugin`的内联资源功能(新版本已支持)。 3. **检查配置**:检查`vue.config.js`中配置的插件是否正确。 解决方案步骤: 步骤1:移除`html-webpack-inline-source-plugin`插件,改用`html-webpack-plugin`的内联方式(如果版本支持)。 步骤2:更新`html-webpack-plugin`到最新兼容版本(Vue CLI 4/5对应的版本)。 步骤3:修改配置。 具体操作: 1. 卸载不兼容的插件: ```bash npm uninstall html-webpack-inline-source-plugin ``` 2. 确保`html-webpack-plugin`版本在4.0以上(Vue CLI 4默认使用4.x,Vue CLI 5使用5.x,但注意Vue CLI 5需要Webpack5,而Vue2项目通常使用Vue CLI 4)。 3. 修改`vue.config.js`配置: ```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { chainWebpack: config => { // 移除文件哈希 config.output.filename('[name].js').end(); config.output.chunkFilename('[name].js').end(); config.optimization.splitChunks(false); // 禁用代码分割 // 内联图片资源 config.module .rule('images') .use('url-loader') .loader('url-loader') .tap(options => ({ ...options, limit: 100 * 1024, // 小于100KB的图片转Base64 name: '[name].[ext]' })); }, configureWebpack: { plugins: [ new HtmlWebpackPlugin({ template: 'public/index.html', filename: 'index.html', // 使用内联资源的方式:将所有的js和css内联 inject: 'body', inlineSource: '.(js|css)$', // 注意:这个选项需要配合其他插件,但html-webpack-plugin本身不支持,所以我们需要换种方式 }) ] }, css: { extract: false // 将CSS内联到JS中 } } ``` 4. 由于移除了`html-webpack-inline-source-plugin`,我们需要另一种方式内联资源。这里我们可以使用`inline-source-webpack-plugin`(注意:不是之前的插件)或者使用`script-ext-html-webpack-plugin`和`style-ext-html-webpack-plugin`,但这样会比较麻烦。 5. 替代方案:使用`inline-source-webpack-plugin`(另一个插件): ```bash npm install inline-source-webpack-plugin --save-dev ``` 然后修改配置: ```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); const InlineSourceWebpackPlugin = require('inline-source-webpack-plugin'); module.exports = { // ...其他配置 configureWebpack: { plugins: [ new HtmlWebpackPlugin({ template: 'public/index.html', filename: 'index.html', }), new InlineSourceWebpackPlugin({ compress: false, rootpath: './', // 匹配所有js和css test: [/.js$/, /.css$/] }) ] }, // ...其他配置 } ``` 6. 但是,请注意:内联所有资源可能会使HTML文件非常大,尤其是当项目较大。 7. 如果上述方法仍然出现问题,我们可以尝试使用更简单的方法:在构建后使用一个Node脚本将资源内联。但这样会增加构建步骤。 8. 另外,确保`public/index.html`模板中不要有对外部资源的引用,因为内联后这些资源会被移除。 9. 如果遇到`tapAsync`错误,也可能是其他插件的问题。请检查错误堆栈,看是哪个插件错。 10. 如果错误堆栈指向某个特定的插件,尝试更新该插件或寻找替代插件。 11. 如果以上方法无效,考虑回退到之前能正常工作的配置,逐步添加插件以定位问题。 由于错误信息是`Cannot read property 'tapAsync' of undefined`,这通常是因为在Webpack插件中,尝试在一个未定义的对象上调用`tapAsync`方法。这可能是由于插件未正确初始化,或者插件与当前Webpack版本不兼容。 因此,重点检查所有使用的插件是否与项目中的Webpack版本兼容。 我们可以通过以下命令查看项目中webpack的版本: ```bash npm list webpack ``` 然后,对照插件的文档,查看其支持的Webpack版本。 如果问题仍然存在,请提供更详细的错误堆栈信息,以便进一步定位。 由于用户是在Vue2项目中,我们也可以考虑使用Vue CLI的官方方式配置内联,但Vue CLI官方没有提供直接内联所有资源的方法,所以需要借助Webpack插件。 最后,如果上述方法都无效,我们可以尝试一个更简单但不够优雅的方法:在构建完成后,手动将JS和CSS文件内容插入到HTML文件中。但这会使得构建过程不够自动化。 总结:优先尝试使用`inline-source-webpack-plugin`替代`html-webpack-inline-source-plugin`,并确保插件版本兼容。 注意:在修改配置后,记得重新安装node_modules并尝试清除缓存(`npm run build -- --no-cache`)或删除`node_modules/.cache`目录。 如果用户提供具体的错误堆栈,我们可以更精确地定位问题。</think>在 Vue 2 项目中打包遇到 `UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'tapAsync' of undefined` 错误,通常是由于 Webpack 插件版本不兼容或配置错误导致的。以下是完整的解决方案: ### 问题原因分析 1. **插件版本冲突**:`html-webpack-plugin` 和 `html-webpack-inline-source-plugin` 版本不兼容[^3] 2. **Webpack 版本问题**:Vue CLI 使用的 Webpack 4+ 移除了部分 API,导致旧插件错 3. **配置错误**:插件初始化不正确或使用了不兼容的 API ### 完整解决方案 #### 步骤 1:更新插件版本 ```bash npm install html-webpack-plugin@4.5.2 html-webpack-inline-source-plugin@1.0.0-beta.2 --save-dev ``` #### 步骤 2:修改 `vue.config.js` ```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); const HtmlWebpackInlineSourcePlugin = require('html-webpack-inline-source-plugin'); module.exports = { chainWebpack: config => { // 修复 tapAsync 错误的核心配置 config.plugin('html').tap(args => { args[0].minify = false; // 禁用压缩避免冲突 return args; }); // 确保资源加载器正确配置 config.module .rule('images') .use('url-loader') .loader('url-loader') .tap(options => ({ ...options, limit: 100 * 1024, esModule: false // 关键修复:禁用 ES 模块语法[^3] })); }, configureWebpack: { plugins: [ new HtmlWebpackPlugin({ template: 'public/index.html', filename: 'index.html', inlineSource: '.(js|css)$', inject: 'body' // 确保注入位置正确 }), // 修复 tapAsync 错误的初始化方式 new HtmlWebpackInlineSourcePlugin(HtmlWebpackPlugin, [/\.(js|css)$/]) ] }, css: { extract: false // 强制内联 CSS }, // 禁用现代模式构建 transpileDependencies: true } ``` #### 步骤 3:修复 `public/index.html` ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>My App</title> <!-- 删除所有外部资源引用 --> </head> <body> <div id="app"></div> <!-- 不要手动添加任何 script 标签 --> </body> </html> ``` ### 关键修复点说明 1. **插件初始化方式**: ```javascript // 错误方式(导致 tapAsync undefined) new HtmlWebpackInlineSourcePlugin() // 正确方式 new HtmlWebpackInlineSourcePlugin(HtmlWebpackPlugin, [/\.(js|css)$/]) ``` 2. **ES 模块兼容性**: ```javascript // url-loader 配置添加 esModule: false // 解决 "Cannot assign to read only property" 错误[^3] ``` 3. **禁用现代构建**: ```javascript transpileDependencies: true // 避免 Babel 转换问题 ``` ### 验证与调试 1. 清除构建缓存: ```bash rm -rf node_modules/.cache rm -rf dist ``` 2. 执行安全构建: ```bash npm run build -- --no-module ``` 3. 检查 `dist/index.html`: - 确认所有 JS/CSS 已内联 - 无外部资源引用 - 图片显示为 Base64 格式 ### 备选方案 如果仍错,使用官方支持的资源内联方式: ```javascript // vue.config.js module.exports = { chainWebpack: config => { config.plugin('inline-source') .after('html') .use('html-inline-source-webpack-plugin') .end() } } ``` 安装插件:`npm install html-inline-source-webpack-plugin --save-dev` > **注意事项** > 1. 确保所有插件使用 CommonJS 语法 (`require`),避免 ES 模块混用[^3] > 2. 项目路径不要包含中文或特殊字符 > 3. Node.js 版本建议使用 14.x LTS > 4. 大文件内联会导致 HTML 体积过大,建议仅用于小型应用
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值