vue3.0的优化(一)

摘要:
使用vue3创建工具查看结构exportfunctionrender(_ctx,可以在渲染过程中重用<{{msg}}<const_hoisted_1=/*#__PURE_*/_createVNode(“p”,可以直接缓存和重用;button@click=“单击”>单击事件&lt_cache,$options){return(_openBlock(),

vue3性能优于vue2.x,主要原因有以下四点:

一、diff算法优化:

  • vue2.x的虚拟DOM是进行全量比较。
  • vue3新增了静态标记(PatchFlag)。

在于上次虚拟节点进行比较的时候,只比较带有静态标记的节点,减少了比较的次数。

vue3.0的优化(一)第1张

使用vue3创建工具查看一下创建结构

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("p", null, "我是段落"),
    _createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
  ]))
}

可以看到对于需要改变的内容的地方添加了一个1,这个1就是静态标记,每次内容更新也只会比较带有静态标记的地方。

二、静态提升

  • vue2.x无论元素是否参与更新,每次都会重新创新,然后渲染
  • vue3中对于不参与更新的元素会做静态提升,只会创建一次,在渲染的时候复用即可
<div>
  <p>Hello World!</p>
  <p>{{msg}}</p>  
</div>

以上节点

使用静态提升之前:

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("p", null, "Hello World!"),
    _createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
  ]))
}

使用静态提升之后:

const _hoisted_1 = /*#__PURE__*/_createVNode("p", null, "Hello World!", -1 /* HOISTED */)

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createBlock("div", null, [
    _hoisted_1,
    _createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
  ]))
}

可以看到使用静态提升之前的代码,是每次渲染的时候都会去重新创建;使用静态之后的代码,只有第一次创建,然后直接复用。把不需要参与更新的元素放在外面只创建一次。

三、事件监听缓存

默认情况下,会为事件添加一个静态标记,所以每次都会去监听事件的变化,但是因为是同一个函数,所以没有必要去监听变化,直接缓存复用即可

<div>
  <button @click="click">点击事件</button>
</div>

以上节点

使用事件监听缓存之前:

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("button", { onClick: _ctx.click }, "点击事件", 8 /* PROPS */, ["onClick"])
  ]))
}

8就是静态标记,因此每次更新DOM,都会追踪这个方法进行对比。

使用事件监听缓存之后:

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("button", {
      onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.click && _ctx.click(...args)))
    }, "点击事件")
  ]))
}

使用事件监听缓存之后的代码静态标记就已经被去掉了,这样就不会去进行对比。

四、SSR渲染

先使用新的工具创建一个vue3的项目,也就是vite。

  • 安装Vite------npm i -g create-vite-app
  • 利用Vite创建vue3项目------ceate-vite-app projectName

Vite是Vue作者开发的一款试图取代webpack的工具

实现原理是利用es6的import发送请求去加载文件的特性,拦截这些请求,做一些预编译,省去webpack冗长的打包时间。

SSR渲染利于搜索引擎,解决白屏问题,因为正常情况下在index.html文件中只有一个简单的标签,没有内容,不利于爬虫搜索

免责声明:文章转载自《vue3.0的优化(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇sqoop迁移PE重装系统下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

VC++或QT下 高精度 多媒体定时器

在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了。如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便。先要包含头文件"mmsystem.h"和库文 件"winmm.lib"。  虽然Win95下可视化开发工具如VC、D...

Winform 多个窗口编辑同一条数据同步的实现

场景: 一个主窗口中,可以在列表(DataGridView)里选中一条记录编辑,打开一个编辑窗口(非模态窗口),编辑窗口保存后需要刷新父窗口,由于编辑窗口是非模态窗口,如果打开了多个窗口,并且都是编辑同一条数据,那么一个窗口保存(并关闭)后,需要通知其它正在打开的窗口“数据有更改,需要刷新” 首先,刷新父窗口,如果是打开编辑窗口是模态窗口,那么可以类似如下...

浅析vue数据绑定

前言:最近团队需要做一个分享,脚进脑子,不知如何分享。最后想着之前一直想研究一下 vue 源码,今天刚好 “借此机会” 研究一下。 网上研究vue数据绑定的文章已经非常多了,但是自己写一遍,敲一遍demo和看别人的文章是完全不同的,so……搬运工来了 目前数据绑定主要有以下三种实现方式: 1.   脏值检查(angular.js)    轮询检测数据变化...

C#判断ContextMenuStrip右键菜单的来源(从哪个控件弹出来的) (转载)

有时候,为了提高性能和节约资源,我们会为多个控件,指定同一个右键弹出菜单,这时,通常会产生一个需求: 判断当前的弹出菜单是从哪个控件上弹出来,也就是“是由哪个控件的右键点击触发的”,以便于做进一步的控制。 在.NET当中,实现起来是非常简单的,假设弹出菜单为 ContextMenuStrip1,则只需要在 该菜单的 Opening 事件进行判断处理即可。...

Fiddler(Web/HTTP调试利器)

简述 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie、html、js、css等文件,这些都可以让你胡乱修改的意思)。Fiddler要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式。 简述 介绍...

mysql安装,以及从csv插入数据

1.mysql安装     用管理员身份打开cmd命令行工具,cd到解压文件的bin目录:    ・MySql的Windows服务安装: mysqld install 回车  ・生成无密码的root用户: mysqld --initialize-insecure 回车  ・启动mysql : net start mysql  (或从windows服务手动启...