前端(十一)——Vue vs. React:两大前端框架的深度对比与分析

在这里插入图片描述
😊博主:小猫娃来啦
😊文章核心:Vue vs. React:两大前端框架的深度对比与分析

文章目录

  • 前言
  • 概述
  • 原理与设计思想
  • 算法
  • 生态系统与社区支持
  • API与语法
  • 性能与优化
  • 开发体验与工程化
  • 对比总结
  • 结语

前言

在当今快速发展的前端领域中,Vue和React作为两个备受瞩目的前端框架,已经成为许多开发者的首选。这两个框架凭借其出色的设计和强大的功能,在构建现代化、高效性能的Web应用方面扮演着重要角色。

Vue和React都以其独特的特点吸引了众多开发人员,但它们之间存在哪些区别和共通之处呢?本文将深入剖析Vue和React的原理、生态系统、API与语法、性能与优化以及开发体验与工程化等方面的差异,旨在帮助读者更好地了解这两个框架,为选择合适的技术栈提供参考。

本文适合希望了解Vue和React之间差异的前端工程师、开发者以及对前端技术感兴趣的读者。无论你是初学者还是有一定经验的开发者,我们相信本文将为你提供有价值的信息和深入思考的机会。


概述

Vue和React都是流行的前端框架,用于构建用户界面的JavaScript库。它们都具有一些相似之处,例如采用组件化的开发模式和虚拟DOM技术,但也有一些明显的差异。

Vue是一款由尤雨溪(Evan You)开发的渐进式JavaScript框架。它的核心库只关注视图层,因此易学易用,并且可以与现有的项目进行逐步集成。Vue通过借鉴Angular和React的优点,提供了一种简洁灵活的方式来构建交互式的用户界面。Vue的特点包括:

  • 简单易学:Vue的语法简洁、直观,学习曲线相对较低,使得初学者能够快速上手。

  • 渐进式开发:Vue允许你将其引入已有项目中,逐渐应用于不同的部分,这使得项目迁移和维护更加容易。

  • 组件化开发:Vue鼓励使用组件化开发模式,将UI拆分成可复用的组件,提高代码的可维护性和复用性。

  • 响应式数据绑定:Vue使用双向的数据绑定机制,使得数据的变化能够自动更新到对应的视图上。

React是由Facebook开发并维护的一个用于构建用户界面的JavaScript库。React以组件化开发和虚拟DOM技术为核心,它通过一种声明式的方式,使得构建复杂的应用界面变得更加简单。React的特点包括:

  • 组件化开发:React将UI拆分成独立的组件,每个组件具有自己的状态和生命周期,可以实现高度可复用的代码。

  • 虚拟DOM:React使用虚拟DOM来提高页面渲染的性能。通过将页面的变化先映射到虚拟DOM上,然后进行对比更新,最后才将变化应用到实际的DOM上,减少了昂贵的DOM操作。

  • 强大的生态系统:React拥有强大且活跃的社区支持,有大量的开源组件和工具可供选择,同时也有丰富的插件和解决方案。

  • 单向数据流:React采用了单向数据流的设计模式,使得数据的流向更加清晰可控,减少了bug的产生。

无论选择Vue还是React,都可以根据项目的需求和团队的技术背景来做出决策。Vue注重简单易上手、灵活性强,适合小型、中型和快速迭代的项目。React注重组件化开发、庞大的生态系统和性能优化,适合构建大型应用和复杂的用户界面。


原理与设计思想

Vue和React都有自己独特的原理和设计思想,下面将详细介绍它们的主要原理和设计思想。

