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

前端面试专栏-主流框架:15.Vue模板编译与渲染流程

🔥 欢迎来到前端面试通关指南专栏!从js精讲到框架到实战,渐进系统化学习,坚持解锁新技能,祝你轻松拿下心仪offer。
前端面试通关指南专栏主页
前端面试专栏规划详情在这里插入图片描述

Vue3模板编译与渲染流程深度剖析

在Vue3的开发体系中,模板编译与渲染流程是其核心机制之一,深刻理解这一过程对于优化Vue3应用性能、提升开发效率具有重要意义。Vue3通过一系列精妙的步骤,将开发者编写的模板代码转换为高效的可执行JavaScript代码,并最终渲染出用户界面。接下来,我们将深入探究Vue3模板编译与渲染的每一个关键环节。

一、模板编译流程

1. 解析阶段:构建模板AST(抽象语法树)

Vue3的模板编译起始于解析阶段,其核心任务是将模板字符串转换为AST。解析器如同一位严谨的语法专家,对模板字符串进行词法和语法分析,这个过程可以分为以下几个具体步骤:

  1. 词法分析(Lexical Analysis)

    • 扫描器将模板字符串拆分为有意义的Token序列
    • 识别HTML标签(如<div></div>
    • 识别属性(如class="container"
    • 识别文本内容和插值表达式(如{{ message }}
  2. 语法分析(Syntax Analysis)

    • 根据Token序列构建AST节点
    • 建立节点间的父子关系
    • 记录节点的位置信息(用于错误提示)

例如,对于模板<div class="container"><p>{{ message }}</p></div>,解析器会:

  1. 创建根节点div
  2. div添加属性节点class="container"
  3. 创建子节点p
  4. p节点添加插值表达式节点{{ message }}

生成的AST结构大致如下:

{"type": "Element","tag": "div","attrs": [{"name": "class","value": "container"}],"children": [{"type": "Element","tag": "p","children": [{"type": "Interpolation","content": "message"}]}]
}

关键特性:

  • AST节点包含完整的模板语义信息
  • 保留了原始模板的结构关系
  • 为后续的转换和代码生成阶段提供基础数据结构
  • 完全平台无关,可以在不同环境(Web、小程序等)复用

这个阶段的错误处理会检测:

  • 标签未闭合
  • 属性格式错误
  • 插值表达式语法错误
    等常见模板语法问题

2. 转换阶段:插件式transform流水线

完成AST构建后,进入转换阶段。此阶段是Vue3模板编译的"智能优化车间",通过插件式的transform流水线对AST进行遍历与处理。该阶段采用分层架构设计,主要包含以下处理流程:

  1. 插件式架构实现

    • 采用可插拔的插件机制,每个transform插件独立封装特定功能
    • 插件执行顺序遵循固定的优先级队列(如NodeTransform优先级高于DirectiveTransform)
    • 通过context.shared对象实现插件间通信和数据共享
  2. 核心处理流程

    // 典型transform插件注册示例
    export function createTransformContext(ast, options) {const transforms = [transformIf,       // v-if条件处理transformFor,      // v-for循环处理transformExpression, // 表达式转换transformElement,  // 元素节点处理transformText      // 文本节点处理]// ...其他插件注册
    }
    
  3. 关键transform插件示例

    • v-if处理插件:将v-if/v-else-if/v-else转换为条件渲染节点
    • v-for处理插件:处理循环指令,生成渲染函数中的循环结构
    • 事件处理插件:转换@click等事件绑定为可执行函数
    • 静态提升插件:识别静态节点进行hoist优化
  4. 优化处理策略

    • 在transform过程中同步进行静态分析
    • 对可优化的节点打上hoist等标记
    • 建立动态绑定与响应式数据的关联关系
  5. 输出处理结果

    • 生成带有丰富元信息的增强型AST
    • 为每个节点附加codegen所需属性
    • 保留source map信息用于开发调试

该阶段通过这种模块化设计,既保证了核心功能的稳定性,又为自定义编译策略提供了灵活扩展点。开发者可以通过配置options.transforms来添加自定义transform插件,实现编译流程的个性化定制。

2.1 transformElement插件

transformElement插件是Vue模板编译过程中的核心转换器之一,主要负责将AST(抽象语法树)节点转换为标准的createVNode(...)调用形式。这个转换过程是实现虚拟DOM创建的关键步骤,为后续的渲染和更新提供了基础数据结构。

具体实现原理:

  1. 插件会遍历AST中的每个元素节点
  2. 对每个元素节点执行以下转换:
    • 将标签名作为第一个参数
    • 将props对象作为第二个参数(无属性时为null)
    • 将子节点数组作为第三个参数(无子节点时可省略)

典型转换示例:

// 原始AST节点
{type: 1,tag: 'div',children: [{ type: 2, content: 'Hello' }]
}// 转换后代码
createVNode('div', null, [createTextVNode('Hello')
])

高级特性:

  1. 支持动态属性处理
  2. 保留原始AST的位置信息
  3. 处理特殊元素(如组件、Slot等)
  4. 生成优化标记(如静态节点标记)

应用场景:

  • 模板编译阶段
  • 自定义渲染器开发
  • SSR(服务端渲染)场景
  • 开发环境下的模板调试

该插件与其他编译插件的协作关系:

  1. transformOnce插件之后执行
  2. transformStyle插件之前执行
  3. 依赖transformExpression插件处理动态表达式
2.2 transformExpression插件

transformExpression插件是Vue模板编译过程中的一个重要优化工具,其主要功能是将模板中的动态表达式转换为更高效的JavaScript代码。该插件通过以下方式提升性能:

  1. 表达式变量提升

    • 将模板中的插值表达式(如{{ message }})转换为渲染函数中的局部变量
    • 原始表达式会被转换为_ctx.message的形式
    • 通过变量缓存减少重复计算
  2. 优化处理流程

    1. 解析阶段:识别模板中的所有动态表达式
    2. 转换阶段:
      • 对简单表达式直接变量提升
      • 对复杂表达式进行静态分析
    3. 生成阶段:输出优化后的渲染函数代码
  3. 典型应用场景

    • 处理插值表达式:{{ user.name }}_ctx.user.name
    • 处理属性绑定::class="activeClass"_ctx.activeClass
    • 处理事件绑定:@click="handleClick"_ctx.handleClick
  4. 性能优势

    • 减少每次渲染时的表达式解析开销
    • 通过变量缓存避免重复计算
    • 生成的代码更符合JavaScript引擎的优化模式

示例对比:

// 转换前
function render() {return createVNode('div', null, message)
}// 转换后
function render(_ctx) {return createVNode('div', null, _ctx.message)
}

该插件特别适用于包含大量动态内容的复杂模板,能显著提升渲染性能,同时保持原始逻辑的完全一致性。

2.2 transformExpression插件

transformExpression插件是Vue模板编译过程中的一个重要优化工具,其主要功能是将模板中的动态表达式转换为更高效的JavaScript代码。该插件通过以下方式提升性能:

  1. 表达式变量提升

    • 将模板中的插值表达式(如{{ message }})转换为渲染函数中的局部变量
    • 原始表达式会被转换为_ctx.message的形式
    • 通过变量缓存减少重复计算
  2. 优化处理流程

    1. 解析阶段:识别模板中的所有动态表达式
    2. 转换阶段:
      • 对简单表达式直接变量提升
      • 对复杂表达式进行静态分析
    3. 生成阶段:输出优化后的渲染函数代码
  3. 典型应用场景

    • 处理插值表达式:{{ user.name }}_ctx.user.name
    • 处理属性绑定::class="activeClass"_ctx.activeClass
    • 处理事件绑定:@click="handleClick"_ctx.handleClick
  4. 性能优势

    • 减少每次渲染时的表达式解析开销
    • 通过变量缓存避免重复计算
    • 生成的代码更符合JavaScript引擎的优化模式

示例对比:

// 转换前
function render() {return createVNode('div', null, message)
}// 转换后
function render(_ctx) {return createVNode('div', null, _ctx.message)
}

该插件特别适用于包含大量动态内容的复杂模板,能显著提升渲染性能,同时保持原始逻辑的完全一致性。

2.4 transformBind插件

transformBind插件是Vue模板编译器的核心模块之一,专门负责处理模板中的v-bind指令。其主要功能是将指令绑定的属性转换为可执行的JavaScript代码,实现HTML属性与Vue实例数据的动态绑定。

工作原理:

  1. 解析阶段:AST遍历器识别模板中所有包含v-bind的节点
  2. 转换阶段:
    • 对于常规绑定(如v-bind:src="imageUrl"),转换为src: imageUrl
    • 对于缩写形式(如:class="{active: isActive}"),转换为完整的绑定表达式
    • 处理动态参数(如v-bind:[attributeName])的特殊情况
  3. 代码生成阶段:生成对应的render函数代码

典型转换示例:

<!-- 原始模板 -->
<img v-bind:src="imageUrl" :alt="imageAlt"><!-- 转换结果 -->
_createElement("img", {attrs: {src: imageUrl,alt: imageAlt}
})

特殊处理:

  1. 对象语法:v-bind="object"会展开对象的所有属性
  2. 样式和类绑定:会对classstyle进行特殊处理,支持对象/数组语法
  3. 属性合并:静态属性和动态属性会智能合并

应用场景:

  • 动态图片路径
  • 条件性应用CSS类
  • 传递组件props
  • 设置ARIA属性等辅助功能属性

该插件确保了模板中的属性绑定能够正确反映组件状态的变化,是Vue响应式系统的重要组成部分。

2.5 transformOn插件详解

transformOn插件是模板编译过程中的核心事件处理器,专门负责将模板中的事件绑定语法(如@click@submit等)转换为可执行的JavaScript事件监听代码。该插件的工作流程如下:

  1. 事件解析阶段

    • 识别模板中的事件绑定语法(如@click="handleClick"
    • 提取事件类型(click)和回调函数名(handleClick)
    • 例如:<button @click="submitForm">会被解析为click事件和submitForm处理函数
  2. 代码生成阶段

    • 创建虚拟节点的事件属性对象
    • 生成事件监听代码,如:withCtx(() => _ctx.handleClick)
    • 确保事件处理函数能正确访问组件实例上下文
  3. 特殊事件处理

    • 支持事件修饰符(如.stop.prevent
    • 处理键盘事件修饰符(如@keyup.enter
    • 处理系统修饰键(如@click.ctrl

开发者可以灵活扩展事件处理能力,通过自定义transform插件来满足特定需求。例如要实现一个延迟显示指令v-delay,其完整实现如下:

const transformVDelay = (node, context) => {// 只处理元素节点且包含指令的情况if (node.type === NodeTypes.ELEMENT && node.directives) {const delayDir = node.directives.find(dir => dir.name === 'delay');if (delayDir) {// 获取延迟时间参数,默认300msconst delayTime = delayDir.exp ? parseInt(delayDir.exp.content) : 300;// 生成代码逻辑node.codegenNode = {type: NodeTypes.EXPRESSION,content: `(() => {const el = ${context.helper('ref')}(null);setTimeout(() => {el.value.style.display = 'block';}, ${delayTime});return el;})()`};// 添加初始隐藏样式if (!node.props) node.props = [];node.props.push({type: NodeTypes.ATTRIBUTE,name: 'style',value: 'display: none'});}}return node;
};

在实际编译过程中,transform插件系统的工作特点包括:

  1. 插件执行顺序

    • 按注册顺序依次执行
    • 基础插件(如transformOn)优先执行
    • 自定义插件后续执行
  2. AST转换类型

    • 语法转换(如将@事件转换为onXxx)
    • 结构优化(如静态节点提升)
    • 元信息注入(如标记组件类型)
  3. 上下文传递

    • 通过context对象共享编译状态
    • 可访问helper函数库
    • 支持sourcemap生成

通过这些插件的协同工作,最终生成的AST不仅完成了语法层面的转换,还包含了完整的渲染逻辑信息,为后续高效渲染函数的生成奠定了坚实基础。

3. 生成阶段:转为渲染函数

经过转换阶段的精心雕琢,AST进入生成阶段,目标是生成可执行的JavaScript渲染函数。这一阶段是整个模板编译过程的最后关键步骤,将优化后的AST转换为可执行的JavaScript代码。generate函数如同一位代码生成大师,通过递归遍历AST节点,将每个节点转换为对应的虚拟DOM创建语句,最终生成完整的渲染函数字符串。

生成的渲染函数包含创建虚拟节点的语句,以及响应式数据绑定等关键逻辑。在Vue 3中,这个过程会生成一个包含多个辅助函数(如createElementVNodetoDisplayString等)的render函数。例如,对于前面提到的简单模板:

<div class="container"><p>{{ message }}</p>
</div>

生成的渲染函数可能类似如下形式:

import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString } from 'vue';export function render(_ctx, _cache) {return _createElementVNode('div', { class: 'container' }, [_createElementVNode('p', null, _toDisplayString(_ctx.message))]);
}

在这个渲染函数中:

  1. _createElementVNode函数是Vue提供的虚拟节点创建函数,用于创建不同类型的虚拟DOM节点
  2. _toDisplayString函数用于处理插值表达式,将其转换为字符串形式进行显示,同时会处理null/undefined等特殊情况
  3. 函数接收两个重要参数:
    • _ctx:上下文对象,包含组件的响应式数据和所有可用属性
    • _cache:用于缓存一些中间结果,特别是静态节点,以提高重复渲染时的性能
  4. 函数返回值是一个虚拟DOM树,描述整个组件的DOM结构

对于更复杂的模板,生成阶段还会处理以下情况:

  • 条件渲染(v-if/v-else)
  • 列表渲染(v-for)
  • 事件处理(v-on/@)
  • 动态属性绑定(v-bind/:)
  • 插槽内容(slot)

例如,对于包含v-for指令的模板:

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

生成的渲染函数会包含相应的循环逻辑和key处理:

function render(_ctx, _cache) {return _createElementVNode("ul", null, [_renderList(_ctx.items, (item) => {return _createElementVNode("li", { key: item.id }, _toDisplayString(item.name), 1)})])
}

通过这些参数和逻辑,生成的渲染函数能够实现数据与视图的精确绑定和高效渲染,为后续的虚拟DOM diff和真实DOM更新打下基础。

二、渲染流程

1. 创建响应式数据与组件实例初始化

在Vue3的模板编译阶段完成后,系统会生成可执行的渲染函数,此时进入核心的渲染流程。首先,Vue3会利用其重构后的响应式系统(基于Proxy实现)来创建响应式数据。开发者可以使用以下API:

  1. reactive函数:创建深层次的响应式对象
import { reactive } from 'vue';// 创建响应式对象
const state = reactive({count: 0,message: 'Hello Vue3',user: {name: 'John',age: 30}
});// 修改数据会自动触发更新
state.count++;  // 响应式更新
state.user.age = 31;  // 嵌套对象也是响应式的
  1. ref函数:创建基本类型的响应式引用
import { ref } from 'vue';// 创建ref响应式数据
const num = ref(10);  // 包装为{value: 10}// 访问需要通过.value
console.log(num.value); // 10
num.value++;  // 响应式更新

在组件实例初始化阶段,Vue3采用全新的组合式API设计。当开发者在入口文件中使用createApp创建应用实例时,会触发以下初始化流程:

import { createApp } from 'vue';
import App from './App.vue';// 1. 创建应用实例
const app = createApp({// 组件选项data() {return {message: 'Vue3 App'}},methods: {greet() {console.log(this.message);}}// 其他选项...
});// 2. 挂载到DOM
app.mount('#app');

初始化过程具体包含以下步骤:

  1. 解析组件选项对象(包括data、methods、computed等)
  2. 建立响应式系统连接
  3. 处理生命周期钩子(beforeCreate、created等)
  4. 设置模板编译后的渲染函数
  5. 初始化依赖注入系统(provide/inject)
  6. 准备事件系统( e m i t / emit/ emit/on)

对于单文件组件(SFC),初始化还会额外处理:

  • <template>部分编译为渲染函数
  • <script>中的组合式API代码会被解析
  • <style>样式处理(包括scoped样式)

这个初始化过程完成后,组件实例就具备了完整的响应式能力、生命周期管理和渲染能力,为后续的虚拟DOM生成和真实DOM渲染做好准备。

2. 渲染虚拟DOM

组件实例初始化完成后,会调用渲染函数(render function)生成虚拟DOM(Virtual DOM,简称VNode)。虚拟DOM是Vue3实现高效渲染的核心机制,它是一种轻量级的JavaScript对象,通过JavaScript对象树的形式来描述真实DOM结构。与直接操作真实DOM相比,虚拟DOM具有以下优势:

  1. 性能优化:避免了频繁的直接DOM操作,减少了浏览器重绘和回流的开销
  2. 跨平台能力:同一套虚拟DOM可以在不同平台(Web、Native等)转换为相应的界面
  3. 简化开发:开发者只需关注数据变化,不必手动处理DOM更新

以之前生成的渲染函数为例,执行该函数会创建一系列虚拟节点,构建出一棵完整的虚拟DOM树。每个虚拟节点(VNode)包含以下关键信息:

  • 标签名(tag):如divpspan等HTML元素名称
  • 属性(props):如classidstyle等HTML属性
  • 事件监听器(listeners):如clickinput等事件处理函数
  • 子节点(children):可以是文本内容或其他VNode节点
  • 其他特殊标记:如key用于优化列表渲染

例如,对于一个简单的模板:

<div class="container"><p>Hello Vue 3!</p>
</div>

对应的虚拟DOM树可能表示为:

{tag: 'div',props: { class: 'container' },children: [{tag: 'p',children: 'Hello Vue 3!'}]
}

虚拟DOM会精确模拟最终要渲染到页面上的真实DOM结构,但此时还不会立即更新到真实DOM。Vue会先将新旧虚拟DOM进行对比(diff算法),找出最小化的变更,然后才将这些变更批量应用到真实DOM上,这个过程称为"补丁"(patching)。这种机制确保了DOM操作的高效性,特别是在复杂的应用场景中。

3. 比较与更新

当响应式数据发生变化时,Vue3会触发重新渲染过程。这个过程的效率很大程度上依赖于其优化的Diff算法,具体步骤如下:

  1. 触发更新:当响应式数据(如state.count)被修改时,Vue3的响应式系统会检测到变化并标记相关组件为"需要更新"状态。

  2. 生成新虚拟DOM:Vue3会重新运行组件的渲染函数,生成新的虚拟DOM树。例如:

    // 假设原始count=1,更新后count=2
    // 旧虚拟DOM: <div>Count: 1</div>
    // 新虚拟DOM: <div>Count: 2</div>
    
  3. Diff算法执行:Vue3采用优化的Diff算法进行对比,主要包含以下策略:

    • 同层比较:只比较同一层级的节点,不跨层级比较
    • 节点复用:通过key属性尽可能复用相同节点
    • 静态提升:完全跳过对静态节点(编译阶段标记的)的比较
  4. 差异定位:算法会精确找出需要更新的节点。例如在上面的例子中,算法会识别出只有文本节点"1"需要变为"2",而外围的div元素保持不变。

  5. 更新策略:根据不同的变化类型采取不同更新方式:

    • 属性变化:直接更新DOM属性
    • 文本变化:更新textContent
    • 节点增减:执行DOM插入/删除操作
  6. 最终更新:将计算出的最小变更应用到真实DOM上,完成视图更新。

Vue3的Diff算法相比Vue2有显著优化:

  • 编译时静态分析使得约90%的节点可以被跳过比较
  • 最长递增子序列算法优化了列表对比效率
  • 事件侦听器缓存减少了不必要的更新

实际案例:在一个包含1000个列表项的应用中,当修改其中一项的文本时,Vue3只会精确更新该列表项的文本节点,而非重建整个列表。

4. 生成真实DOM并插入页面

当Vue3完成新的虚拟DOM树构建后,会进入真实DOM的生成和挂载阶段。这个关键流程具体包含以下细节:

  1. 虚拟DOM到真实DOM的转换过程

    • Vue3的渲染器(Renderer)会遍历虚拟DOM树的每个节点
    • 对于元素节点,调用浏览器API(如document.createElement())创建对应HTML元素
    • 处理节点属性:通过setAttribute()等方法设置class、id、style等属性
    • 处理事件监听器:使用addEventListener()绑定事件
    • 对于文本节点,使用document.createTextNode()创建文本内容
  2. DOM组装与插入

    • 按照虚拟DOM的层级结构,递归地将子节点插入到父节点中
    • 使用appendChild()insertBefore()等DOM操作方法建立节点关系
    • 特殊处理组件节点:递归执行组件实例的渲染过程
  3. 性能优化措施

    • 使用文档片段(DocumentFragment)批量操作DOM
    • 只在必要位置触发浏览器重排和重绘
    • 利用DOM diff算法最小化DOM操作
  4. 实际转换示例

    // 虚拟DOM节点
    const vnode = {type: 'div',props: { class: 'container', onClick: handler },children: [{ type: 'span', children: 'Hello' },{ type: 'button', children: 'Click me' }]
    }// 转换为真实DOM
    const div = document.createElement('div')
    div.className = 'container'
    div.addEventListener('click', handler)const span = document.createElement('span')
    span.textContent = 'Hello'const button = document.createElement('button')
    button.textContent = 'Click me'div.appendChild(span)
    div.appendChild(button)// 最后插入到页面容器中
    document.getElementById('app').appendChild(div)
    
  5. 应用场景

    • 首次渲染时构建完整DOM树
    • 响应式数据变化后的局部更新
    • 动态组件切换时的DOM重建
    • 列表数据变化时的高效DOM调整

整个转换过程结束后,用户就能看到与最新数据状态对应的界面,实现了Vue"数据驱动视图"的核心机制。这种抽象层设计既保证了开发效率,又通过智能的DOM更新策略确保了运行时性能。

5. 监听数据变化

在整个渲染过程中,Vue3建立了强大的数据监听机制,这主要依赖于其改进后的响应式系统。Vue3使用Proxy API替代了Vue2中的Object.defineProperty来实现响应式,带来了以下优势:

  1. 可以检测到对象属性的添加/删除
  2. 可以监听数组索引的变化
  3. 性能更好,不需要递归遍历所有属性

当组件实例被挂载到页面上时,Vue3会通过以下步骤建立响应式监听:

  1. 创建响应式代理对象
  2. 为每个响应式属性设置getter和setter
  3. 在getter中收集依赖(dep),在setter中触发更新

当数据发生变化时,Vue3的响应式系统会高效地:

  1. 检测到具体哪个属性发生了变化
  2. 只通知与该属性相关的组件进行更新
  3. 通过异步更新队列(如nextTick)批量处理多个数据变更

这种自动的数据监听与响应机制,配合Vue3的虚拟DOM diff算法,实现了精准高效的更新。例如:

const state = reactive({count: 0,list: []
})// 当count变化时
state.count++ // 只会重新渲染依赖count的组件
// 当list变化时
state.list.push('new item') // 会检测到数组变化并更新

Vue3的模板编译与渲染流程是一个复杂而精妙的过程,主要包含以下优化点:

  1. 编译时的静态提升(Static Hoisting)
  2. 补丁标记(Patch Flags)
  3. 树结构优化(Tree Flattening)
  4. 缓存事件处理函数(Cache Event Handlers)

开发者可以通过以下方式优化渲染性能:

  1. 合理使用v-once指令
  2. 正确使用key属性
  3. 避免不必要的响应式数据
  4. 使用computed缓存计算结果

通过深入理解这一过程,开发者能够编写出更高效的Vue3应用。例如在大型表单场景中,可以:

  1. 使用shallowRef处理不需要深度监听的对象
  2. 拆分复杂组件为更小的单元
  3. 使用v-memo优化重复渲染

这些优化手段配合Vue3的响应式系统,可以显著提升应用性能,特别是在数据频繁变化的场景下。

📌 下期预告:vue工程化配置(Vite、Webpack)
❤️❤️❤️:如果你觉得这篇文章对你有帮助,欢迎点赞、关注本专栏!后续解锁更多功能,敬请期待!👍🏻 👍🏻 👍🏻
更多专栏汇总:
前端面试专栏
Node.js 实训专栏

相关文章:

  • 给自己网站增加一个免费的AI助手,纯HTML
  • VScode使用usb转网口远程开发rk3588
  • InfluxDB 3 Core最后值缓存深度实践:毫秒级响应实时数据的核心引擎
  • 分布式电源采集控制装置:山东光伏电站的“智能中枢”
  • 典型工程应用三
  • Python pyserial库【串口通信】全面讲解
  • vue-28(服务器端渲染(SSR)简介及其优势)
  • 桌面小屏幕实战课程:DesktopScreen 16 HTTP
  • 【Go语言-Day 10】深入指针应用:解锁函数“引用传递”与内存分配的秘密
  • 进阶向:Flask框架详解,从零开始理解Web开发利器
  • 什么是哈希函数(SHA-256)
  • 华为云Flexus+DeepSeek征文|利用华为云一键部署的Dify平台构建高效智能电商客服系统实战
  • 【数据挖掘】贝叶斯分类学习—NaiveBayes
  • Spring Boot 3 多数据源改造全流程:Druid、HikariCP 与 dynamic-datasource 实战总结
  • 23种设计模式——策略模式:像换口红一样切换你的算法
  • Solidity学习 - 函数修改器(modifier)
  • 大事件项目记录10-文章分类接口开发-更新文章分类
  • 太速科技-670-3U VPX PCIe桥扩展3路M.2高速存储模块
  • 莫队算法 —— 将暴力玩出花
  • 配置文件application.yml使用指南