前言
大概三四周之前,我给 vue的官方eslint插件 提了一个pr,用来解决相关的issue。一周之前,仓库的维护者合并了代码,这里记录下整个过程。
Issue
简单介绍下这个 issue
我们在写代码的时候,遇到父子通信的场景,一般都是通过 props
和 emit
处理。当我用 ref
声明了变量,emit
的参数一般都是 ref.value
,而不是 ref
。这个issue期望这个新开一个rule或者加入到这个 no-ref-as-operand 规则中。
最终的讨论的结果是先加入到 no-ref-as-operand
中,有需要再新加一个rule。在理清了需求之后,我就开始着手解决这个问题。
PR
这里不涉及具体的代码处理,仅仅分享思路,对代码感兴趣的掘友可以去 github
上查看
场景
emit
一般涉及几种场景
- 模板
- script setup
- setup(props, { emit })
- setup(props, context) // context.emit
首先模板不用考虑,会自动解包(原理是在模板上的 ref
会走一下 proxy
代理)
然后就是剩下的三种情况
script setup
这种的话,仓库里面封装了相关的方法,
所以我们需要做的就是找到 const emit = defineEmits(['xxx'])
,获取标识符 emit
。
对于这种语法 emit('xxx', 'test1', 'test2')
,我们只要能拿到参数数组,逐一查看是否有 ref
就行了。
setup(props, { emit })
这种也有方法去遍历 ast
所以我们要做的是找到 emit('xxx', 'test1', 'test2')
setup(props, context)
这个和上面的具体处理上没啥大的差异,就不多说了。
测试
对于这种开源库,测试用例是至关重要的。
大概六百行的改动,有一半多都是测试用例。
前段时间,我给 simple-git-hooks
提的一个 pr
作者还让我加测试用例来着,就是我不咋会写,emmmm。这里还有个小插曲,我问 github copilet
,结果它一直瞎扯,搞得我没办法,只能自己努努力,补充了测试用例......
八十行的代码改动,只有四五行是内容改动,其他的都是测试用例
结语
如有疑问或者建议,欢迎留言