Vue的原理与设计思想:

  • 响应式数据驱动:Vue采用了响应式数据驱动的设计思想。在Vue中,你可以将数据与视图进行绑定,当数据发生变化时,视图会自动更新。Vue使用了类似于观察者模式的机制,通过劫持数据的getter和setter,以及依赖追踪的方式,实现了数据的变化检测和视图的更新。

  • 组件化开发:Vue鼓励使用组件化开发的方式来构建用户界面。组件是Vue中最核心的概念,每个组件都拥有自己的模板、逻辑和样式。通过将UI拆分成独立的、可复用的组件,开发者可以更好地组织代码,提高代码的可维护性和复用性。Vue提供了一种声明式的语法来定义组件,使得组件的编写和组合变得更加简单直观。

  • 虚拟DOM:虚拟DOM是Vue的另一个重要原理。在Vue中,每个组件都有对应的虚拟DOM树,当数据发生变化时,Vue会通过对比新旧虚拟DOM树的差异,然后只更新变化的部分到实际的DOM上。这种优化可以减少昂贵的DOM操作,提高页面渲染性能。同时,虚拟DOM也帮助开发者将关注点从手动DOM操作转移到更高层次的逻辑上。

React的原理与设计思想:

  • 虚拟DOM:React同样采用了虚拟DOM的设计思想。React使用JavaScript对象表示虚拟DOM树,通过使用轻量级的JavaScript对象进行操作,避免了频繁的DOM操作。在数据变化时,React会通过对比新旧虚拟DOM树的差异,然后只更新变化的部分到实际的DOM上。

  • 单向数据流:React采用了单向数据流的设计模式。在React中,数据的流动是单向的,从父组件传递给子组件。当数据发生变化时,React会重新渲染受影响的组件,保持UI的一致性。这种单向数据流的设计模式使得数据的变化更加可控,减少了问题的产生。

  • 组件化开发:和Vue类似,React也强调组件化开发。每个组件都是独立的、可复用的,并且具有自己的状态和生命周期。组件之间的通信通过props和回调函数进行。React提供了一种JSX语法,使得组件的声明和使用更加直观。

总结起来,Vue和React都采用了虚拟DOM和组件化开发的设计思想,通过提供响应式的数据绑定、高效的DOM更新和组件化的开发模式,使得构建用户界面变得更加简单、高效和易于维护。这些原理和设计思想的应用,使得Vue和React成为现代前端开发中不可或缺的工具。


算法

vue和React都是现代前端开发中常用的JavaScript框架,它们的主要任务是构建用户界面。在技术层面,Vue和React都使用了虚拟DOM(Virtual DOM)的概念,但它们的实现方式和一些核心概念有所不同。我们可以从以下几个角度来深度剖析Vue和React的算法:

  1. 虚拟DOM(Virtual DOM)算法:

    • React:React使用了一种叫做Diffing的算法来比较新旧两个虚拟DOM树的差异。React会逐层对比两棵DOM树,找出需要更新的节点,然后只更新那些节点。这种算法的时间复杂度为O(n),n为节点数量。

    • Vue:Vue也使用了虚拟DOM,但它采用了一种不同的策略来优化DOM的更新。Vue试图在两个列表之间进行尽可能少的DOM操作。为了实现这个目标,Vue使用了一种叫做“就地复用”的策略。这种策略允许Vue在新旧节点类型相同时,重用旧节点。此外,Vue还引入了静态节点标记,跳过静态节点的对比,这进一步提高了性能。

  2. 响应式系统:

    • React:React采用的是"Pull-based"的方式。当组件的状态改变时,React并不立即计算新的状态,而是将这个组件标记为"dirty"。然后在后续的渲染周期中,React会重新渲染所有标记为"dirty"的组件。这种方式需要开发者手动调用setState来触发状态的更新。

    • Vue:Vue则采用的是"Push-based"的方式。Vue使用了一种叫做依赖追踪的机制,当数据改变时,Vue会立即知道哪些组件依赖于这个数据,然后立即更新这些组件。这种方式使得Vue在处理复杂的状态更新时更加高效。

  3. 组件化:

    • React:React使用的是JavaScript的语法扩展JSX来定义组件,这使得组件的定义和使用更加直观。React的组件化思想鼓励将界面划分为一系列的独立、可复用的组件,这使得代码的组织和复用变得更加容易。

    • Vue:Vue的组件化思想类似,但它使用了一种叫做单文件组件(Single File Component)的方式来定义组件。这种方式将模板、脚本和样式放在一个文件中,使得组件的结构更加清晰。


