You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Vue3(组合式API)+ Vite5环境下Fabric.js v6.7.0正确导入及使用fabric.Canvas的方法求助

Vue3(组合式API)+ Vite5环境下Fabric.js v6.7.0正确导入及使用fabric.Canvas的方法

我刚好在Vite5+Vue3的项目里踩过Fabric.js v6.x的导入坑,给你分享下亲测有效的解决方法!

1. 先解决最核心的导入问题

Fabric.js v6+为了支持树摇优化,调整了包的导出结构,默认的fabric入口不再导出完整的命名空间,这就是你导入后找不到Canvas的原因。有两种好用的导入方式:

方式一:按需导入(推荐,打包体积更小)

直接导入你需要的类,比如Canvas

import { Canvas } from 'fabric'

然后实例化的时候直接用:

fabricCanvas = new Canvas(canvas, { isDrawingMode: true })

方式二:导入完整的fabric命名空间

如果你需要用到Fabric的很多API,不想一个个单独导入,可以导入完整的fabric对象:

import * as fabric from 'fabric/fabric-impl'

这时候就可以像老版本那样使用fabric.Canvas了:

fabricCanvas = new fabric.Canvas(canvas, { isDrawingMode: true })

2. 修正你代码里的错误

你原来的代码里写了new fabric.fabric.Canvas(canvas),这里多套了一层fabric,不管用哪种导入方式,都应该改成new fabric.Canvas(...)(方式二)或者new Canvas(...)(方式一)。

3. 关于Vite的额外配置(一般不需要,但以防万一)

Vite5本身对纯ESM包的支持很好,Fabric v6也是纯ESM,所以大部分情况下不需要额外配置。如果还是遇到奇怪的导入错误,可以在vite.config.js里添加依赖预构建优化:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  optimizeDeps: {
    include: ['fabric']
  }
})

4. 给你业务需求的小优化建议

你现在是把PDF直接渲染到canvas,再用Fabric包装这个canvas。其实更规范的做法是:把PDF渲染成图片后,作为Fabric的Image元素添加到Fabric画布上,这样Fabric可以统一管理所有绘制元素(包括用户的签名),导出的时候也更方便。比如:

// 渲染PDF页面后,转成Fabric Image
const pdfImage = new fabric.Image(canvas, { left: 0, top: 0 })
fabricCanvas.add(pdfImage)
fabricCanvas.renderAll()

导出的时候直接用Fabric自带的方法,比html2canvas更高效:

const imgData = fabricCanvas.toDataURL({ format: 'png' })
const pdf = new jsPDF({ orientation: 'portrait', unit: 'px', format: [canvas.width, canvas.height] })
pdf.addImage(imgData, 'PNG', 0, 0, canvas.width, canvas.height)
pdf.save('signed.pdf')

亲测这个方案在Vite5+Vue3+Fabric v6.7.0下完全可行,你可以试试!

内容来源于stack exchange

火山引擎 最新活动