【JavaScript脚本宇宙】终极对决:六大虚拟DOM库横评

深度剖析:六大虚拟DOM库的奥秘与应用场景

前言

虚拟DOM(Document Object Model)是用于表示和操作HTML文档的抽象数据结构。虚拟DOM库是构建用户界面的重要工具,它们提供了高效的更新机制、组件化开发等功能,使开发者能够轻松地开发高性能、可维护的Web应用程序。本文将介绍几个流行的虚拟DOM库,包括Snabbdom、Inferno、React、Preact、Vue和Mithril,并对它们的功能、特点、优势和基本用法进行比较。

欢迎订阅专栏:JavaScript脚本宇宙

文章目录

  • 深度剖析:六大虚拟DOM库的奥秘与应用场景
    • 前言
    • 1. Snabbdom:一个快速的虚拟DOM库
      • 1.1. Snabbdom简介
      • 1.2. Snabbdom的主要特点
        • 1.2.1. 高效的diff算法
        • 1.2.2. 可扩展性
        • 1.2.3. 模块化设计
      • 1.3. 使用Snabbdom的优势
      • 1.4. Snabbdom的应用场景
      • 1.5. Snabbdom的基本用法
    • 2. Inferno:一个高性能的虚拟DOM库
      • 2.1. Inferno简介
      • 2.2. Inferno的主要特点
        • 2.2.1. 极高的渲染速度
        • 2.2.2. 轻量级
        • 2.2.3. 与React兼容
      • 2.3. 使用Inferno的优势
      • 2.4. Inferno的应用场景
      • 2.5. Inferno的基本用法
    • 3. React:最流行的虚拟DOM库
      • 3.1. React简介
      • 3.2. React的主要特点
        • 3.2.1. 声明式编程
        • 3.2.2. 组件化架构
        • 3.2.3. 强大的社区支持
      • 3.3. 使用React的优势
    • 3.4. React的基本用法
    • 4. Preact:一个小巧的虚拟DOM库
      • 4.1. Preact简介
      • 4.2. Preact的主要特点
        • 4.2.1. 体积小
        • 4.2.2. 与React兼容
        • 4.2.3. 快速渲染
      • 4.3. 使用Preact的优势
      • 4.4. Preact的应用场景
      • 4.5. Preact的基本用法
    • 5. Vue:一个渐进式的框架(含虚拟DOM)
      • 5.1 Vue简介
      • 5.2 Vue的主要特点
        • 5.2.1 渐进式架构
        • 5.2.2 简洁易用
        • 5.2.3 强大的生态系统
      • 5.3 使用Vue的优势
      • 5.4 Vue的应用场景
      • 5.5. Vue的基本用法
    • 6. Mithril:一个现代化的JavaScript框架(含虚拟DOM)
      • 6.1. Mithril简介
      • 6.2. Mithril的主要特点
        • 6.2.1. 轻量级
        • 6.2.2. 快速
        • 6.2.3. 易于学习和使用
      • 6.3. 使用Mithril的优势
      • 6.4. Mithril的应用场景
      • 6.5. Mithril的基本用法
    • 总结

1. Snabbdom:一个快速的虚拟DOM库

Snabbdom是一个快速、模块化且可扩展的虚拟DOM库,用于构建高性能、可复用的用户界面组件。它采用高效的diff算法和模块化设计,使得在更新DOM时能够快速找到最小的差异并进行更新,从而提高应用程序的性能。

1.1. Snabbdom简介

Snabbdom是由Felix Raschkoff创建的一个虚拟DOM库,旨在提供一种快速、高效的方式来更新DOM。它采用了类似于React和Vue等框架的组件化思想,将用户界面分解为独立、可复用的组件,并通过虚拟DOM来管理和更新这些组件。Snabbdom的目标是提供一种轻量级的解决方案,使开发人员能够构建高性能的web应用程序。

1.2. Snabbdom的主要特点

1.2.1. 高效的diff算法

