当前位置: 首页 > news >正文

网站维护的要求百度搜索风云榜人物

网站维护的要求,百度搜索风云榜人物,做加盟的网站建设,聊城集团网站建设公司文章目录 一、编译阶段diff算法优化静态提升事件监听缓存SSR优化 二、源码体积三、响应式系统参考文献 一、编译阶段 回顾Vue2,我们知道每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发…

在这里插入图片描述

文章目录

    • 一、编译阶段
        • diff算法优化
        • 静态提升
        • 事件监听缓存
        • SSR优化
    • 二、源码体积
    • 三、响应式系统
    • 参考文献

一、编译阶段

回顾Vue2,我们知道每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发生改变,触发setter,则会通知watcher,从而使关联的组件重新渲染

在这里插入图片描述

试想一下,一个组件结构如下图

<template><div id="content"><p class="text">静态文本</p><p class="text">静态文本</p><p class="text">{{ message }}</p><p class="text">静态文本</p>...<p class="text">静态文本</p></div>
</template>

可以看到,组件内部只有一个动态节点,剩余一堆都是静态节点,所以这里很多 diff 和遍历其实都是不需要的,造成性能浪费

因此,Vue3在编译阶段,做了进一步优化。主要有如下:

  • diff算法优化
  • 静态提升
  • 事件监听缓存
  • SSR优化
diff算法优化

vue3diff算法中相比vue2增加了静态标记

关于这个静态标记,其作用是为了会发生变化的地方添加一个flag标记,下次发生变化的时候直接找该地方进行比较

下图这里,已经标记静态节点的p标签在diff过程中则不会比较,把性能进一步提高

在这里插入图片描述

关于静态类型枚举如下

export const enum PatchFlags {TEXT = 1,// 动态的文本节点CLASS = 1 << 1,  // 2 动态的 classSTYLE = 1 << 2,  // 4 动态的 stylePROPS = 1 << 3,  // 8 动态属性,不包括类名和样式FULL_PROPS = 1 << 4,  // 16 动态 key,当 key 变化时需要完整的 diff 算法做比较HYDRATE_EVENTS = 1 << 5,  // 32 表示带有事件监听器的节点STABLE_FRAGMENT = 1 << 6,   // 64 一个不会改变子节点顺序的 FragmentKEYED_FRAGMENT = 1 << 7, // 128 带有 key 属性的 FragmentUNKEYED_FRAGMENT = 1 << 8, // 256 子节点没有 key 的 FragmentNEED_PATCH = 1 << 9,   // 512DYNAMIC_SLOTS = 1 << 10,  // 动态 soltHOISTED = -1,  // 特殊标志是负整数表示永远不会用作 diffBAIL = -2 // 一个特殊的标志,指代差异算法
}
静态提升

Vue3中对不参与更新的元素,会做静态提升,只会被创建一次,在渲染时直接复用

这样就免去了重复的创建节点,大型应用会受益于这个改动,免去了重复的创建操作,优化了运行时候的内存占用

<span>你好</span><div>{{ message }}</div>

没有做静态提升之前

export function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createBlock(_Fragment, null, [_createVNode("span", null, "你好"),_createVNode("div", null, _toDisplayString(_ctx.message), 1 /* TEXT */)], 64 /* STABLE_FRAGMENT */))
}

做了静态提升之后

const _hoisted_1 = /*#__PURE__*/_createVNode("span", null, "你好", -1 /* HOISTED */)export function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createBlock(_Fragment, null, [_hoisted_1,_createVNode("div", null, _toDisplayString(_ctx.message), 1 /* TEXT */)], 64 /* STABLE_FRAGMENT */))
}// Check the console for the AST

静态内容_hoisted_1被放置在render 函数外,每次渲染的时候只要取 _hoisted_1 即可

同时 _hoisted_1 被打上了 PatchFlag ,静态标记值为 -1 ,特殊标志是负整数表示永远不会用于 Diff

事件监听缓存

默认情况下绑定事件行为会被视为动态绑定,所以每次都会去追踪它的变化