生态系统与社区支持

  • 插件和组件库:
  1. Vue:Vue拥有丰富的官方和第三方插件和组件库。Vue的官方插件和组件库,如Vue Router、Vuex等,提供了完善的解决方案,可以轻松地集成到Vue项目中。此外,Vue社区也有很多优秀的第三方插件和组件库,如Element
    UI、Vuetify等,可以满足各种需求。这些插件和组件库的质量较高,易于使用且具有良好的文档支持。
  2. React:React同样具备丰富的官方和第三方插件和组件库。官方提供的React Router和Redux等库是React生态系统的重要组成部分,可以帮助开发者轻松解决路由和状态管理问题。此外,React社区也涌现出许多优秀的第三方组件库,如Ant
    Design、Material-UI等。这些库通常具有高质量的代码和文档,可以快速构建漂亮且功能丰富的应用。
  • 社区活跃度:
  1. Vue:Vue社区活跃度相当高,拥有大量的开发者和用户。它的生态系统不断发展,社区成员不断发布新的插件、组件和解决方案。在Vue社区中,你可以获得及时的技术支持,参加线下活动,与其他开发者分享经验,提升技能。此外,Vue的GitHub仓库也有很多贡献者,不断更新和改进Vue的功能。

  2. React:React同样拥有一个活跃的社区,吸引了大批开发者的关注和参与。React社区以其热情、友好和开放的氛围而闻名。社区成员不仅提供了丰富的学习资源和教程,还积极回答问题、讨论新的想法和发布有用的工具。React的GitHub仓库也有大量的贡献者,不断推动React的发展。

  • 学习资源和文档质量:
  1. Vue:Vue的学习资源非常丰富,有很多优秀的教程、视频和书籍可供选择。Vue的官方文档非常详尽全面,并配有丰富的示例代码,可以帮助开发者快速上手。此外,Vue社区中也有很多博客和教程,可以提供实际项目开发经验和最佳实践。

  2. React:React同样具备大量的学习资源,包括官方文档、教程、视频和书籍。React的官方文档详细清晰,提供了全面而易于理解的内容。此外,React社区中有很多知名的博客和教程网站,如React中文网、掘金等,可以帮助开发者深入学习和扩展React的应用。

API与语法

这一块,我们集中从组件定义、状态管理、路由和表单处理几个方面去展开论述:

组件定义:

  • 在Vue中,组件的定义可以使用选项对象和单文件组件(SFC)两种方式。选项对象方式适用于简单的组件定义,可以通过Vue.extend()方法或Vue.component()方法创建全局组件或局部组件。而单文件组件则将模板、样式和逻辑封装在一个.vue文件中,提供更好的代码组织和可维护性。Vue单文件组件的特点是拥有自己的作用域和独立的样式,使得组件之间的关系更清晰,代码更易于复用。

  • React中的组件定义方式是使用JSX语法,将HTML和JavaScript代码组合在一起。通过创建类或函数组件,我们可以使用React.createElement()方法或函数组件方式定义组件。React的组件开发方式更加灵活,可以直接在JavaScript代码中编写组件,并且可以使用纯函数组件或有状态的类组件来创建功能强大的UI组件。

状态管理:

  • Vue和React在状态管理方面有一些不同。Vue内置了Vuex作为官方的状态管理库,提供了集中式的状态管理解决方案。Vuex使用单一状态树来管理整个应用程序的状态,通过mutations和actions来修改和操作状态。它还支持状态的双向绑定,使得组件能够直接从状态树中获取数据,并在数据修改时自动更新视图。

  • React并没有官方的状态管理库,但提供了一种受控组件的机制来管理状态。受控组件是指由React组件的state来控制表单元素的值。通过将表单元素的值保存在组件的state中,并通过事件处理函数更新state,实现对表单的控制和处理。此外,React还鼓励使用第三方库如Redux或Mobx来实现更复杂的状态管理需求。

路由:

  • Vue和React在路由方面也有一些差异。Vue使用Vue Router作为官方的路由管理库,提供了路由的声明式配置和导航守卫等功能。Vue Router可以很容易地实现基于组件的页面切换和参数传递。它还支持命名路由和命名视图,使得路由配置更加灵活和可读性更高。

  • React推荐使用第三方库React Router来实现路由功能。React Router提供了灵活的路由配置和嵌套路由的支持。它可以根据URL的变化加载对应的组件,并支持动态路由和路由参数的传递。React Router还提供了高阶组件(HOC)和钩子函数,可以进行路由守卫和其他复杂的路由控制操作。

