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

定制网站的优势锦州如何做百度的网站

定制网站的优势,锦州如何做百度的网站,aspcms 网站统计,网站pv是什么意思#x1f60a;博主#xff1a;小猫娃来啦 #x1f60a;文章核心#xff1a;深入探索前端框架中的Diff算法#xff1a;优化视图更新与性能提升 文章目录 前端框架中的Diff算法概述vue和react框架的diff算法React的diff算法#xff1a;Vue的diff算法#xff1a; Diff算法在… 博主小猫娃来啦 文章核心深入探索前端框架中的Diff算法优化视图更新与性能提升 文章目录 前端框架中的Diff算法概述vue和react框架的diff算法React的diff算法Vue的diff算法 Diff算法在前端框架中的应用场景基本Diff算法原理及工作流程虚拟DOM的创建和更新节点比对和差异计算过程 常见前端框架中的Diff算法实现React框架的Reconciliation算法Vue框架的响应式系统及Diff策略 优化Diff算法的高级技巧键值对比和唯一标识符合并操作和批量处理异步渲染和增量更新 Diff算法的性能评估和优化方法参考文献 前端框架中的Diff算法概述 前端框架中的diff算法是一种比较两个虚拟DOM树之间差异的算法。在更新页面时为了提高性能前端框架通常会先生成新的虚拟DOM树然后通过diff算法比较新旧虚拟DOM树的差异并将差异应用到实际的DOM树上以达到更新页面的目的。 diff算法的核心思想是尽量减少DOM操作次数只对真正变化的部分进行更新而不是全量替换整个DOM树。它通过深度优先遍历比较新旧虚拟DOM树中的节点找出同一层级上不同的节点并记录下它们的差异。 细分的话diff算法可以分为以下几个步骤 比较两个节点是否相同如果不相同则认为该节点需要更新。如果两个节点类型不同则直接替换节点。如果节点类型相同比较节点的属性更新发生变化的属性。对子节点进行递归比较找出差异并更新。 在比较过程中diff算法会基于一些启发式的策略来提高效率例如使用唯一标识符key来帮助判断节点的移动和重排从而减少不必要的DOM操作。 diff算法的核心是通过比较新旧虚拟DOM树之间的差异只更新发生变化的部分避免全量替换整个DOM树从而提高页面的更新性能。 vue和react框架的diff算法 React和Vue是两个目前最流行的前端框架它们都采用了不同的diff算法来实现高效的虚拟DOM更新。 React的diff算法 React采用了一种称为Reconciliation的diff算法。它基于以下几个假设 假设1两个不同类型的组件会产生出不同的树形结构它们的上下文也会完全不同。因此React总是销毁旧的树建立起新的树。 假设2对于同一类型的组件可以通过其props来判断是否需要重新渲染即使其内部状态(state)发生了变化。 假设3对于列表数组中的子元素React会使用唯一的key标识每个元素以便更准确地判断元素的增删和移动。 基于以上假设React的diff算法可以简化为以下几个步骤 步骤1 比较两个节点的类型 如果节点类型不同直接替换该节点及其子树。 如果节点类型相同进入下一步比较其属性。 步骤2 比较节点的属性更新发生变化的属性。 步骤3 递归比较子节点 对子节点列表进行遍历使用唯一的key来唯一标识每个子节点。在遍历过程中React会尽量复用已存在的节点         如果新旧子节点列表中存在相同的key会复用旧节点并递归比较其属性和子节点。         如果新旧子节点列表中不存在对应的key会创建新节点并插入到对应位置。 React的diff算法采用了先序深度优先遍历的方式进行节点比较通过标记tag来表示节点的操作类型如插入、更新、移动、删除等。这样可以在遍历过程中尽早地找到差异并将差异应用到实际的DOM树上以最小的代价实现页面的更新。 Vue的diff算法 Vue采用了一种称为Virtual DOM with Keyed Diff的diff算法。它也是基于虚拟DOM的比较和更新机制但与React略有不同。 而Vue的diff算法呢主要包括以下几个步骤 步骤1 比较新旧虚拟DOM的根节点 如果节点类型不同直接替换整个DOM树。如果节点类型相同进入下一步。 步骤2 逐层对比新旧虚拟DOM的子节点 首先根据子节点的key进行查找和匹配。如果key匹配成功说明是同一个节点比较其属性并递归地对比其子节点。如果没有找到匹配的key说明是新增的节点或者被移除的节点进行插入或删除操作。 Vue的diff算法中通过key来唯一标识每个子节点以便更高效地判断节点的增删和移动。同时Vue还使用了双端比较策略在确定了匹配节点后同时从新旧虚拟DOM的头尾进行对比以提高性能。 值得注意的是Vue的diff算法相对于React的算法而言更加偏向于全量替换即当节点类型相同但属性发生变化时Vue会直接替换整个DOM节点而不去细粒度地更新节点的属性。这是因为Vue更注重响应式数据的变化而非手动操作的变化。 总结 React的diff算法采用的是Reconciliation算法通过先序深度优先遍历的方式逐层对比和更新差异。 Vue的diff算法采用的是Virtual DOM with Keyed Diff算法通过key唯一标识子节点并使用双端比较策略来提高性能。 那么React的useEffect这个hook的意义就出来了关于vuereact甚至微信小程序uniapp的生命周期hooks以及vue和react全面的区别后续会出文章说明。 Diff算法在前端框架中的应用场景 Diff算法主要应用于对比新旧状态之间的差异并针对变化进行局部更新。这种增量式的更新方式将减少不必要的DOM操作提高页面性能和用户体验。 根据项目经验以及对于前端框架的了解我总结出了diff算法的4个应用场景。 首先是虚拟dom的更新 前端框架使用虚拟DOMVirtual DOM来表示页面结构通过Diff算法比较新旧虚拟DOM树之间的差异并将差异应用到实际的DOM上从而实现页面的更新。这种方式减少了直接对实际DOM进行频繁的操作提高了性能和效率。 其次是列表渲染的时候 当列表数据发生改变时Diff算法可以精确找出新增、删除、移动或修改的列表项并只更新发生变化的部分。这样可以避免重新渲染整个列表减少不必要的工作量提升性能。 表单输入方面 在表单输入的场景中Diff算法可以监测用户的输入变化并只更新与变化相关的部分。例如当用户在输入框中键入文本时Diff算法可以检测并更新输入框的值而无需重新渲染整个表单。 动态切换组件的时候 在一些场景中需要根据不同的条件或用户操作动态地切换组件的显示。Diff算法可以检测到组件的变化并针对变化进行更新使得只有需要变化的部分被重新渲染提高页面响应速度。 基本Diff算法原理及工作流程 虚拟DOM的创建和更新 创建虚拟DOM 使用JSX或h()函数创建虚拟DOM元素在前端框架中通常使用JSX语法或h()函数来创建虚拟DOM元素。这些元素包含有关组件类型、属性、子节点等信息。 构建虚拟DOM树通过将创建的虚拟DOM元素以树的形式组织起来形成虚拟DOM树。树的根节点表示整个页面结构子节点表示嵌套的组件以及它们的子组件。 将虚拟DOM树渲染为实际的DOM通过遍历虚拟DOM树并根据其中的节点类型、属性等信息创建对应的实际DOM节点。最终将创建的实际DOM插入到文档中展示给用户。 更新虚拟DOM 生成新的虚拟DOM树当页面状态发生变化时需要生成新的虚拟DOM树来反映这些变化。可以通过重新执行创建虚拟DOM的流程生成与当前状态对应的新虚拟DOM树。 Diff算法比较新旧虚拟DOM树使用Diff算法对比新旧虚拟DOM树之间的差异找出需要更新的节点。 生成DOM操作指令根据Diff算法的结果生成描述对实际DOM的操作指令如添加、移动、修改或删除节点等。 执行DOM操作将生成的DOM操作指令应用于实际的DOM树通过最小化操作的范围高效地更新实际DOM使其与新的虚拟DOM保持同步。 节点比对和差异计算过程 关于diff的原理有太多博主都进行过文章讲解。我这里推荐一篇博客我认为讲的是特别的清楚 博主疾风小蜗牛【vue】diff 算法详解 ⭐⭐⭐其节点对比过程可以总结为5步 逐层比较节点类型从根节点开始逐级比较新旧虚拟DOM树中相同位置的节点类型如标签名是否相同。如果节点类型不同说明节点已经完全不同需要进行替换操作。 比较节点属性对于相同节点类型的节点进一步比较它们的属性是否相同。如果属性有变化需要执行更新操作。常见的属性包括样式、类名、事件监听器等。 比较子节点如果节点类型和属性都相同接下来需要比较它们的子节点。这里使用递归的方式将子节点进行同样的节点比对和差异计算过程。对于子节点的处理也包括插入、移动、更新、删除等操作。 生成差异计算结果在比对过程中记录所有的节点差异情况包括新增节点、删除节点、属性变化、移动节点等。这些差异计算结果通常以一种数据结构如数组、对象等的形式保存。 应用差异计算结果根据差异计算结果执行相应的操作指令将差异应用到实际的DOM上。这可以通过使用DOM操作API实现如createElement()、appendChild()、removeChild()等 常见前端框架中的Diff算法实现 React框架的Reconciliation算法 React框架中的调和Reconciliation算法是用来比较新旧虚拟DOM树之间的差异并将变化应用到实际的DOM上的一种算法。以下是React中调和算法的基本原理 Diff策略React使用了一种称为diffing的算法来比较两棵虚拟DOM树的差异。比较过程从根节点开始逐层向下进行。 唯一标识在比较过程中React要求每个可渲染的元素都需要有唯一的key属性用于辅助React判断哪些元素需要更新或删除。 比较节点类型React首先会比较新旧虚拟DOM树中相同位置的节点的类型如标签名是否相同。如果节点类型不同React会直接销毁旧节点并创建新节点。 比较节点属性对于相同节点类型的节点React会比较它们的属性是否相同。只有属性值不同的属性才会触发更新操作。 递归比较子节点如果节点类型和属性都相同React会递归地比较它们的子节点。React会尽可能复用已存在的节点最小化对实际DOM的操作。 列表渲染当遇到列表渲染时React会使用key属性来辨别列表中的每个元素。如果在新旧虚拟DOM树中某个位置的节点类型发生变化React会销毁旧节点并创建新节点。但是如果两棵树中相同位置的节点类型相同React会尽可能地复用节点只对属性发生变化的节点进行更新。 通过调和算法React能够高效地比较新旧虚拟DOM树之间的差异并最小化实际DOM操作的次数提高性能和效率。需要注意的是React的调和算法是基于启发式的策略并不是一个绝对的最优解所以在特定的场景下可能会存在一些性能瓶颈。 Vue框架的响应式系统及Diff策略 Vue框架的响应式系统和Diff策略是Vue实现数据驱动视图更新的核心机制。下面将对Vue的响应式系统和Diff策略进行一个深入的研究通过三个层面来论述 响应式系统 Object.defineProperty与ProxyVue通过Object.defineProperty或ES6的Proxy来拦截对数据对象的访问和修改实现数据的响应式。这些拦截器能够捕获数据的读取和修改操作并通知相关的依赖进行更新。依赖收集在Vue的响应式系统中有一个依赖收集的过程。在模板中使用的数据属性getter会被收集为依赖当数据发生变化时依赖会被通知进而触发更新。Watcher与DepWatcher是一个观察者它订阅多个依赖当依赖发生变化时Watcher会被通知执行相应的回调函数。而Dep则是一个依赖管理器用于维护依赖与Watcher之间的关系。 Diff策略 虚拟DOM树Vue使用虚拟DOM来表示真实的DOM结构这是一棵轻量级的JavaScript对象树。在每次视图更新时Vue会重新生成一颗新的虚拟DOM树。Diff算法Vue的Diff算法通过比较新旧虚拟DOM树的差异找出需要变更的部分并生成最小的DOM操作。Vue使用了一种高效的双指针的Diff算法以减少比较的复杂度。Diff过程       标记阶段Vue会对新旧虚拟DOM树的节点进行标记标记为静态节点、同一个类型的节点或不同类型的节点。       对比阶段Vue从新旧虚拟DOM树的两端开始使用双指针进行节点比较根据节点类型和Key来判断节点的差异并记录差异。       更新阶段根据Diff过程中记录的差异对实际的DOM进行相应的增、删、改操作。 优化策略 列表渲染优化在列表渲染时Vue会使用每个节点的Key属性来判断节点的稳定性从而尽可能地复用已存在的DOM元素减少DOM操作次数。异步更新为了提高性能Vue对多次数据改变进行批量异步更新将视图更新操作收集起来在下一个事件循环执行统一的DOM操作避免频繁的DOM修改。 优化Diff算法的高级技巧 键值对比和唯一标识符 ⭐⭐⭐键值对比 假设有两个对象表示学生信息其中键是学生的ID值是学生的姓名。通过比较键的值我们可以判断两个对象是否表示同一个学生 const student1 { id: 1, name: Alice }; const student2 { id: 2, name: Bob };// 键值对比较 console.log(student1.id student2.id); // false在Vue的Diff算法中我们可以使用Key属性来判断节点是否相同。例如在Vue的模板中循环渲染学生列表时可以将学生的ID作为Key值 templateulli v-forstudent in students :keystudent.id{{ student.name }}/li/ul /template这样做可以确保当学生列表发生变化时Vue可以通过Key值判断哪些节点是相同的从而只更新需要更改的节点。 ⭐⭐⭐唯一标识符 在前端开发中唯一标识符经常用于定位和操作DOM元素。例如假设我们有一个按钮组件每个按钮都具有唯一的标识符我们可以使用该标识符在点击按钮时执行相应的操作 templatedivbutton v-forbutton in buttons :idbutton.id clickhandleClick(button.id){{ button.label }}/button/div /templatescript export default {data() {return {buttons: [{ id: 1, label: Button 1 },{ id: 2, label: Button 2 },{ id: 3, label: Button 3 }]};},methods: {handleClick(id) {console.log(Button clicked:, id);// 执行相应的操作}} }; /script每个按钮都具有唯一的ID标识符当点击按钮时根据唯一标识符执行相应的操作。 合并操作和批量处理 合并操作和批量处理可以在某些场景下提高效率和性能。 假设我们有一个电商平台需要将多个订单的总金额进行计算并发送给用户。假设订单数据存储在一个数组中每个订单对象包含订单ID和订单金额。 const orders [{ id: 1, amount: 100 },{ id: 2, amount: 200 },{ id: 3, amount: 150 },// 更多订单... ];我们可以使用合并操作和批量处理来优化计算过程。首先我们定义一个变量来存储总金额 let totalAmount 0;然后我们遍历订单数组并将每个订单的金额累加到总金额变量中 orders.forEach(order {totalAmount order.amount; });这种方法是逐个遍历订单逐个累加金额。但如果订单数量非常大这样的处理方式可能会导致性能问题。 为了提高效率我们可以使用合并操作和批量处理。我们首先将订单数组拆分成多个批次每个批次包含一定数量的订单。然后我们可以使用并行处理来同时对每个批次进行金额累加。 const batchSize 100; // 设置每个批次的订单数量 const numBatches Math.ceil(orders.length / batchSize); // 计算需要的批次数// 使用并行处理处理每个批次 for (let i 0; i numBatches; i) {const batch orders.slice(i * batchSize, (i 1) * batchSize);// 使用合并操作对批次中的订单金额进行累加const batchTotal batch.reduce((acc, order) acc order.amount, 0);// 更新总金额totalAmount batchTotal; }通过将订单数组分割成多个批次并使用并行处理对每个批次进行金额累加我们可以同时处理多个订单从而提高计算效率。 上面例子中合并操作和批量处理结合起来帮助我们更高效地处理大量数据。这种方法在数据处理、并行计算等场景下非常实用能够极大地提升程序的性能和响应速度。 异步渲染和增量更新 异步渲染和增量更新是两种提高前端性能和用户体验的技术。 异步渲染 异步渲染指的是将页面渲染过程分解成多个步骤在每个步骤之间插入浏览器空闲时间以便让其他任务优先执行。这样可以防止长时间运行的任务阻塞页面响应。常见的异步渲染技术包括 虚拟DOM使用虚拟DOM可以将视图的更新操作延迟到下一个事件循环中进行从而避免频繁的重绘和回流操作。Web Worker将一些计算密集型的任务放在Web Worker中执行使得主线程可以同时处理用户交互和渲染更新。请求动画帧requestAnimationFrame使用requestAnimationFrame方法来安排页面更新操作以便在下一次浏览器重绘之前执行。 通过异步渲染我们可以提高页面的响应速度减少卡顿和阻塞现象从而改善用户体验。 增量更新 增量更新是一种以增量方式更新页面的技术只对发生变化的部分进行更新而不是重新渲染整个页面。这可以减少不必要的计算和DOM操作提高更新的效率。常见的增量更新技术包括 虚拟DOM Diff算法使用虚拟DOM来比较前后两次渲染结果的差异并只更新发生变化的部分而不是重新渲染整个页面。UI状态管理使用状态管理库如React的Redux、Vue的Vuex等来实现组件级别的状态管理和更新控制按需更新特定组件或子树。懒加载和无限滚动延迟加载页面的内容或仅在需要时加载以避免一次性加载大量数据或资源。 通过增量更新我们可以最小化页面的重绘和回流操作减少不必要的开销提高页面更新的效率和性能。 Diff算法的性能评估和优化方法 我们从从三个角度去优化 角度1内存消耗和时间复杂度分析 内存消耗分析了解算法在不同输入规模下所需的内存消耗情况非常重要。可以使用内存分析工具或者监控内存占用来获取准确的内存使用数据。比较长字符串或大文件时需要特别关注内存消耗是否会超出系统的限制。时间复杂度分析通过对算法执行过程中每个步骤的时间复杂度进行分析可以得出算法的总体时间复杂度。这有助于评估算法的执行效率和性能。一般情况下我们关注最坏情况下的时间复杂度其表示了算法执行所需的最大时间。 角度2虚拟DOM重排和重绘优化 虚拟DOM虚拟DOM是一种与实际DOM树相对应的轻量级对象树用于描述页面的结构。Diff算法通常用于比较两个虚拟DOM树之间的差异以便更新实际的DOM树。为了优化性能可以采取以下策略合并操作将多个DOM更新操作合并为一个批处理操作减少引起重排和重绘的次数。批处理更新通过使用requestAnimationFrame等机制将多个DOM更新操作放入单个渲染帧中以避免多次重排和重绘。避免频繁修改样式频繁修改元素的样式属性会导致浏览器强制进行重排和重绘。可以使用CSS类名的切换或者直接修改样式表来一次性应用样式。 角度3状态持久化和缓存策略 状态持久化对于需要频繁进行Diff操作的场景可以将Diff结果进行持久化。即将Diff的结果保存下来以便后续对相同或相似的输入进行比较时可以直接使用已有的结果。这样可以避免重复计算提高性能。持久化的形式可以是内存中的缓存也可以是存储在数据库或文件系统中。缓存策略缓存是一种常见的性能优化方案。可以根据具体需求选择合适的缓存策略如LRU最近最少使用或LFU最不常用。通过缓存Diff的结果可以避免重复执行完整的Diff操作。当需要比较相似的输入时可以首先检查缓存如果存在相应的结果则直接使用缓存中的比较结果。 参考文献 vue源码解析之diff原理Vue 的 diff 算法解析面试官说说vue的diff算法详解三种 Diff 算法源码图c知道Diff算法DIFF算法原理重学Vue【组件更新和diff算法】【vue】diff 算法详解
http://wiki.neutronadmin.com/news/162729/

