看到里有不少水文…那…我也就有胆子来灌水了[不是]
然后…本文没啥实际用途,而且弄得比较仓促,有些为德不卒;加之我比较水,就…
其实不过是一个依据 commit 、 社区讨论进程了解源码的的一个碎片化记录,面试等情况是不会考这些的。
在咱们看源码的时分,有时会惊讶于:作者是怎么想到这个问题的?其实若盯梢其提交记录、讨论记录,也许能够协助咱们了解问题的发现与解决,见证作者的生长[doge]。
以上为本篇正文,感谢各位看官观摩,现在能够 Alt + F4 了[划掉]
咳…其实是某群里有位小伙伴问了一个问题,截图对应的代码如下:
if ((key in vm) && isReserved(key)) {
warn(
`Method "${key}" conflicts with an existing Vue instance method. ` +
`Avoid defining component methods that start with _ or $.`
)
}
}
vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm)
问道:
请问一下,isReserved是判别什么的
这显着是 Vue 的提示,所以去 Vue 的仓库(v2.6) 搜了一下这段代码所在的位置:
src\core\instance\state.js
function initMethods (vm: Component, methods: Object) {
const props = vm.$options.props
for (const key in methods) {
if (process.env.NODE_ENV !== 'production') {
if (typeof methods[key] !== 'function') {
warn(
`Method "${key}" has type "${typeof methods[key]}" in the component definition. ` +
`Did you reference the function correctly?`,
vm
)
}
if (props && hasOwn(props, key)) {
warn(
`Method "${key}" has already been defined as a prop.`,
vm
)
}
if ((key in vm) && isReserved(key)) {
warn(
`Method "${key}" conflicts with an existing Vue instance method. ` +
`Avoid defining component methods that start with _ or $.`
)
}
}
vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm)
}
}
这个办法仅判别最初是否为 $ 或 _
经过正告内容可知,冒犯该规则的三个条件:
- 当前为非生产模式,一般来说是本地开发模式才会执行这些正告。这非常简单了解:类似于这些警报提示是面向开发者的,而非面向最终用户;
- 新的 key 已经在 Vue 实例中存在,接下来会掩盖已有的项目;
- 大家定义私有办法时喜欢以 $ 或 _ 最初,但 Vue 中恰恰也是以这俩作为私有办法的最初内容的,可能会引发抵触,所以需求警示开发者尽量不要这么做,以免造成不良影响,规范后续行为。这就是 isReserved 的判别。
能够这么了解:
isReserved 的作用是,在 Vue 实例发生命名抵触时(第2点),提供一种参阅建议,来协助开发者接下来规避与 Vue 已有办法的抵触。
插曲:
为了更好地了解其间缘由,咱们能够了解一下其提交历史。VSCode 的话,能够合作 GitLens 检查该行对应的 commit.
Vue 2 仓库中,src/core/util/lang.js
有这个 isReserved 办法
注释内容为:
Check if a string starts with $ or _
从该文件第一次创立时就有了,对应的 commit 信息为 restructure,这儿不简单找线索。
到调用途 src/core/instance/state.js
上对应的commit 为:
chore:warn methods that conflict with internals. close #6312
顺着该 commit 打开对应的 issue:
www.github.com/vuejs/vue/i…
可见是讨论命名抵触的问题,不过没有讨论出很好的成果,仅仅一个开端。
后来尤大调整了这个战略,见该比对:
github.com/vuejs/vue/c…
也就是现在的样子。
在该 issue 的最终,其他的 issue 提及了该问题,顺着里边持续看 #7070
www.github.com/vuejs/vue/i…
这讨论算是完结了。
另:
相对应的,从风格攻略中有关于 $ 和 _ 的使用约定:
cn.vuejs.org/v2/style-gu…
对于这种私有情况,约定是以 $_ 为最初,这样就必然能够规避最初的报错了。
以上就是结合多种方式了解源码的一个小栗子。没什么难度,仅仅需求多点耐性,相信大家都能搞定的~
最终,以此也能发现严格要求 commit 格式的优点:方便其他团队成员追溯。提交时一般会使用 commit lint 进行预先校验,相关文章浩如烟海,本文就不赘述了。