表单处理:

  • Vue和React在表单处理方面也有一些不同。在Vue中,可以使用v-model指令来实现表单元素的双向绑定,将表单元素的值与组件的data属性进行关联。Vue还提供了一些修饰符和验证规则,使得表单处理更加方便和灵活。

  • React采用了受控组件的方式来处理表单。通过将表单元素的值保存在组件的state中,并通过事件处理函数更新state,实现对表单的控制。每当表单元素的值发生变化时,都会触发事件处理函数来更新state,从而实现对表单元素的控制和处理。

总结:

  • 在组件定义、状态管理、路由和表单处理等方面,Vue和React都有各自的特点和优势。Vue提供了更多的内置功能和选项来处理这些方面的需求,而React则更加灵活,可以通过第三方库自由选择适合自己项目的解决方案。根据具体项目需求和个人喜好,选择合适的框架和技术是非常重要的。深入学习和理解这些框架的机制和思想,能够更好地应用和扩展它们的功能。

性能与优化

  1. 初始加载性能:

使用Vue时,可以通过异步组件(Async Components)来实现按需加载页面组件。这样,在首次加载页面时,只会加载必要的文件,而非全部组件。例如,考虑一个包含两个子组件的父组件:

Vue.component('ParentComponent', () => import('./ParentComponent.vue'));

当访问页面时,只有当这个组件被渲染时才会加载它。

对于React,可以通过使用懒加载(Lazy Loading)来延迟组件的加载。React提供了React.lazy()函数来实现按需加载。以下是一个使用React懒加载的举证:

const LazyComponent = React.lazy(() => import('./LazyComponent'));function App() {// ...return (<div>{/* ... 其他组件 */}<React.Suspense fallback={<div>Loading...</div>}><LazyComponent /></React.Suspense></div>);
}

<LazyComponent>被渲染时,才会加载该组件。

在以上例子中,Vue和React在初始加载性能方面表现相似,都使用了按需加载的策略。

  1. 更新性能:

假设我们有一个列表页,其中包含很多复杂的子项。

使用Vue时,常见的做法是使用v-for指令来循环渲染列表:

<ul><li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>

当数据更新时,Vue会通过双向绑定进行高效的DOM更新,只更新发生变化的部分。

而在React中,可以使用map函数来实现类似的效果:

function ListItem({ item }) {return <li>{item.name}</li>;
}function List({ items }) {return (<ul>{items.map(item => (<ListItem key={item.id} item={item} />))}</ul>);
}

React通过虚拟DOM (vDOM)和diff算法来减少实际需要更新的DOM节点数量。

以上例子中,Vue和React都通过合适的方式来进行 DOM 更新,以提高性能。

  1. 内存占用:

使用Vue和React时,对于组件的复用性和内存占用之间需要权衡。

假设我们有一个页面,包含多个可展开的面板组件,每个面板下面有大量的内容。在这种情况下,使用Vue的keep-alive组件可以缓存已经加载过的面板,以及它们的状态,从而提高性能。例如:

<template><div><keep-alive><component v-for="panel in panels" :key="panel.id" :is="panel.type"></component></keep-alive></div>
</template>

当面板组件被切换时,旧的面板仍然保持在内存中,而不是销毁和重建。

对于React,可以使用一些技巧来减少内存占用。例如,在某个面板被关闭后,手动销毁它或者将其状态重置为默认值,从而释放相关资源。

在以上例子中,Vue提供了keep-alive组件作为内置的缓存视图的方式,而React需要额外的手动处理来控制内存占用。


