深入理解Vue(一)

115 阅读3分钟

一、框架设计

Vue3是一款声明式框架

1.1为什么选择声明式

声明式的选择主要体现在性能与可维护性上的权衡,jquery是典型的命令式框架。

命令式框架和声明式框架在性能上的差异主要体现在修改时,命令式框架可以直观的进行对应位置的修改操作,但是声明式框架要先去寻找要修改的位置,再进行修改,我们把修改的性能消耗定义为A,找出差异的为B

命令式的更新性能消耗为A

声明式的更新性能消耗为A+B

所以声明式的 性能消耗一定是高于命令式的,既然声明式的性能消耗更高为什么还要选择声明式呢?这是因为声明式的代码的可维护性更高,并且极致优化的命令式代码很难书写,并且只要我们让性能消耗B尽可能的减小,那么我们在性能上的差距就可以无限贴近于命令式。

1.2为什么选择运行时+编译时

编译时的架构是指将一段代码直接编译成命令式代码,运行时的架构是指将一段代码通过一个黑盒进行运行,然后再生成命令式代码执行,vue3提供了编译时➕运行时的模式,让我们可以在写类似于html的模版或者直接写树形结构调用Render函数,还是提高了可维护性和书写的便捷性

编译时的优点:因为对代码进行了编译工作,所以可以对用户提供的内容进行分析

二、框架设计的核心

2.1提升用户的体验

会用console.warn来反馈出一些方便定位问题所在的信息

小tip:

在我们打印ref数据时,console.log(ref(0))控制台的输出一般是2-1这个样子的

image.png 这个显示是不直观的,浏览器支持我们自定义编写formatter从而自定义输出形式,在vue3中可以搜索到initCustomFormatter的函数,该函数就是用于开发环境初始化自定义formatter的,可以在设置中打开

image.png

这样我们再打印时可以得到直观的内容

image.png

2.2控制框架代码的体积

2.2.1剔除不必要的调试体验代码

因为要提高用户体验,所以框架在设计的时候会有很多的用于发出警告和检查的代码,但这些代码在生产环境中时不需要的,vue在做这个设计的时候采用了环境变量判断的模式

if (__DEV__ && !res) {
  warn(
    `Faild to mount app......`
  )
}

可以看到__DEV__环境变量在开发环境下为true,在生产环境下为false,如果为false这段代码就永远不会执行了,在用rollup.js进行打包的时候就会被移除,有效的减少了生产环境下的代码体积

2.2.2剔除不必要的废代码或无意义代码
export const isHTMLTag = /*#__PURE__*/ makeMap(HTML_TAGS)

也会用/#PURE/来表示这个函数没有副作用,如果该函数只是读一个结果,并且该结果没有赋值给别的单位,最终也会被删除

2.2.3剔除没用的功能代码

框架在设计时会随着更新的迭代产生一些废弃的api,在我们明确我们项目中没有使用时,可以通过相应的配置进行删除处理,例如vue3中如果我们明确我们使用的是Composition API就可以用__VUE_OPTIONS_API__开关来关闭选项式API的特性,从而减小代码体积

2.3 错误处理

提供统一的错误处理函数