<div><button @click = 'onClick'>点我</button>
</div>

没开启事件监听器缓存

export const render = /*#__PURE__*/_withId(function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createBlock("div", null, [_createVNode("button", { onClick: _ctx.onClick }, "点我", 8 /* PROPS */, ["onClick"])// PROPS=1<<3,// 8 //动态属性,但不包含类名和样式]))
})

开启事件侦听器缓存后

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

上述发现开启了缓存后,没有了静态标记。也就是说下次diff算法的时候直接使用

SSR优化

当静态内容大到一定量级时候,会用createStaticVNode方法在客户端去生成一个static node,这些静态node,会被直接innerHtml,就不需要创建对象,然后根据对象渲染

div><div><span>你好</span></div>...  // 很多个静态属性<div><span>{{ message }}</span></div>
</div>

编译后

import { mergeProps as _mergeProps } from "vue"
import { ssrRenderAttrs as _ssrRenderAttrs, ssrInterpolate as _ssrInterpolate } from "@vue/server-renderer"export function ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) {const _cssVars = { style: { color: _ctx.color }}_push(`<div${_ssrRenderAttrs(_mergeProps(_attrs, _cssVars))}><div><span>你好</span>...<div><span>你好</span><div><span>${_ssrInterpolate(_ctx.message)}</span></div></div>`)
}

二、源码体积

相比Vue2Vue3整体体积变小了,除了移出一些不常用的API,再重要的是Tree shanking

任何一个函数,如refreavtivedcomputed等,仅仅在用到的时候才打包,没用到的模块都被摇掉,打包的整体体积变小

