Vue3 源码解读之KeepAlive理解

224 阅读3分钟

介绍

keep-alive是Vue的内置组件。 负载平衡是一种在真实服务器群集之间分配 IP 流量的方法,可提供一个或多个高度可用的虚拟服务。在设计负载平衡拓扑时,必须考虑负载平衡器本身及其背后的真实服务器的可用性。

Keepalived为负载平衡和高可用性提供了框架。负载平衡框架依赖于众所周知且广泛使用的 Linux 虚拟服务器 (IPVS) 内核模块,该模块提供第 4 层负载平衡。Keepalived 实现了一组运行状况检查器,以根据其运行状况动态、自适应地维护和管理负载平衡的服务器池。高可用性是通过虚拟冗余路由协议 (VRRP) 实现的。VRRP 是路由器故障转移的基本模块。此外,keepalived实现了一组与VRRP有限状态机的挂钩,提供低级和高速协议交互。每个 Keepalived 框架可以单独使用,也可以一起使用,以提供弹性基础架构。

在这种情况下,负载平衡器也可以称为控制器LVS路由器

简而言之,Keepalived提供了两个主要功能:

  • LVS 系统的运行状况检查
  • 实现 VRRPv2 堆栈以处理负载平衡器故障转移

基本用法

image.png keep-alive还提供了三个props:

  • include:名称匹配的组件被缓存,可以用逗号分割的字符串,正则表达式或数组。
  • exclude:名称匹配的组件不会被缓存,可以用逗号分割的字符串,正则表达式或数组。
  • max:最多缓存多少组实例。一旦超过这个数字,在新实例创建之前,已缓存组件中最久没有被访问的实例会被销毁。

keep Alived组件的实现原理

KeepAlive 的本质是缓存管理和特殊的挂载/卸载逻辑。KeepAlive 组件的实现需要渲染器层面的支持。这是因为被 KeepAlive 的组件在卸载的时候,渲染器并不会真的将其卸载,而是会将该组件搬运到一个隐藏的容器中,实现 “假卸载”,从而使得组件可以维持当前状态。当被 KeepAlive 的组件再次被 “挂载” 时,渲染器也不会真的挂载它,而是将它从隐藏容器中搬运到原容器。这个过程对应到组件的生命周期,其实就是 activated 和 deactiveated

image.png 如上图所示,“卸载” 一个被 KeepAlive 的组件时,它并不会真的被卸载,而会被移动一个隐藏容器中。当重新 “挂载” 该组件时,它也不会真的被挂载,而会被从隐藏容器中取出,再 “放回” 原来的容器中,即页面中。

KeepAlive 组件的setup函数

setup 函数是 Vue.js 3 新增的组件选项,主要用于配置组合式API.在组件的整个生命周期中,setup 函数只会在被挂载时执行一次,它的返回值有以下两种情况:

(1)返回一个函数,该函数将会作为组件的 render 函数

(2)返回一个对象,该对象中包含的数据将会暴露给模板使用

在 KeepAlive 组件的 setup 函数中,返回的是一个函数,该函数将会直接作为组件的render函数。如下面的代码所示:

// packages/runtime-core/src/components/KeepAlive.ts 
// setup 函数用于配置组合式 API
// 在组件的整个生命周期中,setup 函数只会在被挂载时执行一次 
setup(props: KeepAliveProps, { slots }: SetupContext) { 

// 省略部分代码 

// 在 setup 函数中返回一个函数,这个函数会作为组件的 render 函数 

return () => {
  pendingCacheKey = null 
  if (!slots.default) {
       return null
     } 
// KeepAlive 的默认插槽就是要被 KeepAlive 的组件 

 const children = slots.default()
// 省略部分代码 

// 返回要渲染的组件 
  return rawVNode 
    } 
  }