用canvas 还是 使用 html2canvas 和 dom-to-image 等类库的一个教训

1,418 阅读2分钟

最近遇到个项目,实现前端绘制图片,大致是这样的

底层自然是canvas 来做。

写的时候,一不留神,我就用css+html已经写完了布局,又看看这个结构,蛮复杂么,算了,记得有个html转图片的类库,用起来看看吧。

于是github里搜了搜,先来个 html-to-image 的库,本地开发 的时候,发现效果不错么。于是,整体逻辑就基于此做了。

等实际测试的时候,尴尬了。兼容性有问题!!

因为是内网开发,想要真机测试,得构建放置到外网环境,比较麻烦。所以早期没做,逻辑开发完了才测。

有各种问题:

图片白屏啊!!怎么弄呢?社区里搜索方案,又瞧瞧源码,没耐心慢慢梳理,于是换上了 html2canvas的库,哦,有了。

渲染出来的图要么缺少必要元素、要么有拉伸,难道内容没渲染就开始把 html转图片?毕竟有好几个图片资源要加载。那加上延时啊。于是,在合适的地方加上了延时处理。

嗯,好了点,但使用外网测试的时候,发现是图片是白的。配置不对?于是尝试搜索出来的各种配置,配置好再构建,真机实测。经过一番折腾,还是不行。因为留意到内网的浏览器一直是可以的,后来发现内网浏览器是正常的,也因为知道canvas经常有图片资源跨域问题,综上因素,继续 想-找 原因。

实验性的对浏览器做了iphone和非iphone的判断,iphone用了html2canvas, 其他用了 dom-to-image(发现相比html-to-image,这个库star更多),再实测,嗯,好些了。

但是,但是,经过了多次延时微调处理,渲染的效果还是不稳定,不是有拉伸就是部分白屏。服了服了,没耐心了。

决定用 canvas原生搞!!不就五六个元素绘制么,不就是有些图片有圆角而canvas画圆角费劲多两行代码么,不就是文本样式多了些么。使用类库的黑盒子,原理不也就这样,而且还带来了代码体积的增多。

换换换!

简而言之: 前期有了沉没成本,并且在这条路上因为兼容问题不断的打补丁来弥补,不是最好的路。

至于开发环境的困扰也是有的:内网构建、外网真机看效果,效率不够,增加很多调试时间。

决定:

凡是能自己用canvas绘制的,就不要用类库!!

也不是不好用,实在没法子的时候再用。比如,截屏。