Snabbdom采用了一种基于树遍历的算法来实现高效的diff操作。该算法首先比较两个虚拟DOM树的结构,找出同级节点之间的差异;然后对相同节点进行属性和文本内容的比较。通过这种方式,Snabbdom可以快速找到最小的差异并进行更新,从而提高应用程序的性能。

1.2.2. 可扩展性

Snabbdom的设计考虑了可扩展性的问题。它提供了一组模块化的“属性模块”,用于处理不同类型的DOM属性(如样式、类、事件等)。开发人员可以根据自己的需求选择和配置这些模块,以实现自定义的功能。此外,Snabbdom还允许开发人员创建自己的模块,以便更好地满足特定的需求。

1.2.3. 模块化设计

Snabbdom采用了一种模块化的设计,将核心功能与具体的实现分离开来。这使得Snabbdom的核心代码较小且易于理解和修改。同时,模块化的设计也使得Snabbdom更容易与其他库或框架进行集成。

1.3. 使用Snabbdom的优势

  • 高性能:由于采用了高效的diff算法和优化的更新策略,Snabbdom能够快速地更新DOM并保持应用程序的性能。
  • 可扩展性:模块化的架构使得Snabbdom易于扩展和定制,以满足不同的需求。
  • 模块化设计:模块化的设计使得Snabbdom的核心代码较小且易于理解和修改。
  • 轻量级:相对于其他虚拟DOM库而言,Snabbdom的体积较小,对于需要快速加载和运行的应用程序具有优势。

1.4. Snabbdom的应用场景

Snabbdom适用于各种类型的Web应用程序,包括但不限于:

  • 单页应用(SPA):在构建复杂的单页应用时,Snabbdom可以帮助管理视图层和DOM之间的交互,提供高效而可靠的更新机制。
  • 服务器渲染(SSR):由于其模块化的设计和高性能的特点,Snabbdom可以用于服务器端渲染的应用场景中,提升用户体验和搜索引擎优化效果。
  • 组件化开发:Snabbdom鼓励组件化的开发方式,可以将复杂的用户界面拆分为独立、可复用的组件,提高代码的维护性和可读性。
  • 性能要求高的应用:对于需要高性能的应用程序(如实时协作工具、图形编辑器等),Snabbdom能够提供快速响应和流畅的动画效果。

1.5. Snabbdom的基本用法

下面是一个简单的示例,展示了如何使用Snabbdom进行DOM操作和更新:

const { h, init } = snabbdom; // 引入snabbdom库
const root = document.getElementById('root'); // 获取根节点元素
const patch = init(); // 初始化patch函数// 定义虚拟DOM树
const vtree = h('div', {}, [h('h1', { style: { color: 'red' } }, 'Hello World!')
]);
// 将虚拟DOM树渲染到真实DOM树上
patch(root, vtree);

2. Inferno:一个高性能的虚拟DOM库

2.1. Inferno简介

Inferno是一个高性能的虚拟DOM库,用于构建用户界面。它基于React的设计思想,但使用了一些优化技术来提高渲染速度。Inferno可以与其他UI库或框架配合使用,也可以独立使用。

2.2. Inferno的主要特点

2.2.1. 极高的渲染速度

Inferno采用了一些优化技术,如路径压缩算法和同化组件,使得它的渲染速度比其他虚拟DOM库更快。这意味着Inferno在大规模应用中可以提供更好的性能。

2.2.2. 轻量级

Inferno的代码库相对较小,只有几KB的大小,这使得它非常适合在移动设备上使用。同时,Inferno也非常注重代码的质量和效率,使得它可以在各种设备上提供快速的性能。

2.2.3. 与React兼容

Inferno的设计思路和API接口与React非常相似,因此对于熟悉React的人来说,使用Inferno会非常容易上手。同时,Inferno也支持许多React的高级特性,如JSX、组件等。