开发体验与工程化

  1. 开发工具

    • Vue: Vue有一个官方的Vue CLI,是一个功能齐全的系统,用于快速开发Vue.js项目。它包括linting、unit testing、e2e测试等等,它还支持构建为library和web component。还有一个UI工具让你在浏览器中打开和管理你的项目。
    • React: React使用Create React App来创建新的React项目,这个工具包含了你开始构建现代单页面React应用所需的一切。它就像Vue CLI一样,但没有图形化界面。
  2. 调试工具

    • Vue: Vue Devtools是Vue的官方浏览器调试插件,非常强大,可以让你在Chrome和Firefox中对Vue应用进行调试。
    • React: React也有其对应的React DevTools,为用户提供了一种方法,可以在页面运行时查看React组件树,并检查他们的props和state。
  3. 热重载

    • Vue: Vue CLI内置了热重载功能,当你更改组件代码时,它将自动更新,而不会刷新整个页面。
    • React: 通过模块替换(HMR)插件,React也支持热重载,但这通常需要额外的配置才能使其工作。
  4. 构建工具

    • Vue: Vue CLI使用的是webpack作为默认的打包工具,同时提供了一套灵活的、可插拔的插件系统。
    • React: create-react-app也默认使用webpack,但如果你需要自定义配置,你可能需要eject,这将使所有配置文件暴露出来,这也意味着你不能再使用create-react-app提供的便利的更新特性。
  5. 自动化测试

    • Vue: Vue CLI集成了Jest和Mocha等单元测试框架,同时也支持Cypress和Nightwatch等端到端的测试框架。
    • React: Create React App也集成了Jest,并可以轻松接入各种断言库和测试工具。

对比总结

⭐⭐相似点:

  1. 都支持构建用户界面的组件化方案。最底层的组件为用户界面的基本元素,可以不断复用和组合,形成更强大的功能。
  2. 都通过虚拟DOM来避免直接操作DOM带来的性能问题。当组件状态发生变化时,它们都会先用新的状态渲染虚拟DOM,然后通过算法找出需要改变的DOM节点,最后再把这部分节点绘制到真正的DOM上。
  3. 都有响应式和组件化的视图,允许开发者以声明方式定义界面,并与应用的状态同步。
  4. 都有成熟稳定的社区支持和丰富的插件。

⭐⭐不同点:

  1. 学习曲线:Vue的API设计和文档更为简洁和友好,适合初学者或想要快速上手的团队。而React的灵活性更高,有更多的编程概念和模式可供开发者去探索和应用,因此其学习曲线相对较陡峭一些。
  2. 设计思想:React更倾向于函数式编程,使用JSX进行模板编写,通过render函数返回描述组件输出的JSX代码。Vue则提供了更加声明式的编程方式,允许直接在template中写HTML,并通过特殊的语法使用JavaScript。
  3. 状态管理:React常常与Redux或MobX等全局状态管理库一起使用,而Vue有自己的状态管理库Vuex。
  4. 社区大小:目前来看,React的社区相较于Vue来说更加成熟和活跃,有更多的开源项目和教程。

如何选择:

选择Vue或React,需要根据项目需求和团队技术实力来定:

  1. 如果是小型项目或快速原型开发,或者团队对前端开发经验不是很丰富,Vue可能会是更好的选择,因为它更易学习,更易上手,且有很好的文档和社区支持。
  2. 如果是大型项目,需要高度的自定义和灵活性,React可能更有优势。也可以考虑项目的发展前景,比如如果要做移动端开发,React Native让你用相近的语法做原生应用,这会是React的一大优势。
  3. 在使用Vue和React中,要考虑目标浏览器的兼容性。即使这两个库都对IE11有所支持,Vue 2支持IE9,但是Vue 3不再支持IE。而React对IE的兼容性更好。

最后,尽管Vue和React有许多不同,但它们的目标是一样的:帮助开发者更高效地开发用户界面。选择哪一个,往往取决于开发团队的熟悉程度和喜好。


结语

在我们深入探讨Vue和React的区别之后,我们可以得出一个结论,那就是没有绝对的优劣之分,只有适合和不适合。Vue和React都是非常优秀的前端框架,它们各自具有独特的特点和优势。React以其强大的生态系统和灵活的编程范式赢得了许多开发者的青睐,而Vue则以其简洁的语法和易于上手的特性吸引了大批初学者和小型项目开发者。