相关文章:

  • 北京网站制作方案公司集团门户网站建设策划
  • 升级不了wordpress邵阳整站优化
  • 网站建设上机课前端培训机构去哪个好
  • 网站建设完提示文件取消分享做网站中心
  • seo建站响应式建站工具
  • 网站建设实践考试试题中山专业门户网站制作咨询
  • 济南公司网站建设有网站怎样做推广
  • 网站维护是做什么的上海植物租赁做网站
  • jsp网站开发需要哪些技术上海网站建设服务商
  • 企业建站哪个好萧山建设局网站首页
  • 瑞安网站建设电话南郑县城乡建设局网站
  • 推广网站有效的免费方法网站图片设置教程
  • 做网站代理工作安全吗公司网站建设的现状
  • 用wordpress建立的网站吗wordpress 重置插件
  • 删除wordpress版权信息东莞seo外包
  • 有没有什么专门做兼职的网站云南省网站建设收费调查报告
  • 网站ip访问做图表厦门最早做网站的公司
  • 分布式网站开发手机seo排名软件
  • 济南品牌网站制作方案网络推广方案xiala11
  • 网站百度推广怎么做wordpress 按分类显示图片
  • 门户网站 建设 北京 航天资料管理系统
  • 做旅游网站的建个网站怎放上一张图
  • 交做网站视频百度云网站建设感恩
  • 网站怎么添加滤镜功能吗网站运营改进的点
  • 深圳网络做网站怎么用程序做网站
  • 湘潭网站建设公司23短视频平台
  • 网上书城 网站建设方案wordpress怎么念
  • 建设网站是做什么wordpress自动上传图片
  • 金融直播间网站建设wordpress菜单不显示
  • 上海网站建设免费推免费开店无押金的平台