2.3. 使用Inferno的优势

  • 高性能:Inferno采用了一些优化技术,使得它的渲染速度比其他虚拟DOM库更快。
  • 轻量级:Inferno的代码库相对较小,非常适合在移动设备上使用。
  • 与React兼容:Inferno的设计思路和API接口与React非常相似,因此对于熟悉React的人来说,使用Inferno会非常容易上手。
  • 可扩展性:Inferno是一个高度可扩展的库,可以根据具体需求进行定制和扩展。

2.4. Inferno的应用场景

Inferno适用于各种类型的Web应用程序,包括单页应用、服务器端渲染应用等。它可以用于构建复杂的企业级应用程序、移动应用程序、电子商务应用等。同时,Inferno也适用于各种设备,包括桌面电脑、平板电脑和手机。

2.5. Inferno的基本用法

下面是一个简单的示例,演示如何使用Inferno创建一个组件:

import { render, h } from 'inferno';function Hello({ name }) {return (<div><h1>Hello, {name}!</h1></div>);
}render(<Hello name="World" />, document.getElementById('root'));

3. React:最流行的虚拟DOM库

3.1. React简介

React是由Facebook开发的一个用于构建用户界面的JavaScript库。它于2013年首次发布,并迅速成为前端开发领域最受欢迎的框架之一。React采用了组件化的设计思想,使得代码更易维护、可复用性更高,并且能更好地管理复杂的应用程序状态。

3.2. React的主要特点

3.2.1. 声明式编程

React使用声明式编程,允许开发人员描述他们想要构建的UI,而不是手动操作DOM。这使得代码更易于阅读和理解,同时也更容易调试和修改。以下是一个简单的示例:

function greeting(props) {return <h1>Hello, {props.name}</h1>;
}
const name = "Alice";
ReactDOM.render(<greeting name={name} />, document.getElementById('root'));

在这个例子中,我们定义了一个名为greeting的函数,该函数接受一个props对象作为参数,并返回一个包含问候语的HTML标题标签。然后,我们使用ReactDOM.render方法将这个组件渲染到页面上。

3.2.2. 组件化架构

React采用了组件化的设计思想,即将UI拆分为独立的、可复用的组件。每个组件都有自己的状态和行为,并通过组合这些组件来构建复杂的用户界面。这种组件化的架构使得代码更易维护、可复用性更高,并且能更好地管理复杂的应用程序状态。以下是一个简单的示例:

import React, { useState } from 'react';function Counter() {const [count, setCount] = useState(0);return (<div><p>You have clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

在这个例子中,我们定义了一个名为Counter的组件,它包含了一个表示点击次数的状态变量count和一个用于增加点击次数的按钮。当用户点击按钮时,setCount函数被调用,并将点击次数加1。

3.2.3. 强大的社区支持

React拥有庞大的开发者社区和丰富的第三方库和工具生态系统。这意味着你可以轻松地找到解决方案、教程和资源来帮助你构建复杂的应用程序。此外,Facebook还提供了许多官方文档和示例代码来帮助初学者入门。

3.3. 使用React的优势

使用React有几个主要的优势:

  • 可复用性:React的组件化架构使得代码更易维护、可复用性更高。你可以将复杂的UI分解为小的、独立的组件,并轻松地在不同的应用程序中重用它们。
  • 声明式编程:React使用声明式编程,允许开发人员描述他们想要构建的UI,而不是手动操作DOM。这使得代码更易于阅读和理解,同时也更容易调试和修改。

3.4. React的基本用法

下面是一个简单的React示例代码,展示了如何创建一个名为HelloWorld的组件,并向其中传递一个名为name的属性值:

import React from 'react';class HelloWorld extends React.Component {render() {return (<div><h1>Hello, {this.props.name}!</h1><p>This is a simple React component.</p></div>);}
}

在这个例子中,我们首先导入了React库。然后定义了一个名为HelloWorld的类组件,它继承了React的Component类。在组件的render方法中,我们返回了一个包含标题和段落的div元素。其中,标题的内容为"Hello, " + this.props.name + “!”

4. Preact:一个小巧的虚拟DOM库

Preact是一个轻巧、快速的虚拟DOM库,它在保持与React兼容的同时,具有更高的性能和更小的体积。它适用于构建用户界面和单页应用程序。

4.1. Preact简介

Preact是由Jason Miller创建的一个小型JavaScript库,最初于2015年发布。它的目标是提供一种类似于React的开发体验,但具有更高的性能和更小的体积。Preact使用虚拟DOM来提高渲染效率,并提供了许多与React相似的功能,如组件、状态和生命周期方法。

4.2. Preact的主要特点

4.2.1. 体积小

Preact的体积非常小,只有3kb左右(压缩后)。相比之下,React的体积约为36kb。这使得Preact在移动设备上加载更快,并且对于网络连接较慢的地区来说是一个更好的选择。

4.2.2. 与React兼容

由于Preact的设计目标是与React兼容,因此你可以将现有的React代码库轻松迁移到Preact上。这对于那些想要尝试新技术而又不想重写现有代码的人来说是一个巨大的优势。

4.2.3. 快速渲染

Preact使用了一种称为快速渲染的技术,它在初始渲染阶段只更新那些发生了变化的部分,而不是整个组件树。这使得Preact在大型应用程序中能够显著提高性能。

4.3. 使用Preact的优势

  • 体积小:Preact的体积只有3kb左右,非常适合移动设备和网络连接较慢的情况。
  • 与React兼容:如果你已经熟悉了React的开发方式,那么你可以轻松地迁移到Preact上。
  • 快速渲染:Preact的快速渲染技术可以显著提高性能,尤其是在大型应用程序中。
  • 易于学习:由于Preact与React兼容,因此学习曲线相对较低。对于已经熟悉React的人来说,上手Preact会非常容易。

4.4. Preact的应用场景

Preact适用于各种类型的应用程序,包括但不限于:

  • 单页应用程序(SPA)
  • 服务器端渲染(SSR)应用程序
  • 移动应用程序(通过React Native或类似的框架进行开发)
  • 渐进式增强(Progressive Enhancement)应用程序

无论你是构建个人博客、电子商务网站还是复杂的企业应用程序,Preact都可以帮助你实现高性能、可扩展的用户界面。

4.5. Preact的基本用法

要开始使用Preact,请确保你已经安装了Node.js和npm。然后,你可以使用以下命令安装Preact:

npm install --save preact preact-compat

下面是一个简单的示例,展示了如何使用Preact创建一个简单的组件:

// my-component.jsx
import { h, render } from 'preact';// 定义一个名为 MyComponent 的组件
function MyComponent() {return (<div><h1>Hello, World!</h1></div>);
}// 将组件渲染到页面上
render(<MyComponent />, document.body);

5. Vue:一个渐进式的框架(含虚拟DOM)

Vue.js是一个用于构建Web界面的渐进式框架。它的核心功能包括响应式组件、虚拟DOM和指令等,旨在简化用户界面的开发。Vue的设计理念是自底向上,即你可以根据项目的需要逐步采用其功能。这使Vue适用于从小型原型到大型Web应用程序等各种规模的项目。

5.1 Vue简介

Vue.js(通常简称为Vue)是由Evan You创建的一个JavaScript库,于2014年首次发布。Vue结合了其他流行框架(如React和Angular)的最佳特性,并且具有自己的独特功能。Vue的目标是通过提供一种易于学习和使用的直观方法来开发现代Web界面,该方法旨在提高生产力并使开发人员能够快速高效地工作。

5.2 Vue的主要特点

5.2.1 渐进式架构

与其他一些JavaScript框架不同,Vue被设计为一种自底向上的方法,这意味着你可以根据项目的规模和复杂性逐渐采用其功能。这使得Vue成为小型项目和大型项目的理想选择,因为它可以根据需要轻松扩展或缩减。

5.2.2 简洁易用

Vue的语法是简单易用的,它的模板语法类似于常规HTML,使得大多数开发人员能够迅速上手并开始编写代码。此外,Vue还提供了强大的工具和指令,使得开发人员可以轻松地构建复杂的用户界面。

5.2.3 强大的生态系统

Vue拥有一个庞大且充满活力的生态系统,其中包括大量的第三方库、插件、组件和资源,可帮助开发人员更高效地进行开发。该生态系统不仅得到了官方支持,还有来自全球各地数以百计的贡献者的支持,这确保了Vue将继续发展壮大,并满足不断变化的Web开发需求。

5.3 使用Vue的优势

  • 高性能:Vue使用了虚拟DOM技术来优化性能,这使得它可以快速更新UI,而无需频繁操作DOM。
  • 可维护性:Vue的组件化架构使得代码易于维护和重用。
  • 可测试性:Vue的组件化架构也使得代码易于测试。
  • 可扩展性:Vue的渐进式架构使得它非常适合从小项目到大项目的扩展。
  • 生态系统丰富:Vue有许多可用的库、插件和工具,可以帮助我们更好地进行开发。

5.4 Vue的应用场景

  • 单页应用程序(SPA):由于Vue的性能和可维护性,它非常适合构建大型SPA。
  • 小型应用程序:由于Vue的渐进式特性,它也非常适合构建小型应用程序。
  • 复杂的数据交互:由于Vue的数据绑定和组件化特性,它非常适合处理复杂的数据交互场景。
  • 构建移动应用程序:可以使用Vue的Cordova插件或Quasar等第三方库来构建移动应用程序。

5.5. Vue的基本用法

安装Vue可以使用CDN链接或者npm安装:

<!-- CDN链接 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><!-- NPM安装 -->
<script src="node_modules/vue/dist/vue.js"></script>

接下来我们使用一个计数器的例子来看一下最基本的Vue用法:

<div id="app"><p>{{ message }}</p><button v-on:click="count++">Click me</button>
</div><script>var app = new Vue({el: '#app',data: {message: 'Hello Vue!',count: 0}})
</script>

6. Mithril:一个现代化的JavaScript框架(含虚拟DOM)

6.1. Mithril简介

Mithril是一个现代化的JavaScript框架,它采用了组件化的设计思想和虚拟DOM技术。它具有轻量级、快速和易于学习和使用等特点,非常适合构建高性能的Web应用程序。Mithril的官方文档提供了丰富的示例和详细的API文档,可以帮助开发人员快速上手。

注:Mithril的官方网站为mithril.js.org

6.2. Mithril的主要特点

6.2.1. 轻量级

Mithril的体积非常小,只有几KB的大小,这使得它非常适合在移动设备上使用,可以有效减少应用程序的加载时间和内存占用。

6.2.2. 快速

Mithril采用了虚拟DOM技术和增量更新算法,使得它可以非常快速地更新界面。在复杂的数据绑定场景中,Mithril的性能也非常出色。

6.2.3. 易于学习和使用

Mithril的API设计非常简洁,易于理解和使用。它的模板语法也非常灵活,支持多种写法,可以满足不同开发人员的需求。

6.3. 使用Mithril的优势

  • 性能高:Mithril采用了虚拟DOM技术和增量更新算法,使得它可以非常快速地更新界面。在复杂的数据绑定场景中,Mithril的性能也非常出色。
  • 可维护性好:Mithril的组件化设计思想可以帮助开发人员更好地组织和管理代码。同时,Mithril的模板语法也非常灵活,可以满足不同开发人员的需求。
  • 易于集成:Mithril可以与各种前端库和框架无缝集成,如React、Vue等。同时,Mithril也支持服务器端渲染,可以方便地构建同构应用程序。
  • 体积小:Mithril的体积非常小,只有几KB的大小,这使得它非常适合在移动设备上使用,可以有效减少应用程序的加载时间和内存占用。

6.4. Mithril的应用场景

Mithril适用于构建各种类型的Web应用程序,包括单页应用、移动应用、桌面应用等。特别适合以下场景:

  • 需要高性能的数据绑定和界面更新的场景。
  • 需要灵活的数据模型和组件化的场景。
  • 需要支持服务器端渲染的场景。

6.5. Mithril的基本用法

首先,我们需要在页面中引入Mithril的库文件:

<script src="https://unpkg.com/mithril/build/mithril.min.js"></script>

接下来,我们可以开始编写Mithril应用程序了。下面是一个简单的示例:

// 定义组件
var MyComponent = {view: function() {return m("div", "Hello, world!")}
}
// 将组件渲染到页面上
m.mount(document.body, MyComponent);

在上面的示例中,我们定义了一个名为MyComponent的组件,并在view方法中返回了一个div元素和一些文本。然后,我们使用m.mount函数将这个组件渲染到页面上

总结

本文对几个流行的虚拟DOM库进行了比较,包括Snabbdom、Inferno、React、Preact、Vue和Mithril。这些库都提供了高效的更新机制、组件化开发等功能,使开发者能够轻松地开发高性能、可维护的Web应用程序。每个库都有自己独特的特点和优势,如Snabbdom的高效diff算法、Inferno的高性能渲染速度、React的声明式编程等。同时,每个库也都有一定的应用场景和基本用法,读者可以根据具体需求选择合适的虚拟DOM库进行开发。

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

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

相关文章

wpfui:一个开源免费具有现代化设计趋势的WPF控件库

wpfui介绍 wpfui是一款开源免费&#xff08;MIT协议&#xff09;具有现代化设计趋势的WPF界面库。wpfui为wpf的界面开发提供了流畅的体验&#xff0c;提供了一个简单的方法&#xff0c;让使用WPF编写的应用程序跟上现代设计趋势。截止写这篇文章&#xff0c;该项目获得了6.7k …

YYU-5/80-260mm型钢筋残余变形测试仪 电子引伸计

YYU-5/80-260mm型钢筋接头专用引伸计&#xff0c;是按照《JGJ 107 2010 钢筋技术连接技术规程》的技术要求设计的&#xff0c;专门用于测试钢筋接头残余变形的双向平均引伸计&#xff0c;其标距可以根据钢筋直径要求进行调整。 完全符合《JGJ 107 2010 钢筋技术连接技术规程》…

信创适配评测

概叙 信创科普参考&#xff1a;全面国产化之路-信创-CSDN博客 有必要再解释一下两个名词“28N”&#xff0c;“79号文件”&#xff0c;因为“28N”指定了由政府牵头从各领域开启国产化的基调&#xff0c;而“79号文件”则指定了国产化的截止日期2027年。 信创的本质是实现中国信…

EOS black灵魂回响黑色无法联机/联机报错/联机失败怎么办

灵魂回响黑色EOS black中的职业系统&#xff0c;自由度非常高。从人物属性的精细调整&#xff0c;到装备属性的独特搭配&#xff0c;再到技能的个性化组合&#xff0c;每一步都充满了无限可能。更为惊喜的是&#xff0c;游戏中的角色职业不是一成不变的&#xff0c;而是随着手中…

从0开发一个Chrome插件:调试与优化

前言 这是《从0开发一个Chrome插件》系列的第二十篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必…

webcomponents学习

一、新建index.html文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title>…

Springboot3.3 整合Cassandra 4.1.5

一、数据库搭建 -- 创建Keyspace CREATE KEYSPACE school WITH replication {class:SimpleStrategy, replication_factor : 1};-- 创建表 CREATE TABLE student(id int PRIMARY KEY, name text, age int, genders int, address text ,interest set<text>,phone lis…

【C++】关于代码编译自动更新版本的问题

在写代码的时候&#xff0c;总是需要添加一个版本号&#xff0c;用于后续的版本管理 我常遇到的一个问题是&#xff0c;开发过程中&#xff0c;不一定会记得这件事情&#xff0c;导致有时候会出现同样的版本 于是希望有一个方式&#xff0c;能在编译代码的时候自动生成一个版…

【Proteus仿真】【Arduino单片机】汽车倒车报警系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduinno单片机控制器&#xff0c;使用LCD1602液晶、按键、继电器电机模块、DS18B20温度传感器、蜂鸣器LED、HCSR04超声波等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD16…

Maven Wrapper安装指令

开源项目SDK&#xff1a;https://github.com/mingyang66/spring-parent 个人文档&#xff1a;https://mingyang66.github.io/raccoon-docs/#/ Maven Wrapper是一个小脚本和库&#xff0c;它允许你再没有预装Maven的情况下构建Maven项目。通过Maven Wrapper项目的构建环境可以变…

C# 启动exe 程序

(1) publicbool Start () System.Diagnostics.Process process new System.Diagnostics.Process(); process.StartInfo.FileName "iexplore.exe"; //IE浏览器&#xff0c;可以更换 process.StartInfo.Arguments "http://www.baidu.com"; process.…

代理模式--cglib动态代理

1.介绍 cglib (Code Generation Library ) 是一个第三方代码生成类库&#xff0c;运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展。cglib 为没有实现接口的类提供代理&#xff0c;为JDK的动态代理提供了很好的补充。 2.JDK动态代理与CGLIB动态代理对比 JDK…

【网络安全学习】漏洞扫描:-04- ZAP漏洞扫描工具

**ZAP(Zed Attack Proxy)**是一款由OWASP组织开发的免费且开源的安全测试工具。 ZAP支持认证、AJAX爬取、自动化扫描、强制浏览和动态SSL证书等功能。 1️⃣ 安装zap工具 现在的kali版本不一定会预装zap&#xff0c;我们可以自行安装&#xff0c;安装也十分简单。 apt-get …

下载nvm安装完成后使用命令无法连接网络的解决办法(环境变量中设置全局IP网络代理)

在cmd中输入 nvm ls available &#xff0c; 可以查看node.js的可用的版本号 但是半天没动静&#xff0c;然后显示连接超时&#xff1a; Could not retrieve https://nodejs.org/dist/index.json.Get "https://nodejs.org/dist/index.json": dial tcp 104.20.23.46:…

mybatis查询PostgreSQL报错:无法确定参数 $1 的数据类型

错误信息 ### Cause: org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型 ; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型] with root cause org.postgresql.util.PSQLException: 错误: …

30.Netty进阶-黏包半包解决方案-短链接

客户端发送一次完整的消息,然后就把与服务端的链接断开。服务端读到的结果就是-1。 服务器就知道 从链接建立到断开,发送的数据是一条完整的数据。 客户端代码 package com.xkj.nian;import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf; import io.net…

转让中字头无区域农业公司变更快包迁全国

国家局名称的公司不仅可以提升企业形象&#xff0c;还能展现公司的实力。由于国家总局核名的审核标准相对严格&#xff0c;能够通过核名的企业一般都具备一定的实力和资质。因此&#xff0c;选择国家局核名的企业往往能够在市场中获得更多信任和认可。详情致电咨询我或者来公司…

C# 实现draw一个简单的温度计

运行结果 概述&#xff1a; 代码分析 该控件主要包含以下几个部分&#xff1a; 属性定义&#xff1a; MinValue&#xff1a;最低温度值。 MaxValue&#xff1a;最高温度值。 CurrentValue&#xff1a;当前温度值。 构造函数&#xff1a; 设置了一些控件样式来提升绘制效果…

Flutter showModalBottomSheet用法

先搞一个DialogUtil工具类 import package:flutter/material.dart;class DialogUtil {static void showCommonBottomSheet(BuildContext context,Widget widget,{scrollControlledfalse}){showModalBottomSheet(context: context,enableDrag:false,builder: (BuildContext con…

【计算机网络体系结构】计算机网络体系结构实验-DHCP实验

服务器ip地址 2. 服务器地址池 3. 客户端ip 4. ping Ipconfig