然而,选择哪一个框架并不是一个硬性的规定,而是取决于项目的需求、团队的技术栈以及开发者的个人喜好。对于大型、复杂的项目,React的生态系统和成熟的社区可能会是一个更好的选择。而对于需要快速开发和原型设计的小型项目,Vue的简洁和易用性可能会更胜一筹。

最终,我们的目标不应该是寻找一个“最好”的框架,而是找到一个最适合我们的工具。因为在这个日新月异的技术世界里,唯一不变的就是变化本身。我们需要不断学习和适应,以便在未来的挑战中保持竞争力。

所以,无论你选择Vue还是React,重要的是理解其背后的设计理念和编程范式,这样你就可以根据项目的实际需求和自己的技术能力,做出最合适的选择。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/22921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件设计原则

文章目录 一、软件设计原则1. 开闭原则2. 里氏代换原则3. 依赖倒转原则4. 接口隔离原则5. 迪米特法则6. 合成复用原则 一、软件设计原则 在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要尽量根据软件…

django使用mysql数据库

Django开 发操作数据库比使用pymysql操作更简单&#xff0c;内部提供了ORM框架。 下面是pymysql 和orm操作数据库的示意图&#xff0c;pymysql就是mysql的驱动&#xff0c;代码直接操作pymysql ,需要自己写增删改查的语句 django 就是也可以使用pymysql、mysqlclient作为驱动&a…

迁移学习:使用Restnet预训练模型构建高效的水果识别模型

目录 引言 1 迁移学习 1.1 什么是迁移学习 1.2 迁移学习能解决什么问题 1.3 迁移学习面临的三个问题 1.3.1 何时迁移 1.3.2 何处迁移 1.3.3 如何迁移 1.4 迁移学习的分类 1.4.1 按照学习方式的划分 1.4.2 按照使用方法的划分 2 Restnet网络 2.1 Restnet介绍 2.2 Re…

element-ui树形表格,左边勾选,右边显示选中的数据-功能(如动图)

功能如图 功能需求 表格树形表格勾选数据&#xff0c;右边显示对应勾选的数据内容&#xff0c;选中客户&#xff0c;自动勾选所有的店铺(子级)&#xff0c;选中其中一个店铺&#xff0c;自动勾选上客户(父级)&#xff0c;同时会存在只有客户&#xff08;下面没有子级的情况&am…

Apache Flink概述

Flink 是构建在数据流之上的一款有状态的流计算框架&#xff0c;通常被人们称为第三代大数据分析方案 第一代大数据处理方案&#xff1a;基于Hadoop的MapReduce 静态批处理 | Storm 实时流计算 &#xff0c;两套独立的计算引擎&#xff0c;难度大&#xff08;2014年9月&#x…

Java版工程行业管理系统源码-专业的工程管理软件-em提供一站式服务 em

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目…

STM32存储左右互搏 I2C总线读写EEPROM ZD24C1MA

STM32存储左右互搏 I2C总线读写EEPROM ZD24C1MA 在较低容量存储领域&#xff0c;EEPROM是常用的存储介质&#xff0c;不同容量的EEPROM的地址对应位数不同&#xff0c;在发送字节的格式上有所区别。EEPROM是非快速访问存储&#xff0c;因为EEPROM按页进行组织&#xff0c;在连…

caj文件怎么转换成pdf?了解一下这种方法

caj文件怎么转换成pdf&#xff1f;如果你曾经遇到过需要将CAJ文件转换成PDF格式的情况&#xff0c;那么你一定知道这是一件麻烦的事情。幸运的是&#xff0c;现在有许多软件和工具可以帮助你完成这项任务。下面就给大家介绍一款使用工具。 【迅捷PDF转换器】是一款功能强大的工…

启动RocketMQ报错

说明&#xff1a;启动RocketMQ消费者时&#xff0c;报以下错误&#xff1a;java.lang.IllegalStateException&#xff1a;Failed to start RocketMQ push consumer. 解决&#xff1a;看下所有的监听器类&#xff0c;检查是不是有相同的消费者组名&#xff0c;注释掉其中一个即可…

BI技巧丨利用OFFSET计算同环比

