我给vue官方eslint插件提了一个pr

257 阅读2分钟

前言

大概三四周之前,我给 vue的官方eslint插件 提了一个pr,用来解决相关的issue。一周之前,仓库的维护者合并了代码,这里记录下整个过程。

Issue

简单介绍下这个 issue

image.png

我们在写代码的时候,遇到父子通信的场景,一般都是通过 propsemit 处理。当我用 ref 声明了变量,emit 的参数一般都是 ref.value,而不是 ref。这个issue期望这个新开一个rule或者加入到这个 no-ref-as-operand 规则中。

image.png

最终的讨论的结果是先加入到 no-ref-as-operand 中,有需要再新加一个rule。在理清了需求之后,我就开始着手解决这个问题。

PR

这里不涉及具体的代码处理,仅仅分享思路,对代码感兴趣的掘友可以去 github 上查看

场景

emit 一般涉及几种场景

  1. 模板
  2. script setup
  3. setup(props, { emit })
  4. setup(props, context) // context.emit

首先模板不用考虑,会自动解包(原理是在模板上的 ref 会走一下 proxy 代理)

image.png

然后就是剩下的三种情况

script setup

这种的话,仓库里面封装了相关的方法,

image.png

所以我们需要做的就是找到 const emit = defineEmits(['xxx']),获取标识符 emit

对于这种语法 emit('xxx', 'test1', 'test2'),我们只要能拿到参数数组,逐一查看是否有 ref 就行了。

setup(props, { emit })

这种也有方法去遍历 ast

image.png

所以我们要做的是找到 emit('xxx', 'test1', 'test2')

setup(props, context)

这个和上面的具体处理上没啥大的差异,就不多说了。

测试

对于这种开源库,测试用例是至关重要的。

大概六百行的改动,有一半多都是测试用例。

image.png

前段时间,我给 simple-git-hooks 提的一个 pr

image.png

作者还让我加测试用例来着,就是我不咋会写,emmmm。这里还有个小插曲,我问 github copilet,结果它一直瞎扯,搞得我没办法,只能自己努努力,补充了测试用例......

image.png

八十行的代码改动,只有四五行是内容改动,其他的都是测试用例

image.png

结语

如有疑问或者建议,欢迎留言