Vue.js 设计与实现 知识点 Vol. 2 | 青训营笔记

156 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第21天

我将创作一些 Vue.js 学习相关的笔记。

《Vue.js设计与实现》笔记 Vol. 2

框架设计的核心要素

提升用户的开发体验

开发体验是衡量一个框架的重要指标之一。

提供友好的警告信息至关重要,这有助于开发者快速定位问题。

Vue.js 源码中经常有 warn 函数的调用,它会收集当前发生错误的组件栈信息,其原理就是 console.warn 函数。

此外,输出友好的信息格式也能进一步提升用户的开发体验。

Vue.js 3 源码中包含 initCustomFormatter 函数,该函数是用来在开发环境下初始化自定义formatter 的。结合 DevTools 使用,formatter 会使得输出内容变得非常直观。

控制框架代码的体积

在 Vue.js 3 源码中,每一个 warn 函数的调用都会配合 DEV 常量的检查,例如:

if (!result) {
  __DEV__ &&
    warn(
      `Failed to mount root instance: selector "${selectorOrEl}" returned null.`
    )
  return
}

打印警告信息的前提是:DEV 这个常量一定要为 true.

Vue.js 使用 rollup.js 对项目进行构建,这里的 DEV 常量实际上是通过 rollup.js 的插件配置来预定义的。Vue.js 在输出资源的时候,会输出用于开发环境的版本(vue.global.js)和用于生产环境的版本(vue.global.prod.js)。

构建开发环境,DEV 常量设置为 true,这时上面那段输出警告信息的代码就等价于:

if (!result) {
  true &&
    warn(
      `Failed to mount root instance: selector "${selectorOrEl}" returned null.`
    )
  return
}

判断条件为真,所以这段代码在开发环境中是肯定存在的。

构建生产环境,DEV 常量设置为 true,这时上面那段输出警告信息的代码就等价于:

if (!result) {
  false &&
    warn(
      `Failed to mount root instance: selector "${selectorOrEl}" returned null.`
    )
  return
}

因为判断条件始终为假,这段永远不会执行的代码称为 dead code,它不会出现在最终产物中,在构建资源的时候就会被移除,因此 vue.global.prod.js 中是不会存在这段代码的。

感想

提升用户的开发体验需要显示警告信息,而控制框架代码的体积又需要删除无关信息。最终 Vue.js 选择了使用 DEV 参数,真正做到了在开发环境中为用户提供友好的警告信息的同时,不会增加生产环境代码的体积。这就是框架设计的平衡的艺术。

引用参考

霍春阳. Vue.js设计与实现[M]. 1. 北京:人民邮电出版社, 2022.