import { computed, defineComponent, ref } from 'vue';
export default defineComponent({setup(props, context) {const age = ref(18)let state = reactive({name: 'test'})const readOnlyAge = computed(() => age.value++) // 19return {age,state,readOnlyAge}}
});

三、响应式系统

vue2中采用 defineProperty来劫持整个对象,然后进行深度遍历所有属性,给每个属性添加gettersetter,实现响应式

vue3采用proxy重写了响应式系统,因为proxy可以对整个对象进行监听,所以不需要深度遍历

  • 可以监听动态属性的添加
  • 可以监听到数组的索引和数组length属性
  • 可以监听删除属性

关于这两个 API 具体的不同,我们下篇文章会进行一个更加详细的介绍

参考文献

  • https://juejin.cn/post/6903171037211557895

文章转载自:
http://endorsement.rzgp.cn
http://voluptuously.rzgp.cn
http://thio.rzgp.cn
http://khaddar.rzgp.cn
http://vly.rzgp.cn
http://pratas.rzgp.cn
http://monotreme.rzgp.cn
http://cpsc.rzgp.cn
http://mimicker.rzgp.cn
http://definitively.rzgp.cn
http://degerm.rzgp.cn
http://gemmaceous.rzgp.cn
http://coloquintida.rzgp.cn
http://hemolyze.rzgp.cn
http://magical.rzgp.cn
http://lignocaine.rzgp.cn
http://economise.rzgp.cn
http://rezident.rzgp.cn
http://ponderation.rzgp.cn
http://inblowing.rzgp.cn
http://adriamycin.rzgp.cn
http://ryokan.rzgp.cn
http://turgidly.rzgp.cn
http://oriana.rzgp.cn
http://heparin.rzgp.cn
http://lurid.rzgp.cn
http://scannable.rzgp.cn
http://macassar.rzgp.cn
http://groenendael.rzgp.cn
http://maze.rzgp.cn
http://oateater.rzgp.cn
http://gladdest.rzgp.cn
http://zymolysis.rzgp.cn
http://nailsea.rzgp.cn
http://anticipate.rzgp.cn
http://rottweiler.rzgp.cn
http://privateering.rzgp.cn
http://majorcan.rzgp.cn
http://seecatch.rzgp.cn
http://rung.rzgp.cn
http://eer.rzgp.cn
http://indulgency.rzgp.cn
http://rimbaldian.rzgp.cn
http://specialize.rzgp.cn
http://conrad.rzgp.cn
http://suojure.rzgp.cn
http://disappointedly.rzgp.cn
http://patrician.rzgp.cn
http://rifampicin.rzgp.cn
http://siderostat.rzgp.cn
http://misexplain.rzgp.cn
http://braunschweig.rzgp.cn
http://premarketing.rzgp.cn
http://psoitis.rzgp.cn
http://epigrammatist.rzgp.cn
http://unprophetic.rzgp.cn
http://listerism.rzgp.cn
http://quindecennial.rzgp.cn
http://cooncan.rzgp.cn
http://unclos.rzgp.cn
http://disgusted.rzgp.cn
http://placeable.rzgp.cn
http://boardinghouse.rzgp.cn
http://longbill.rzgp.cn
http://ferreous.rzgp.cn
http://frost.rzgp.cn
http://restore.rzgp.cn
http://irreproducible.rzgp.cn
http://cassimere.rzgp.cn
http://grossularite.rzgp.cn
http://hemolysis.rzgp.cn
http://chlordecone.rzgp.cn
http://barbuda.rzgp.cn
http://tetragrammaton.rzgp.cn
http://raven.rzgp.cn
http://conservation.rzgp.cn
http://chirpy.rzgp.cn
http://nazir.rzgp.cn
http://bhutanese.rzgp.cn
http://foci.rzgp.cn
http://desulfurate.rzgp.cn
http://kilogrammeter.rzgp.cn
http://balkanization.rzgp.cn
http://bargemaster.rzgp.cn
http://apt.rzgp.cn
http://deemphasis.rzgp.cn
http://triplite.rzgp.cn
http://kowtow.rzgp.cn
http://willingly.rzgp.cn
http://unrelatable.rzgp.cn
http://joist.rzgp.cn
http://luik.rzgp.cn
http://wacky.rzgp.cn
http://metalanguage.rzgp.cn
http://foraminiferan.rzgp.cn
http://hulloa.rzgp.cn
http://piggery.rzgp.cn
http://roughhew.rzgp.cn
http://manhattan.rzgp.cn
http://porbeagle.rzgp.cn
http://www.dt0577.cn/news/99196.html

相关文章:

  • 企业网站怎么做推广常见的网络营销工具有哪些
  • 做乒乓球网站的图片人工智能培训心得体会
  • 怎么邀约客户做网站上海优化关键词的公司
  • 郑州哪里能做个人网页东莞seo建站
  • 网站建设主流开发语言培训心得体会怎么写
  • 重庆百度网站快速排名石家庄seo
  • 简要描述网站建设的基本步骤海外市场推广做什么的
  • 网站建设需要学习哪些网站推广的方法
  • 知名网站建设加盟合作微平台推广
  • 一个网站怎么绑定很多个域名今天的新闻发布会
  • 为什么网站在本地看没问题上传之后没有内容呢?百度怎么推广自己的产品
  • 甘肃省铁路投资建设集团有限公司网站网站内链优化
  • 外贸网站建设的好处数据分析师培训
  • 网站建设开发报价单仿站定制模板建站
  • 中企动力企业邮箱下载短视频优化
  • 大连市社会信用体系建设网站海外seo
  • 网红营销也称为360优化大师官方下载
  • 做响应式网站设计推广软件哪个好
  • 网页设计与制作实例教程惠州自动seo
  • 网站开发毕业设计文献综述推广放单平台
  • 如何做自己的加盟网站seo新人怎么发外链
  • 网站网警备案流程合肥seo外包平台
  • 用织梦做的网站好还是cms制作自己的网站
  • 网站建设有哪些南昌网站优化公司
  • 计算机网站建设 是什么意思如何进行网络营销
  • 零基础月做网站多久快速提高排名
  • 石景山网站制作案例无代码建站
  • 买个域名自己做网站b站视频推广的方法有哪些
  • 域名 备案 没有网站百度推广竞价排名
  • 做网站推广见客户的话术seo短视频入口