记一次 @antv/x6 库 mouseenter 事件不生效问题
前言
记一次 @antv/x6 库 mouseenter 事件不生效问题。
事情是这样,公司刚好有个项目需要做个表示服务器节点的网状图,在经过一阵搜索之后,也是选择了 antv/x6 和 antv/g6 来做。
毕竟我也不可能搓个图的库出来吧,我只是一个外包仔( ̄﹃ ̄)。
由于是在内网环境,最开始的时候直接使用的是打包后的 min.js 导入,刚好行里的库有加载外部 js 文件的工具函数。
但是在用的过程发现图的事件监听功能有问题,某些事件(比如 mouseenter )不生效,然后我就去找了仓库的 issue 列表,打算看看是不是有其他人也遇到这种问题。
刚好找到了 #5012 ,发现版本和我的一样,也是事件没生效,维护者也在下面说了升级下 3.1.5 ,我就想着升级下应该就没啥问题了,没想到升级了还是一样,我看到的时候已经 3.1.6 了,还是会,于是就在这个问题下面圈了以下维护者,问他是否确认修复了,因为依然能够复现,不过它没回复。
我以为可能是库的问题吧,于是我也就没怎么在意,想着说用别的方式来模拟实现,毕竟渲染出来也就是 svg 相关的标签,应该不会很难,但我还是高估我自己了≡(▔﹏▔)≡,于是我开始继续翻 issue 列表,想着说还有没有其他的相关问题,然后我就随便点了一个,发现他用的 codesandbox 的,就是能在网页上像在本地一样用 npm install 之类的,刚好例子中也监听了 mouseenter 事件,我就在想,这难道没问题吗?
于是我就点了进去,发现触发是正常的,给我整有点无语了,于是我回到 #5012 (没错这个 issue 用的就是 unpkg 导入的 min.js 文件),发现还是不行啊,于是我就使用了两份代码,发现了同个版本引入 min.js 和 npm install 的行为竟然不一样。。。
在反复确认了之后,提了个 #5062 ,不过目前还是没人回。。。
可以前往 https://codesandbox.io/p/sandbox/g9v9pm 查看效果,使用的都是 3.1.7 版本。
或者直接看下面这个嵌入的代码
正文
在确认这个问题后,就是要尝试解决这个问题了,既然 min.js 引入有问题,那么只能模拟包导入了。
于是我下载了 x6 的 tgz 的包,想着说试下使用 npm 导入 tgz 包来使用。
关于 tgz 包,可以使用 https://npmmirror.com/ 来下载,比如 x6 的页面为 @antv/x6,点击如下位置就能下载 tgz 包了。

这里要注意,由于使用 esm 导入使用的入口是 es/index.js ,这里还需要安装一个 tslib 的包,也是挺奇怪的,产物里面用到了这个,但是 tslib 却是放在 devDependencies 下的,是我理解的方式有问题吗。
如果内网也没有 tslib ,可以使用同样的方式(tgz 安装)来安装 tslib ,放到项目 dependencies 下即可。
在 pnpm 下,直接输入如下命令即可安装 tgz 包。
1 | pnpm add ./x6-3.1.7.tgz |
这里 ./x6-3.1.7.tgz 就是文件路径,你也放到其他的地方。
安装完成之后就可以在 packages.json 中看到:

这样子就行了。
如果 x6 的 dependencies 在内网都没有的话,那么可能就得通过 tgz 安装到项目下了,x6 包含了以下的包
这几个包, lodash-es 我们的内网仓库有,不过都一样,这四个包的 dependencies 都为空,也就是不依赖其他依赖,所以可以直接通过 pnpm 的 overrides 把这些依赖重定向到 tgz 包下,只需下载对应的 tgz 包,然后在 packages.json 中写入如下配置即可(这里的 pnpm 版本为 8.15.9 不同版本设置这个可能不一样,建议查看 #overrides - pnpm.io 文档)。
1 | { |
这样应该就完全没问题了。
后记
虽然很想吐槽下 x6 ,看得出来维护力度真的不大。
但是转念一想,人家开源出来的,还解决了我工作中的需求,只不过有点小 bug 而已。
由于 bug 没法做我还能跟上头说是 x6 的问题。
想完之后我觉得我应该感谢 x6 这个库了(>人<;)。什么 bug ,那是我的问题,都怪这个内网仓库,没这个包。
开源不易啊(。﹏。*)。