微软最近更新了很多开窗函数&#xff0c;其内部参数对比以往的DAX函数来说&#xff0c;多了很多&#xff0c;这就导致学习的时间成本直线上升。 而且对于新增函数的应用场景&#xff0c;很多小伙伴也是一知半解的&#xff0c;本期我们就来聊一聊关于最近新增的开窗函数——OFF…

Docker网络模型使用详解(2)Docker网络模式

安装Docker时会自动创建3个网络&#xff0c;可以使用docker network ls命令列出这些网络。 [rootlocalhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE ebcfad6f4255 bridge bridge local b881c67f8813 compose_lnmp_lnmp…

介绍Sping Boot的5个扩展点

1、初始化器ApplicationContextInitializer 我们在启动Spring Boot项目的时候&#xff0c;是执行这样一个方法来启动的 我们一层一层往下点&#xff0c;最终发现执行的是这个方法 所以我们在启动项目的时候也可以这样启动 new SpringApplication(SpringbootExtensionPointAp…

无脑入门pytorch系列(二)—— torch.mean

本系列教程适用于没有任何pytorch的同学&#xff08;简单的python语法还是要的&#xff09;&#xff0c;从代码的表层出发挖掘代码的深层含义&#xff0c;理解具体的意思和内涵。pytorch的很多函数看着非常简单&#xff0c;但是其中包含了很多内容&#xff0c;不了解其中的意思…

Kindling the Darkness: A Practical Low-light Image Enhancer论文阅读笔记

这是ACMMM2019的一篇有监督暗图增强的论文&#xff0c;KinD其网络结构如下图所示&#xff1a; 首先是一个分解网络分解出R和L分量&#xff0c;然后有Restoration-Net和Adjustment-Net分别去对R分量和L分量进一步处理&#xff0c;最终将处理好的R分量和L分量融合回去。这倒是很常…

linux-MySQL的数据目录

总结&#xff1a; window中的my.ini linux 中 /etc/my.cnfwindow中的D:\soft\mysql-5.7.35-winx64\data linux 中 /var/lib/mysql 1.查找与mysql有关的目录 find / -name mysql [rootVM-4-6-centos etc]# find / -name mysql /opt/mysql /etc/selinux/targeted/tmp/modul…

Mybatis引出的一系列问题-JDBC 的探究

1 引入对JDBC的理解-1 一般来说&#xff0c;Java应用程序访问数据库的过程是&#xff1a; 装载数据库驱动程序&#xff1b;通过jdbc建立数据库连接&#xff1b;访问数据库&#xff0c;执行sql语句&#xff1b;断开数据库连接。 Public void FindAllUsers(){//1、装载sqlserve…

Paleobotany——北美中生代-新生代化石植物总目(Paleobotanical card search)

北美中生代-新生代化石植物总目&#xff08;Paleobotanical card search&#xff09; 总览1. 介绍2. 历史3. 内容 用户手册&#xff08;卡片内容解读&#xff09;示例卡片组成CIC编号的详细解读年代编码解读 卡片检索 总览 了解学习使用由耶鲁皮博迪自然历史博物馆&#xff08…

【贪心算法】leetcode刷题

贪心算法无固定套路。 核心思想&#xff1a;先找局部最优&#xff0c;再扩展到全局最优。 455.分发饼干 两种思路&#xff1a; 1、从大到小。局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最优就是喂饱尽可能多的小孩。先遍历的胃口&a…

[containerd] ContentPlugin插件源码分析

文章目录 1. 概述2. 环境3. 注册4. 核心概念4.1. blob4.2. ingest 5. 抽象接口5.1. Manager接口5.2. Provider5.3. IngestManager5.4. Ingester 6. 核心实现6.1. Info6.2. Update6.3. Walk6.4. Delete6.5. ReaderAt6.6. Status6.7. ListStatuses6.8. Abort6.9. Writer 7. 总结 …

MySQL进阶--存储引擎

目录 一、简介二、什么是存储引擎&#xff1f;三、MySQL中常用的存储引擎1.InnoDB2.MyISAM3.Memory4.三种存储引擎对比 四、存储引擎的选择PS: 一、简介 本文的内容讲的是MySQL中的存储引擎的相关知识&#xff0c;初步认识MySQL中的存储引擎及各引擎的特点~ 二、什么是存储引…