一文带你了解什么是Vue Vapor

 更新时间:2024年11月26日 14:42:18   作者:前端欧阳  
随着Svelte和SolidJS的流行,无虚拟DOM模式逐渐开始火了起来,Vue Vapor就是一个无虚拟DOM模式版本的vue,下面就跟随小编一起来深入了解一下Vue Vapor吧

前言

随着SvelteSolidJS的流行,无虚拟DOM模式逐渐开始火了起来。vue也推出了无虚拟DOM模式的版本,就是我们今天要讲的Vue Vapor

什么是Vue Vapor

Vue Vapor是一个无虚拟DOM模式版本的vue。这个仓库是2023年11月9日基于vuejs/core仓库(也就是vue3仓库)新建的,项目地址为 https://github.com/vuejs/core-vaporVue Vapor目前还处于实验阶段,不过你可以通过官方提供的Vue Vapor演练场在线体验无虚拟DOM版本的vue。playground演练场的地址为:https://vapor-repl.netlify.app

目前Vue Vapor只实现了vue3中的部分功能,KeepAliveTeleport等还未实现。详情查看官方的TODO:https://github.com/vuejs/core-vapor?tab=readme-ov-file#todo

如何使用Vue Vapor

对于使用者来说无虚拟DOM模式版本的vue和目前的vue3用法是一样的,vue只是对内部实现进行了修改,对外暴露出的API还是一样的,当然关于虚拟DOM相关的API在Vue Vapor中没有了。

我们来看看一个demo,和目前vue3写法是一样的:

<script setup>
import { ref } from 'vue'
const msg = ref('Hello World!')
</script>

<template>
  <h1>{{ msg }}</h1>
  <input v-model="msg" />
</template>

我们再来看看运行效果:

从*.vue文件渲染到浏览器真实DOM的过程

我们先来看看目前版本的vue是如何从一个*.vue文件渲染到浏览器真实DOM?

目前的vue是通过webpack或者vite等工具先将*.vue文件编译成一个js文件,js文件中主要的就是render函数。然后执行render函数生成虚拟DOM,再调用浏览器的DOM API根据虚拟DOM生成真实DOM挂载到浏览器上。

我们再来看看Vue Vapor是如何从一个*.vue文件渲染到浏览器真实DOM?

也是一样的首先通过webpack或者vite等工具先将*.vue文件编译成一个js文件,js文件中主要的就是render函数。然后执行render函数后会直接调用浏览器的DOM API生成真实DOM挂载到浏览器上。其实就是跳过了虚拟DOM的过程。

没有虚拟DOM后,Vue Vapor如何实现响应式

我们先来看看demo编译后的js代码中的render函数,下面是我简化后的代码:

function render(_ctx) {
  _withDirectives(n2, [[_vModelText, () => _ctx.msg]])
  _on(n2, "update:modelValue", $event => ((_ctx.msg) = $event))

  _renderEffect(() => {
    _setText(n1, _ctx.msg)
  })
}

这里的n2变量为input输入框dom元素,n1变量为显示msg值的h1标签dom元素。明显可以看见render函数中没有createElementVNode等生成虚拟DOM的函数调用。

我们先来看看_withDirectives函数,vue3withDirectives函数的功能为给虚拟DOM增加自定义指令。我们这里没有虚拟DOM,所以这里是给真实DOM(input输入框)增加v-model的指令。

我们再来看看下面 _on函数,这里是让input输入框监听一个名为update:modelValue的事件,触发事件后会将上下文中的msg变量的值更新为输入框中的输入值。

我们最后来看看_renderEffect函数,看名字你可能已经猜出来了。这个函数和vue3中的watchEffect比较相似,会立即运行一个函数。并且追踪函数中用的的依赖,这里的依赖是msg变量。当依赖的值变化时会再次执行这个函数。

这里的_setText(n1, _ctx.msg),实际就是执行了n1.textContent = _ctx.msgtextContent 属性表示一个节点及其后代的文本内容,也可能通过给它赋值的方式删除它的所有子节点,并替换为一个具有给定值的文本节点,和innerText功能比较相似。

msg变量的值变了后就会执行回调函数,在回调函数中会执行_setText函数。_setText函数会通过更新h1标签的textContent属性让h1标签始终显示msg变量最新的值,从而实现响应式。

总结

本文介绍了Vue Vapor,没有虚拟DOM版本的vue。对于普通开发者来说Vue Vapor其实和目前的vue3没有什么区别,前提是不涉及虚拟DOM。只是vue在内部实现上去掉了虚拟DOM,改为直接操作真实DOM。

到此这篇关于一文带你了解什么是Vue Vapor的文章就介绍到这了,更多相关Vue Vapor内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue封装实现自动循环滚动的列表

    vue封装实现自动循环滚动的列表

    在做数据大屏开发的过程中,经常出现需要对列表进行自动滚动的需求,所以本文就来为大家介绍一下如何利用vue封装一个自动循环滚动的列表吧
    2023-09-09
  • Vue将将后端返回的list数据转化为树结构的实现

    Vue将将后端返回的list数据转化为树结构的实现

    本文主要介绍了Vue将将后端返回的list数据转化为树结构的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 深入了解Vue之组件的生命周期流程

    深入了解Vue之组件的生命周期流程

    每个Vue实例在创建时都要经过一系列初始化, 例如设置数据监听、编译模板、将实例挂载到DOM并在数据变化时更新DOM等,同时, 也会运行一些叫作生命周期钩子的函数,接下来让我们一起来探索Vue实例被创建时都经历了什么,感兴趣的同学跟着小编一起来探讨吧
    2023-05-05
  • vue+elementui实现动态添加行/可编辑的table

    vue+elementui实现动态添加行/可编辑的table

    这篇文章主要为大家详细介绍了vue+elementui实现动态添加行/可编辑的table,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • electron-vite工具打包后如何通过内置配置文件动态修改接口地址

    electron-vite工具打包后如何通过内置配置文件动态修改接口地址

    使用electron-vite 工具开发项目打包完后每次要改接口地址都要重新打包,对于多环境切换或者频繁变更接口地址就显得麻烦,这篇文章主要介绍了electron-vite工具打包后通过内置配置文件动态修改接口地址实现方法,需要的朋友可以参考下
    2024-05-05
  • 详解vue通过NGINX部署在子目录或者二级目录实践

    详解vue通过NGINX部署在子目录或者二级目录实践

    这篇文章主要介绍了详解vue通过NGINX部署在子目录或者二级目录实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • vue内置组件keep-alive事件动态缓存实例

    vue内置组件keep-alive事件动态缓存实例

    这篇文章主要介绍了vue内置组件keep-alive事件动态缓存实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 详解vue中使用微信jssdk

    详解vue中使用微信jssdk

    这篇文章主要介绍了vue中使用微信jssdk,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue中关于$emit和$on的使用及说明

    vue中关于$emit和$on的使用及说明

    这篇文章主要介绍了vue中关于$emit和$on的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Vue实现过渡效果的基本方法

    Vue实现过渡效果的基本方法

    Vue 提供了一个强大的过渡系统,可以用于在进入、离开和列表渲染时添加各种动画效果,这些过渡不仅能够提升用户体验,还能使界面更加生动和吸引人,本文将介绍 Vue 中实现过渡效果的基本方法,并提供使用 setup 语法糖的代码示例,需要的朋友可以参考下
    2024-09-09

最新评论