JavaScript中的防抖与节流:提升性能的关键技巧 (1)
文章目录
- JavaScript 中的防抖与节流:提升性能的关键技巧
- 一、防抖(Debounce)
- 1.1 概念
- 1.2 应用场景
- 1.3 代码实现
- 二、节流(Throttle)
- 2.1 概念
- 2.2 应用场景
- 2.3 代码实现
- 2.3.1 时间戳方式
- 2.3.2 定时器方式
- 三、防抖与节流的区别
- 四、总结
JavaScript 中的防抖与节流:提升性能的关键技巧
在 JavaScript 开发的过程中,我们经常会与各种高频触发事件打交道,例如窗口大小调整、滚动条滚动以及输入框输入等。倘若对这些事件处理得不够妥当,极有可能引发性能方面的问题,甚至对用户体验产生负面影响。而防抖(Debounce)和节流(Throttle)技术,正是解决此类问题的得力工具。
一、防抖(Debounce)
1.1 概念
防抖的核心思路是:当某个事件被触发时,会设定一个延迟时间。在这个延迟时间之内,如果该事件再次被触发,那么之前设置的延迟定时器就会被清除,然后重新开始计时。只有当延迟时间结束,并且在这期间没有再次触发该事件时,我们真正期望执行的函数才会被执行。这就好比你在使用自动门,当你快速进出多次时,自动门不会每次都立即关闭,而是在你最后一次通过后,等待一段时间才关闭,这个等待的过程就类似于防抖中的延迟时间 。
1.2 应用场景
搜索框输入:在用户进行搜索操作时,每输入一个字符就可能触发一次搜索请求。如果不进行防抖处理,会频繁地向服务器发送请求,这不仅会增加服务器的负载压力,还可能导致网络资源的浪费。通过防抖技术,我们可以设定在用户停止输入 300 毫秒后,再发起搜索请求。这样一来,只有当用户输入完成并暂停一段时间后,才会触发搜索操作,大大减少了不必要的请求次数。
窗口大小调整:当用户调整浏览器窗口大小时,会持续触发 resize 事件。如果在这个事件处理函数中执行复杂的布局调整操作,如重新计算元素的位置和大小、重新渲染页面等,频繁的触发会导致大量的计算任务,严重影响页面的性能。使用防抖技术,能够确保在用户停止调整窗口一段时间后,才执行布局调整相关的操作,有效避免了频繁计算带来的性能损耗。
图片懒加载:在图片较多的页面中,当图片即将进入视口时会触发相关事件来加载图片。利用防抖可以避免在图片快速接近视口边界时多次触发加载函数,只有当图片稳定在视口内一段时间后才加载,减少不必要的加载请求。例如在一个商品展示页面,有大量商品图片,使用防抖可以优化图片加载,提升页面加载速度。
WebSocket 连接管理:当网络状态不稳定时,可能会频繁触发连接状态变化事件。通过防抖,在网络状态频繁变化时不会立即尝试重新连接 WebSocket,而是在网络状态稳定一段时间后再进行连接操作,避免频繁的无效连接尝试,节省网络资源和服务器压力。
1.3 代码实现
// 定义防抖函数function debounce(func, delay) {// 声明一个变量timer,用于存储定时器的标识let timer;// 返回一个新的函数,这个函数就是我们实际使用的防抖函数return function() {// 获取当前函数执行时的上下文对象,通常是调用该函数的对象,这里用this表示const context = this;// 获取当前函数执行时传入的参数,用arguments对象来存储const args = arguments;// 如果timer存在,说明之前已经设置了定时器,并且还未到达延迟时间if (timer) {// 清除之前设置的定时器,重新开始计时clearTimeout(timer);}// 设置一个新的定时器,在延迟时间delay毫秒后执行传入的函数func// 使用apply方法来调用func,确保func执行时的上下文对象为context,传入的参数为argstimer = setTimeout(() => {func.apply(context, args);}, delay);};
}// 定义一个处理搜索操作的函数
function handleSearch() {console.log('执行搜索操作');
}
// 使用debounce函数对handleSearch函数进行防抖处理,延迟时间为300毫秒
const debouncedSearch = debounce(handleSearch, 300);
// 为id为searchInput的输入框添加input事件监听器,当输入框内容发生变化时,调用debouncedSearch函数
document.getElementById('searchInput').addEventListener('input', debouncedSearch);
二、节流(Throttle)
2.1 概念
节流指的是在一定的时间间隔内,无论事件被触发多少次,都只会执行一次函数。可以将其理解为对事件的触发频率进行 “节流”,使得事件处理函数按照我们预先设定的时间间隔来执行。比如水龙头的水流控制,无论你怎么快速地开关水龙头,在一定时间内,流出的水量是有限的,这就类似于节流对事件触发频率的限制。
2.2 应用场景
滚动事件:当用户滚动页面时,会频繁地触发 scroll 事件。如果在这个事件处理函数中执行一些如加载更多数据、判断元素是否进入视口等操作,不加限制地频繁执行这些操作,会消耗大量的系统资源,导致页面卡顿。通过节流技术,我们可以设定每 1000 毫秒执行一次加载更多数据的操作,这样既能满足用户的浏览需求,又能保证页面的流畅性。
鼠标点击:在某些特定的场景下,我们可能需要限制用户点击按钮的频率。例如,在提交表单的场景中,如果用户快速多次点击提交按钮,可能会导致重复提交数据,给服务器带来不必要的压力,甚至可能引发数据一致性问题。使用节流技术,我们可以设定每 500 毫秒只能点击一次提交按钮,有效避免了重复操作带来的问题。
游戏开发:在游戏中,玩家的一些操作(如射击、跳跃等)可能会被玩家快速重复触发。通过节流,我们可以限制玩家操作的频率,确保游戏逻辑的稳定性。例如在一个射击游戏中,限制玩家每 0.5 秒只能射击一次,避免玩家通过快速点击射击按钮获得不公平的优势。
文件上传进度监控:在上传大文件时,会频繁触发上传进度事件。使用节流可以控制进度更新的频率,避免因频繁更新进度条而占用过多资源,影响文件上传的效率和页面的响应速度。
2.3 代码实现
2.3.1 时间戳方式
// 定义节流函数,采用时间戳方式
function throttle(func, interval) {// 记录上一次函数执行的时间,初始值为0let lastTime = 0;// 返回一个新的函数,这个函数就是我们实际使用的节流函数return function() {// 获取当前时间的时间戳const now = Date.now();// 获取当前函数执行时的上下文对象,通常是调用该函数的对象,这里用this表示const context = this;// 获取当前函数执行时传入的参数,用arguments对象来存储const args = arguments;// 判断当前时间与上一次函数执行时间的差值是否大于等于设定的时间间隔intervalif (now - lastTime >= interval) {// 如果满足条件,执行传入的函数func// 使用apply方法来调用func,确保func执行时的上下文对象为context,传入的参数为argsfunc.apply(context, args);// 更新上一次函数执行的时间为当前时间lastTime = now;}};
}
// 定义一个加载更多数据的函数
function loadMoreData() {console.log('加载更多数据');
}
// 使用throttle函数对loadMoreData函数进行节流处理,时间间隔为1000毫秒
const throttledLoadMore = throttle(loadMoreData, 1000);
// 为window对象添加scroll事件监听器,当页面滚动时,调用throttledLoadMore函数
window.addEventListener('scroll', throttledLoadMore);
2.3.2 定时器方式
// 定义节流函数,采用定时器方式
function throttle(func, interval) {// 声明一个变量timer,用于存储定时器的标识let timer;// 返回一个新的函数,这个函数就是我们实际使用的节流函数return function() {// 获取当前函数执行时的上下文对象,通常是调用该函数的对象,这里用this表示const context = this;// 获取当前函数执行时传入的参数,用arguments对象来存储const args = arguments;// 如果timer不存在,说明当前处于可以执行函数的时间间隔内if (!timer) {// 执行传入的函数func// 使用apply方法来调用func,确保func执行时的上下文对象为context,传入的参数为argsfunc.apply(context, args);// 设置一个定时器,在时间间隔interval毫秒后将timer重置为null// 这样在下一次函数调用时,timer为null,就可以再次执行函数timer = setTimeout(() => {timer = null;}, interval);}};
}
// 定义一个处理按钮点击的函数
function handleClick() {console.log('按钮点击处理');
}
// 使用throttle函数对handleClick函数进行节流处理,时间间隔为500毫秒
const throttledClick = throttle(handleClick, 500);
// 为id为clickButton的按钮添加click事件监听器,当按钮被点击时,调用throttledClick函数
document.getElementById('clickButton').addEventListener('click', throttledClick);
三、防抖与节流的区别
执行时机:防抖是在事件停止触发后的延迟时间结束后才执行函数;而节流是按照固定的时间间隔执行函数,与事件是否停止触发没有关系。
应用场景:防抖更适用于那些需要在用户操作结束后执行一次的场景,比如搜索框输入、文本编辑器的保存操作等;节流则更适用于需要限制事件触发频率的场景,像滚动事件、频繁点击事件以及一些需要控制数据更新频率的场景。
四、总结
防抖和节流是 JavaScript 开发中极为实用的性能优化技巧。合理运用这两种技术,能够显著减少不必要的计算和请求,从而有效提升页面的性能以及用户体验。在实际的开发过程中,我们需要依据具体的业务场景和需求,精准地选择合适的技术来优化代码,以实现更加高效、流畅的应用程序。
如果你还想了解它们在特定框架(如 Vue、React)中的应用,或者想进一步优化代码示例,都可以随时告诉我,我会继续完善这篇博客。
相关文章:
JavaScript中的防抖与节流:提升性能的关键技巧 (1)
文章目录 JavaScript 中的防抖与节流:提升性能的关键技巧一、防抖(Debounce)1.1 概念1.2 应用场景1.3 代码实现 二、节流(Throttle)2.1 概念2.2 应用场景2.3 代码实现2.3.1 时间戳方式2.3.2 定时器方式 三、防抖与节流…...
Java数据类型转换(自动转换和强制转换)
数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。 自动数据…...
【大数据技术】Spark分布式实现词频统计(hadoop+python+spark)
Spark分布式实现词频统计(hadooppythonspark) 搭建完全分布式高可用大数据集群(VMwareCentOSFinalShell) 搭建完全分布式高可用大数据集群(HadoopMapReduceYarn) 本机PyCharm远程连接CentOS虚拟机&#x…...
UMLS初探
什么是UMLS UMLS(Unified Medical Language System,统一医学语言系统),简单来说就是将不同的医学标准统一到一套体系的系统,主要为了医疗系统的统一而构建出的。 UMLS的主要组成部分 Metathesaurus:一个…...
Redis持久化机制详解
为什么需要持久化 Redis通常被作为缓存使用,但是Redis一旦宕机,内存中的数据全部丢失,可能会导致数据库崩溃。如果是从数据库中恢复这些数据就会存在频繁访问数据库和读取速度慢的问题。所以redis实现数据的持久化,是至关重要的。…...
Python 鼠标轨迹 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
PB-DW-数据窗口-降级-从12.5降级到9.0
PB 数据窗口从125降级到90 供参考,有哪些属性仍然需要删除,请在评论区留言。谢谢。 如果您有更好的工具,能分享给我一份的话,就更好了,感谢。 12.5数据窗口降级9.01- release 12.5; 更改为 release 9;2- 第二行的 d…...
Logo语言的测试开发
Logo语言的测试开发 引言 随着编程教育的不断发展,学习编程的门槛逐渐降低,各种编程语言应运而生。其中,Logo语言作为一种经典的教育编程语言,在培养儿童的逻辑思维和解决问题的能力方面,发挥了重要的作用。本文将深…...
位图的深入解析:从数据结构到图像处理与C++实现
在学习优选算法课程的时候,博主学习位运算了解到位运算的这个概念,之前没有接触过,就查找了相关的资料,丰富一下自身,当作课外知识来了解一下。 位图(Bitmap)是一种用于表示图像的数据结构&…...
Faveo Helpdesk存在目录遍历漏洞(CVE-2024-37700)
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
【Pytorch函数】PyTorch随机数生成全解析 | torch.rand()家族函数使用指南
🌟 PyTorch随机数生成全解析 | torch.rand()家族函数使用指南 🌟 📌 一、核心函数参数详解 PyTorch提供多种随机数生成函数(注意:无直接torch.random()函数),以下是常用函数及参数:…...
ML.NET库学习004:ML.NET基础知识复盘
文章目录 ML.NET库学习004:ML.NET基础知识复盘背景简单的 ML.NET 应用程序代码工作流机器学习模型基础进阶 ML.NET 架构构建管道训练模型使用模型 数据模型和架构模型部署 ML.NET库学习004:ML.NET基础知识复盘 学了几个小项目,发现好多方法莫…...
2. UVM的基本概念和架构
文章目录 前言1. UVM的基本概念1.1 UVM的核心组件1.2 UVM的基本架构1.3 UVM的工作流程 2. UVM的架构2.1 UVM的层次结构2.2 UVM的组件交互 3. 总结 前言 首先,得确定UVM的基本概念和架构包含哪些关键部分。我回忆起UVM的核心组件,比如uvm_component、uvm…...
算法10--哈希
哈希 原理经典例题[1. 两数之和](https://leetcode.cn/problems/two-sum/description/)[面试题 01.02. 判定是否互为字符重排](https://leetcode.cn/problems/check-permutation-lcci/description/)[217. 存在重复元素](https://editor.csdn.net/md?not_checkout1&spm1015…...
磁盘文件删除后恢复
磁盘文件删除后,文件数据并未立即消失,只是文件系统的指针被移除,标记该空间为可覆盖。要恢复文件,可以尝试以下方法: 1. 使用数据恢复软件 Recuva:适合Windows,能恢复多种文件类型。PhotoRec…...
STM32 CUBE Can调试
STM32 CUBE Can调试 1、CAN配置2、时钟配置3、手动添加4、回调函数5、启动函数和发送函数6、使用方法(采用消息队列来做缓存)7、数据不多在发送函数中获取空邮箱发送,否则循环等待空邮箱 1、CAN配置 2、时钟配置 3、手动添加 需要注意的是STM32CUBE配置的代码需要再…...
【大模型】Ubuntu下安装ollama,DeepSseek-R1:32b的本地部署和运行
1 ollama 的安装与设置 ollama官网链接:https://ollama.com/ 在左上角的【Models】中展示了ollama支持的模型在正中间的【Download】中课可以下载支持平台中的安装包。 其安装和模型路径配置操作流程如下: ollama的安装 这里选择命令安装curl -fsSL …...
Goland 内存逃逸问题
内存逃逸是什么? 在go语言中,内存分配存在两个方式:堆分配;栈分配。 栈分配:是在函数调用时为局部变量分配内存,当函数返回时,这些内存会自动释放。 堆分配:通过 new 或者 make 函…...
我们来学人工智能 -- 本地部署DeepSeek
本地部署DeepSeek 题记思考正题结语 题记 时不待我AI会淘汰各领域一些岗位AI可以精简部门,DP白菜价的落地,2025年会更加明显会AI的淘汰不会AI的第四次工业革命将在中国爆发 全产业链多年数字化建设以DP为代表的全球领先白菜价人工智能在各行各业的普及 …...
【GitHub】GitHub 2FA 双因素认证 ( 使用 Microsoft Authenticator 应用进行二次验证 )
文章目录 一、GitHub 的 2FA 双因素认证二、使用 Microsoft Authenticator 应用进行二次验证1、TOTP 应用2、下载 Microsoft Authenticator 应用3、安装使用 Authenticator 应用 三、恢复码重要性 一、GitHub 的 2FA 双因素认证 现在登录 GitHub 需要进行二次身份验证 ; 先登录…...
通过脚本实现自动将标签内容复制到下一个标签文件中
只需要将下面内容运行前 修改文件夹路径(控制修改范围的文件名 不需要的话 就随便写一个不相同的文件名 就行 需要的话就是在这个文件名字之前的会被修改) import os import time # 文件夹路径 image_directory r"C:\Users\Lenovo\Desktop\新建文件夹\images" # 替…...
Elasticsearch+Kibana安装启动与操作教程
在大数据时代,Elasticsearch(简称 ES)和 Kibana 作为强大的数据搜索与可视化工具,受到了众多开发者的青睐。本文将为您详细介绍在 Windows 和 Mac 系统上安装、启动 Elasticsearch 和 Kibana 的步骤,以及常用命令和 Ki…...
CSS Overflow 属性详解:控制内容溢出的利器
在前端开发中,处理内容溢出是一个常见的需求。CSS 提供了 overflow 属性,帮助我们控制当内容超出元素框时的显示方式。本文将详细介绍 overflow 属性的各种取值及其应用场景。 1. 什么是 overflow 属性? overflow 属性用于控制当元素的内容…...
什么是XMLHttpRequest?及其详细使用说明
XMLHttpRequest(通常缩写为XHR)是一个JavaScript对象,用于在浏览器和服务器之间进行异步通信。它允许网页在不重新加载整个页面的情况下,向服务器发送请求并接收响应。XHR是Ajax(Asynchronous JavaScript and XML&…...
Chrome浏览器原理及优化
1. 相关面试题 1.1. 请说说从输入 URL 到页面渲染完成的全过程 1. 输入URL,用户在浏览器的地址栏输入一个URL,并按下回车键; 2. DNS解析; 浏览器需要将域名转换为服务器的IP地址,以建立连接。 (1). 如果浏览器缓存、操作系统缓存或路由器缓存中已有该域名的IP地址,…...
Vue 3 + Vite + JS 项目中实现组件全局自动化注册的魔法,极致组件自动化注册方案,开发效率飙升300%。
在Vue项目开发中,你是否还在为重复的组件注册代码而烦恼?是否经历过在大型项目中手动维护数百个组件注册的痛苦?本文将揭秘一种革命性的组件自动化注册方案,结合Vite的黑魔法和Vue3的最新特性,让你的开发效率实现质的飞…...
寒假2.8
题解 web:[RoarCTF 2019]Easy Calc 打开,是一个计算界面 看一下源代码,提示设置了WAF,并且有一个calc.php文件 访问一下calc.php文件,得到源码,使用get方式传参赋值给num,设置了黑名单&#x…...
企业如何利用DeepSeek提升网络安全管理水平
企业可以通过深度整合DeepSeek的AI能力,构建智能化、动态化的网络安全防御体系,以应对APT(高级持续性威胁)等复杂攻击。以下是具体策略与实践路径: 1. AI驱动的威胁检测与分析 多模态威胁狩猎 DeepSeek的深度学习技术能…...
C++ libfmt 实战: 高效便捷的格式化库
libfmt 是一个现代化的 C格式化库{fmt}, 具有以下关键特性: 安全性: 受 Python 格式化功能启发, {fmt}为printf系列函数提供安全替代方案. 格式字符串错误在编译时就能被检测出来, 并且通过自动内存管理避免缓冲区溢出错误.可扩展性: 默认支持格式化大多数标准类型, 包括容器,…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_max_sockets
在 Nginx 的源代码中, ngx_max_sockets 全局变量的声明位于 os/unix/ngx_os.h extern ngx_int_t ngx_max_sockets; 定义在 os/unix/ngx_posix_init.c ngx_int_t ngx_max_sockets; ngx_max_sockets 定义了 Nginx 能够同时使用的最大 Socket 文件描述符数量。它…...
Spring Boot接入Deep Seek的API
1,首先进入deepseek的官网:DeepSeek | 深度求索,单击右上角的API开放平台。 2,单击API keys,创建一个API,创建完成务必复制!!不然关掉之后会看不看api key!!&…...
大语言模型实践——基于现有API的二次开发
基于现有的API平台做一些实用的AI小应用。 API服务商:阿里云百炼 云服务器:阿里云(2核2GB) 部署框架:gradio 调用框架:openai 语言:Python (注:若搭建网站或API接口…...
ChunkKV:优化 KV 缓存压缩,让 LLM 长文本推理更高效
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
深入探究 Go 语言中的 Fx 框架:依赖注入的强大工具
在软件开发中,依赖注入(Dependency Injection,简称 DI)是一种重要的设计模式,它可以帮助我们降低代码的耦合度,提高代码的可测试性和可维护性。Go 语言作为一门高效、简洁的编程语言,拥有许多优…...
用 DeepSeek + Kimi 自动做 PPT,效率起飞
以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤: 利用 DeepSeek 生成 PPT 内容: 访问 DeepSeek 官网,完成注册/登录后进入对话界面。输入指令,例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲,需包…...
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java若依vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战 项目背景 本项目经费43000元,需求文档如下,工期25天,目前已经过了8天,时间不多了&#x…...
【C++】异常
前言 本篇博客我们来看下C有关异常的处理,了解下异常有关的知识 💓 个人主页:小张同学zkf ⏩ 文章专栏:C 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 目录 1.异常的概念及使用 1.1异…...
Meta AI 最近推出了一款全新的机器学习框架ParetoQ,专门用于大型语言模型的4-bit 以下量化
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
金融资产配置
不要放在一个篮子里也不要放在太多篮子里: 尽量放在不相关的行业实现风险对冲 金融资产从风险类别上主要可以分为三类: 进攻型资产、稳定型资产和防守型资产 进攻型资产包括原油、股票、一级市场股权投资等 稳定型资产包括信托、理财、国债等 防守…...
(done) openMP学习 (Day14: 总结)
url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#23-%E5%8F%AF%E6%80%95%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Batomicsflushpairwise%E5%90%8C%E6%AD%A5%20 新手并行程序员与专家并行程序员之间的区别是专家have a collection…...
音频进阶学习十一——离散傅里叶级数DFS
文章目录 前言一、傅里叶级数1.定义2.周期信号序列3.表达式DFSIDFS参数含义 4.DFS公式解析1)右边解析 T T T、 f f f、 ω \omega ω的关系求和公式N的释义求和公式K的释义 e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn)的释义 ∑ n 0 N − 1 e…...
ssm的心得
spring是一个轻量级的ioc(控制反转)和aop(面向切面编程)容器框架,它可以管理和配置应用中的各种bean(对象),实现bean之间的依赖注入,以及提供事务管理、缓存、测试等功能…...
14vue3实战-----获取用户信息和用户的菜单树信息
14vue3实战-----获取用户信息和用户的菜单树信息 1.获取用户信息1.1封装接口1.2优化 2.获取用户的菜单树信息 1.获取用户信息 1.1封装接口 后端有根据id获取用户信息的接口,前端需要把该接口封装一下: service/login/login.ts: import hyRequest from…...
shell脚本学习笔记
Shell脚本学习笔记 参考资料:https://www.runoob.com/linux/linux-shell-passing-arguments.html 文章目录 Shell脚本学习笔记一、什么是Shell1.1、定义1.2、注释 二、Shell变量2.1、规则2.2、变量类型2.2.1、字符串2.2.2、整数2.2.3、数组2.2.4、环境变量2.2.5、特…...
Java中的线程池及其应用场景有哪些?
Java中的线程池是一种高效的并发编程机制,通过复用线程来管理任务的执行,从而提高资源利用率和系统性能。 本文将详细探讨Java线程池的概念、类型、应用场景以及实际代码示例,帮助读者全面理解线程池的使用方法及其在实际开发中的重要性。 …...
13.6 基于 LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍
LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍 关键词:LangChain 架构优化, 模块解耦, 翻译系统设计模式, 可扩展翻译框架, 多模型管理 1. 原架构痛点分析 问题维度原实现缺陷LangChain 优化方案大模型耦合直接调用 OpenAI API,切换模型需改代码…...
构建基于 SSE 协议通信的 MCP Server 和 Client
在之前的系列教程中,我们编写的 MCP 服务器与 MCP 客户端是通过 **stdio(Standard Input/Output,标准输入输出)**来进行交互的。客户端通过启动服务器子进程,并利用标准输入(stdin)和标准输出&a…...
Docker、Ollama、Dify 及 DeepSeek 安装配置与搭建企业级本地私有化知识库实践
在现代企业中,管理和快速访问知识库是提升工作效率、促进创新的关键。为了满足这些需求,企业越来越倾向于构建本地私有化的知识库系统,这样可以更好地保护企业数据的安全性和隐私性。本文将介绍如何利用 **Docker**、**Ollama**、**Dify** 和…...
第3章 使用 Vue 脚手架
第3章 使用 Vue 脚手架 3.1 初始化脚手架3.1.1 说明3.1.2. 具体步骤3.1.3 分析脚手架结构1 总结2 细节分析1 配置文件2 src文件1 文件结构分析2 例子 3 public文件4 最终效果 3.2 ref属性3.3 props配置项3.4 mixin混入3.5 插件3.6 scoped样式3.7 Todo-list 案例3.7.1 组件化编码…...
MySQL第五次作业
根据图片内容完成作业 1.建表 (1)建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…...