Vue3 + Vite + TypeScript 整合pdfjs

简介

项目需求有显示excel的功能,经过一番讨论后,得到有几种方案,最终定下来的方案是在后端将excel文档转换成pdf后再在前端进行显示。遂准备在项目中整合pdfjs库。在整合的过程中遇到几个问题,特此记录下。

在项目中安装pdfjs库

# 笔者这里使用的是npm包管理工具,故后面所有的包管理工具都默认为使用npm
# 安装pdfjs
npm install pdfjs-dist

通过pdfjs库封装pdf显示组件

<script setup lang="ts">
import {nextTick, onMounted, ref, watch} from "vue";
import {getDocument, GlobalWorkerOptions} from "pdfjs-dist";
import * as pdfjsWorker from 'pdfjs-dist/build/pdf.worker.min.mjs'

const props = defineProps(["url", "showPageList"])

const canvasRef = ref()

onMounted(() => {
  watch(props, (value, oldValue, onCleanup) => {
    // 如果有设置显示内容,就开始显示
    if (props.url && props.showPageList.length > 0) loadPdf()
  }, {immediate: true})
})

const loadPdf = () => {
  nextTick(async () => {
    GlobalWorkerOptions.workerSrc = pdfjsWorker.default
    const pdf = await getDocument(props.url).promise
    const page = await pdf.getPage(props.showPageList[0]) // 设置显示页
    const viewport = page.getViewport({scale: 1})

    // Render PDF page into canvas context
    page.render({
      canvasContext: canvasRef.value.getContext("2d"),
      viewport: viewport
    });
  })
}

</script>

<template>
  <div class="show_sop">
    <canvas ref="canvasRef"/>
  </div>
</template>

<style scoped lang="stylus">
.show_sop
  width 100%
  height 100%
  box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04)

  canvas
    width 100%
    height 100%
</style>

遇到的问题

上面的组件只是一个很简单的例子,用于指定显示pdf文件中的哪几页,pdfjs这个库还有很多其他的功能笔者暂时还没时间去挖掘。

但是还没运行时就遇到一个问题,只见控制台发生了一个错误

http://localhost:5173/node_modules/.vite/deps/pdfjs-dist.js?v=6a8263ac net::ERR_ABORTED 504 (Outdated Optimize Dep)

看了一眼ide中的控制台。发现真实错误为 vite 不支持顶级的 async/await 语法,

Top-level await is not available in the configured target environment ("chrome87", "edge88", "es2020", "firefox78", "safari14" + 2 overrides)

    node_modules/pdfjs-dist/build/pdf.mjs:17349:53:
      17349 │ /******/ __webpack_exports__ = globalThis.pdfjsLib = await (globalThis.pdfjsLibPromise = __webpack_exports__);

问题的解决

需要在项目中安装topLevelAwait插件做兼容

# 安装topLevelAwait插件
npm install vite-plugin-top-level-await -D

修改项目根目录下的vite.config.ts文件,在这个文件中的plugins属性内导入刚刚安装的插件即可正常显示

import {defineConfig} from 'vite'
import vue from '@vitejs/plugin-vue'
import topLevelAwait from "vite-plugin-top-level-await";

// https://vitejs.dev/config/
export default defineConfig({
    plugins: [vue(), topLevelAwait({promiseExportName: '__tla', promiseImportName: (i) => `__tla_${i}`})],
})
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用以下步骤在 Vue3 + Vite3 + Typescript 中使用 WangEditor 编辑器: 1. 安装 WangEditor。可以使用 npm 或 yarn 安装。 ```bash npm install wangeditor --save # 或者 yarn add wangeditor ``` 2. 在 `main.ts` 中引入 WangEditor 和 CSS 文件。 ```typescript import WangEditor from 'wangeditor'; import 'wangeditor/release/wangEditor.css'; const app = createApp(App); app.config.globalProperties.$WangEditor = WangEditor; // 挂载编辑器到全局 app.mount('#app'); ``` 3. 在组件中使用 WangEditor。 ```vue <template> <div class="editor-wrapper"> <div ref="editorRef"></div> </div> </template> <script lang="ts"> import { defineComponent, onMounted, ref } from 'vue'; export default defineComponent({ name: 'Editor', setup() { const editorRef = ref<HTMLDivElement>(); onMounted(() => { const editor = new (window as any).$WangEditor(editorRef.value); editor.create(); }); return { editorRef, }; }, }); </script> <style lang="scss"> .editor-wrapper { height: 400px; .w-e-text-container { height: 100%; } } </style> ``` 在 `onMounted` 钩子函数中,使用 `new (window as any).$WangEditor` 来创建编辑器实例,并传入编辑器容器的 DOM 节点。调用 `editor.create()` 方法来创建编辑器。 注意:由于 WangEditor 的类型定义文件并不完善,因此可以在 `tsconfig.json` 中添加以下配置来避免类型检查报错。 ```json { "compilerOptions": { "skipLibCheck": true } } ``` 这样,就可以在 Vue3 + Vite3 + Typescript 中使用 WangEditor 编辑器了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值