解决vue中webpack与spline包冲突的问题

738 阅读3分钟

1.问题

设计师用spline捣鼓了好几天的高大上的动效,交给前端去呈现,code资源包都给了。心想,这还不简单,照着demo教程,把资源引入页面就完了,没啥技术含量。然鹅然鹅,车就这么翻了......,vue中实际引入资源包的时候报错了......

image.png

资源包单独能跑起来,为啥在vue中就报错了呢,有一点可以确认肯定不是资源包的问题。 看报错信息,是webpack打包报错了。百度了一下,原来是webpack版本与spline打包文件冲突了。 遇到webpack版本问题,一般人肯定一万匹草泥马在心中奔涌而过,尼玛版本问题又不是我的问题,适配版本这坑太深了......。然鹅,奔涌完了,问题还是要解决的。 既然是版本问题,那把spline的版本降低一下试试?降低了好几个版本,报错依旧,看来此路不通(不会有人说,你为啥不试试降低webpack的版本?这问题就像,航母上一架飞机不能起飞,为啥不换航母一样......)。

后来想到public文件夹,不会经过webpack打包,提供了一条第三方包的逃生通道。去vue-cli看文档, 求证了一下,果真可以这么搞,而且文档写的很清楚,public文件夹存在的原因,其中重要一条,就是在webapck冲突的情况下,绕开webpack。

image.png

年轻人,就是不看文档啊!

1665493715152.png

2.解决

顺着public文件夹的思路,将所需的dom标签写入到index.html中,将js写入到init-spline.js文件中

image.png

image.png 浏览器热更新,效果竟然自动出来了!有点小激动啊,捣鼓了个把小时,终于出结果了!

image.png

3. 运气

其实之前的init-spline.js版本不是这样的......,之前的是这样的:

朴实无华的4句代码 image.png

一开始自动出效果,但后来一刷新就报错了 image.png

后来刷好多次,依旧报错。 我去,之前的没报错的效果是怎么出来的?!,老天还是很眷顾我啊,虽然没有完全解决问题,但是给了我希望,指明了方向,有时干成事儿,真是不可避免的靠运气的成分。

4. 继续找原因

看报错信息,是addEventListener相关的错误,凭借驰骋前端这么多年的经验,直觉告诉我,是在dom渲染前去获取dom没有获取到,进而挂载event事件的时候报错了。

5. 验证

将上面简单的4句代码的基础上, 加上了循环获取dom,直到获取成功,用到了try-catch错误捕捉,sleep延时函数,经过几次验证,彻底解决了这个问题,yeah!

image.png

6. 准备优化

虽然效果出来了,问题解决了,但是加载速度有点慢,也感觉有些复杂,不够优雅。 下班在地铁上又想到了一个优化的方法,用发布订阅模式,当canvas元素mounted的时候,触发一个事件,然后获取dom来初始化动画,对,应该这么干才够优雅。然鹅然鹅......, public引入emitter报错了,

image.png

可能是静态文件不能用常规姿势使用模块的原因,至于为什么,我也不知道....., 看来这个优化,目前只能搁置了,后面探索到更好的方法,再试试。

7.小结

总结一下这次故障排查的关键词:需要一定基础经验,需要运气成分,需要不断重构代码。