eslintUnexpected_side_effect_in__computed_property_0">关于eslint误报Unexpected side effect in “” computed property的问题
eslint_1">先说结论,我没有在computed中修改任何页面变量,这属于eslint监测机制的误判报错。
好的现在进入正文。
起因:
我在eslint中设置了no-side-effects-in-computed-properties,
这个属性会检测开发人员是否在computed中改变了页面变量的值,
因为这种做法并不推荐所以会报错,
若有此需要,建议在watch中执行。
问题表现:
其中tool是一个挂载在VUE原型链上的工具对象
其本身包含的是一些通用方法,spliceString就是其中之一,源码如下
可以看到我并没有在computed中修改页面变量的值,那么为什么Eslint还会给我报错呢。
所以我去翻看了Eslint的源码。
寻找问题的根源
在Eslint包内的no-side-effects-in-computed-properties.js文件中,我找到了这么一段
可以看到当findMutating方法返回值满足条件是,Eslint就会向我们报刚刚看到的错,所以我又去寻找这个findMutating方法。
终于找到了万恶之源:
很明显,按照这个方法的逻辑,我们的这段代码最终会走到调用表达式的判断中,也就是上图红框中的代码段。
真相大白
Eslint会对所谓的callName做判断,如果name中包含push|pop|shift|unshift|reverse|splice|sort|copyWithin|fill这些字符串,则会返回并报错。
因为这些数组或者字符串的方法会改变变量的值,这是在规则中不允许的。
再返回去看我们的callName
包含了splice字符串,所以Eslint才会给我们报错。
解决
解决方法目前有几种,
1.对改行禁用Eslint校验,// eslint-disable-line
2.换一个方法名,不要包含push|pop|shift|unshift|reverse|splice|sort|copyWithin|fill这些字眼。
3.自行修改Eslint的源码中的校验规则(不推荐)
4.不要将tool整个挂载到vue原型链上,而是需要的时候再引入。