JS | 详解图片懒加载的6种实现方案
一、什么是懒加载?
懒加载是一种对网页性能优化的方式,比如,当访问一个网页的时候,优先显示可视区域的图片而不是一次加载全部的图片,当需要显示时,再发送请求加载图片。
懒加载 :延迟加载,对于一个很长的页面,优先加载可视区域的内容,其他部分等进入可视区域时再加载。
二、为什么要懒加载?
懒加载是一种网页性能优化的方式,它能极大的提升用户体验。比如一个页面中有很多图片,但是首屏只出现几张,这时如果一次性把图片全部加载出来会影响性能。这时可以使用懒加载,页面滚动到可视区再加载。优化首屏加载。
一次性加载全部图片的话,一方面会影响用户体验;另一方面浪费用户的流量,有些用户并不想全部看完,全部加载会耗费大量流量。 而使用图片懒加载就会使页面加载速度快,减轻服务器压力,节约流量,用户体验好。
当页面需要展示大量图片时,如果一次性渲染所有图片,会向服务器发出大量请求,导致服务器响应慢,出现页面卡顿或崩溃等问题。采用懒加载技术只预先加载可视区内的图片,当滚动到其他位置时,才去加载这块区域的图片,也可以使用比较小的loading图片进行占位,有效减轻服务器的压力,加速页面渲染,提高用户体验。
小结——懒加载优点:
- 避免首次加载时消耗大量时间,降低页面渲染速度,造成卡顿现象。
- 按需加载,避免无效图片的加载,减轻服务器压力,节约网络资源。
三、图片懒加载的实现原理
- 基本原理: 监听图片是否位于页面的可视区域内,若在则加载图片,不在则不加载图片
- 实现方案: 自定义属性-将图片真实地址 url 存储在自定义属性中,当监听到图片进入可视区 域 时,将自定义属性值赋值给 img 的 src 属性
四、图片懒加载实现方式
图像是页面的一部分,它会提前开始加载。一旦浏览器在源代码中看到它们,就会提示下载。即使图像被隐藏,即使它位于一个非常长的页面的底部,也会提前加载。
3.1 方案一:设置 img 标签属性 loading=“lazy”
设置 loading="lazy"允许浏览器,延迟加载屏幕外图像 img 和 iframe,直到用户滚动到它们附近。
loading属性支持下面这几个值:
① lazy:图片或框架懒加载,也就是元素资源快要被看到的时候加载。
② eager:图片或框架无视一切进行加载。
③ auto:默认值。
图片或框架基于浏览器自己的策略进行加载。如果HTMLImageElement或者HTMLIFrameElement元素没有显式地设置loading属性或者loading属性的值不合法,则都被当作’auto’处理。
<img src="" loading="lazy"/>
<iframe src="" loading="lazy"/>
- Lazy loading加载数量与屏幕高度有关,高度越小加载数量越少,但并不是线性关系。
- Lazy loading加载数量与网速有关,网速越慢,加载数量越多,但并不是线性关系。
- 滚动即会触发图片懒加载,而不是滚动一屏后再去加载。
- 窗口resize尺寸变化也会触发图片懒加载,当屏幕高度从小变大的时候。
3.1.1 loading 属性的兼容
loading 属性的兼容性如下:
3.1.2 如何判断当前浏览器是否支持loading=”lazy”?
下面三种方法都可以:
var isSupportLoading = 'loading' in document.createElement('img');
var isSupportLoading = 'loading' in new Image();
var isSupportLoading = 'loading' in HTMLImageElement.prototype;
例:您可以通过检查HTMLImageElement.prototype
上是否存在loading
属性来判断当前浏览器是否支持loading="lazy"
特性。以下是一个简单的JavaScript代码示例:
function isLazyLoadingSupported() {// 检查'loading'属性是否在HTMLImageElement.prototype上定义return 'loading' in HTMLImageElement.prototype;
}if (isLazyLoadingSupported()) {console.log('Lazy loading is supported.');
} else {console.log('Lazy loading is not supported.');
}
如果isLazyLoadingSupported()
函数返回true
,则当前浏览器支持loading="lazy"
;如果返回false
,则不支持。
3.1.3. 如何获取loading属性值
var attrLoading = img.loading;
如果浏览器并不支持原生的loading懒加载,则会返回undefined,例如在Firefox浏览器下
3.2 方案二:利用JS监听scroll滚动事件
3.2.1. 实现原理
监听scroll事件,获取 img 元素相对于视口的顶点位置 el.getBoundingClientRect().top,只要这个值小于浏览器的高度 window.innerHeight 就说明进入可视区域,当图片进入可视区域时再去加载图片资源。
图片刚开始显示的是默认图片,当进入可视区域时,用 data-src 的真实图片地址赋值给 src。
3.2.2. 实现方案
① 首先给图片一个占位资源:
<img src="default.jpg" data-src="http://www.xxx.com/target.jpg" />
② clientHeight、scrollTop 和 offsetTop
属性介绍
获得浏览器窗口(视口)大小: 2组:
1、获取文档显示区 / 网页可见区域大小
① 对于Internet Explorer9+、Chrome、Firefox、Opera 以及 Safari
window.innerWidth、window.innerHeight | Window innerWidth 与 innerHeight 属性 | 参考手册
window.innertHeight : 浏览器窗口的内部高度
- A 表示window的内部高度,包含border、padding、margin以及水平滚动条的高度
- B 语法:window.innertHeight
window.innerWidth: 浏览器窗口的内部宽度
- A 表示window的内部宽度,包括 border、padding、margin以及垂直滚动条的宽度
- B 语法:window.innerWidth
② 对于 Internet Explorer 8、7、6、5
element.clientHeight、element.clientWidth
document.body.clientHeight : 表示的是<body>元素的内容区域高度
- A 表示的是<body>元素的内容区域高度,包含padding 不包含 border 和 margin以及水平滚动条的高度
- B 语法:element.clientHeight
document.body.clientWidth : 表示的是<body>元素的内容区域宽度
- A 表示的是<body>元素的内容区域宽度,包含padding 不包含 border 和 margin以及垂直滚动条的宽度
- B 语法:document.body.clientWidth
或者
document.documentElement.clientHeight:表示的是整个视口的高度
- A 表示的是整个视口的高度,即整个网页的可视区域高度,包含padding 不包含 border 和 margin以及水平滚动条的高度
- B 语法:document.documentElement.clientHeight
document.documentElement.clientWidth:表示的是整个视口的宽度
- A 表示的是整个视口的宽度,即整个网页的可视区域宽度,包含padding 不包含 border 和 margin以及垂直滚动条的宽度
- B 语法:document.documentElement.clientWidth
参考:JS | 深入理解客户区尺寸client
✔ 实用的获取页面大小的浏览器兼容性JavaScript 方案(涵盖所有浏览器):
var w=window.innerWidth || document.documentElement.clientWidth
|| document.body.clientWidth;var h=window.innerHeight || document.documentElement.clientHeight
|| document.body.clientHeight;
补:document.documentElement.clientHeight与document.body.clientHeight的主要区别在于它们代表的网页区域不同。
- document.documentElement.clientHeight 表示的是整个视口的高度,即整个网页的可视区域高度。它包括了padding但排除了border、水平滚动条和margin的高度。
- document.body.clientHeight 表示的是<body>元素的内容区域高度,通常不包括滚动条的高度。如果<body>元素没有设置高度或者其高度小于其内部内容的高度,则可能会显示不全。
影响这两个属性值的主要因素包括:
- CSS设置:如果<body>元素的CSS高度被设置为100%,并且包含了所有的内容高度,那么document.body.clientHeight将反映整个视口的高度。相反,如果<html>元素的CSS高度被设置为100%,而<body>元素的高度未明确设置,那么document.documentElement.clientHeight将反映整个视口的高度,而document.body.clientHeight可能为0或小于视口高度。
- DOCTYPE声明:缺少DOCTYPE声明可能会导致document.documentElement.clientHeight为0,因为浏览器可能无法正确解析文档类型,从而影响元素的默认显示和尺寸计算。
实际应用中的注意事项:
- 在开发过程中,应注意DOCTYPE的声明和CSS的设置,以确保页面布局的正确显示。如果需要获取整个视口的高度,应使用document.documentElement.clientHeight;如果需要获取<body>元素的内容高度,应确保<body>元素的CSS高度设置正确。
- 在调试页面布局时,可以使用浏览器的开发者工具查看这些属性的值,帮助定位问题所在
参考:document.documentElement.clientHeight与document.body.clientHeight的区别-CSDN博客
补:document.body.clientWidth和window.innerWidth的主要区别在于是否包含滚动条和边框。
document.body.clientWidth
表示浏览器窗口中文档主体部分的视口宽度,这个值包括了文档主体的内容区域宽度,但不包括滚动条的宽度。如果文档主体有边框,这个值也不包括边框的宽度。相反,window.innerWidth
表示浏览器窗口的内视口宽度,这个值包括了视口内部的全部宽度,即包括了滚动条的宽度(如果存在的话)。
此外,document.body.clientWidth
和window.innerWidth
的区别还受到
文档模式的影响。在混杂模式(BackCompat)下,document.body.clientWidth
和window.innerWidth
的值可能不同,因为混杂模式下文档主体的宽度计算不包括滚动条。而在标准模式(CSS1Compat)下,两者的值通常是相同的,因为此时文档的宽度计算包括了滚动条
2、完整窗口大小: window.outerWidth window.outerHeight
offsetTop : 距离父级元素顶部的高度
- A 表示当前元素相对于其offsetParent元素的顶部内边距的距离
- B 语法:element.offsetTop
scrollTop : 网页被卷去的距离
A 表示在有滚动条时,滚动条向下滚动的距离也就是元素顶部被遮住部分的高度
B 语法:element.scrollTop
③ 接着,通过监听 scroll 事件来判断图片是否到达视口
let img = document.getElementsByTagName("img");
let num = img.length;
let count = 0; //存储图片加载到的位置,避免每次都从第一张图片开始遍历lazyload(); // 首次加载别忘了显示图片window.addEventListener('scroll', throttle(lazyload, 200)); // throttle是节流函数,自己实现一下//offsetTop是元素与offsetParent的距离,循环获取直到页面顶部
function getTop(el) {var T = el.offsetTop;while(el = el.offsetParent) {T += el.offsetTop;}return T;
}function lazyload() {let viewHeight = document.documentElement.clientHeight || document.body.clientHeight;//视口高度let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;//滚动条卷去的高度for(let i = count; i <num; i++) {// 元素现在已经出现在视口中if(getTop(img[i]) < scrollTop + viewHeight) {if(img[i].getAttribute("src") !== "default.jpg") continue;img[i].src = img[i].getAttribute("data-src");count ++;} else {break; // 提早退出}}
}
offsetParent 就是距离该子元素最近的进行过定位的父元素(position:absolute或relative 或fixed),如果其父元素中不存在定位,则offsetParent为:body元素
参考:JS | JS之元素偏移量 offset 系列属性详解
●小结:用JS监测这个方式主要是利用整体距离实现
(1)属性介绍:参看上面
(2)实现方法
可以用image.offsetTop <= document.documentElement.clientHeight + document.documentElement.scrollTop 判断图片是否可以在可视区域内。即判断图像的offsetTop(距离顶部的高度)- scrollTop(页面被卷去的高度)<=window.innerHeight(可视区高度)才加载
- 图片元素位置的顶部距离:offsetTop
- 滚动距离的最下端:scrollTop+clientHeight
// html 标签结构<img data-src="./public/image/VCG211430870249.jpg" src="./public/image/默认.jpg" alt=""><img data-src="./public/image/VCG211430987515.jpg" src="./public/image/默认.jpg" alt=""><img data-src="./public/image/VCG211431054751.jpg" src="./public/image/默认.jpg" alt=""><img data-src="./public/image/VCG211435102490.jpg" src="./public/image/默认.jpg" alt=""><img data-src="./public/image/VCG211438229829.jpg" src="./public/image/默认.jpg" alt=""><img data-src="./public/image/VCG211438109615.jpg" src="./public/image/默认.jpg" alt="">
<script>// 1 获取全部图片的DOM节点// 注意:querySelectorAll 值为伪数组利用扩展运算符转为真数组const images = [...document.querySelectorAll('img')]// 2 监听页面滚动事件window.addEventListener('scroll', lazyLoad)// 3 定义页面滚动的处理函数function lazyload(e) {// 3.1 获取屏幕的可视高度const clientHeight = document.documentElement.clientHeight// 3.2 获取屏幕的滚动距离const scrollTop = document.documentElement.scrollTopfor (let i = 0; i < images.length; i++) {if (images[i].offsetTop < clientHeight + scrollTop) {images[i].setAttribute('src', images[i].getAttribute('data-src'))}}}
</script>
3.3 方案三:利用元素的 getBoundingClientRect 方法实现
getBoundingClientRect() 方法返回元素相对视口左上角的偏移量以及元素本身长宽,单位:px。
修改上述 lazyload 函数
function lazyload() {let viewHeight = document.documentElement.clientHeight || document.body.clientHeight;for (let i = count; i < num; i++) {// 元素现在已经出现在视口中if (img[i].getBoundingClientRect().top < viewHeight) {if (img[i].getAttribute("src") !== "default.jpg") continue;img[i].src = img[i].getAttribute("data-src");count++;} else {break;}}
}
小结:我们再来举个例子,总结一下利用getBoundingClientRect 方法实现图片懒加载。
参考:JS | JS中的getBoundingClientRect()方法详解,秒懂!
(1)属性介绍:
利用 getBoundingClientRect()方法
实时获取物体的动态位置
(2)实现方法:
步骤 1:监听页面滚动事件,lazyLoad
为页面滚动时的处理函数,在本节为处理图片懒加载。
window.addEventListener('scroll', lazyLoad)
步骤 2:判断图片是否处于可视区域内
参考:JS代码如何利用getBoundingClientRect方法实现图片懒加载 – PingCode
(1)若距离顶部top(或bottom)小于页面的整体高度window.innerHeight
(2)若距离左侧left(或右侧right)小于页面的整体宽度window.innerWidth
(3)同时图片的底部bottom (或顶部top) 与图片的右侧right(左侧left)距页面顶部、左侧的距离均大于0,则说明该图在屏幕的可视区域内。
为了提高复用性,我们可以将它封装成一个自定义函数isVisible
,将每张图片作为参数传入该函数,并返回true
或false
// 可视区域判断函数function isVisible(img) {// 判断是否在可视区域,并返回true或falseconst imgRect = img.getBoundingClientRect() // getBoundingClientRect 获取图片的动态信息return imgRect.bottom > 0 && imgRect.top < (window.innerHeight|| document.documentElement.clientHeight) && imgRect.right > 0 && imgRect.left < (window.innerWidth||document.documentElement.clientWidth)}
步骤 3:定义图片懒加载时的处理事件,监听所有的img
,判断该img
是否处于可视范围内。
querySelectorAll
获取的元素为类数组对象,需要转为真数组,否则无法使用数组的某些方法
// 获取所有的img元素,并利用扩展运算符转为真数组
const images = [...document.querySelectorAll('img')]
步骤 4:对每张图片进行监听,利用自定义函数isVisible判断是否在可视区域内
(1)若处于可视区域:将自定义的data-src值,赋值给真正的src属性值,其中 data-src存储图片的URL地址,并删除该元素防止重复加载
(2)若不处于可视区域:return 不做处理
// 利用循环判断每张图片是否属于可视区域
function lazyLoad(){for (let i = 0; i < images.length; i++) {// isVisible是否该图片位于可视区域 返回true 或falseif (isVisible(images[i])) {// 将元素的自定义属性 data-src 赋值给元素的 src 属性// 等价于:img.setAttribute('src', img.getAttribute('data-src'))images[i].src = images[i].dataset.src // 防止重复被遍历 加载完之后 删除元素不再加载images.splice(i, 1)i--}}
}
lazyLoad()
getBoundingClientRect()方法的缺点:这个属性频繁计算会引发页面的重绘,可能会对页面的性能造成影响。
3.4. 方案四:IntersectionObserver
有兼容性问题。这是浏览器内置的一个API,实现了监听window的scroll事件、判断是否在视口中以及节流三大功能。
let img = document.getElementsByTagName("img");const observer = new IntersectionObserver(changes => {//changes 是被观察的元素集合for(let i = 0, len = changes.length; i < len; i++) {let change = changes[i];// 通过这个属性判断是否在视口中if(change.isIntersecting) {const imgElement = change.target;imgElement.src = imgElement.getAttribute("data-src");observer.unobserve(imgElement);}}
})
Array.from(img).forEach(item => observer.observe(item));
这样就很方便地实现了图片懒加载,当然这个IntersectionObserver也可以用作其他资源的预加载,功能非常强大。原文链接:https://blog.csdn.net/qq_44741577/article/details/139324747
小结:关于IntersectionObserver
Intersection Observer
是一个比较新的api,他允许你追踪目标元素与其祖先元素或视窗的交叉状态,用他来检测图片是否进入视口非常方便,不用再像之前绑定事件、计算距离等。
(1)属性介绍:
- 利用Intersection Observer实例上的observe和unobserve方法,注册或取消监听事件。
- 利用isIntersecting方法,判断该图片是否处于图片与屏幕可视区域的交叉范围内。
- 注意:Intersection Observer实例会监听交叉状态,即出现和消失(触发两次),出现交叉状态后会去调用new的时候传入的callback回调函数
(2)实现方法:
步骤 1: 监听页面滚动事件,lazyLoad
为页面滚动时的处理函数,在本节为处理图片懒加载。
window.addEventListener('scroll', lazyLoad)
步骤 2: 创建图片与可视区域交叉实例
callback
:
- 此为传入的回调函数,用于当处于交叉状态改变时进行的处理函数
- 该函数会被触发2次:图片进入视野时+图片离开视野时
const observer = new IntersectionObserver(callback)
步骤 3: 利用observer
实例上的.observe(img)
方法,给每张图片绑定观察事件
// 给每一个图片绑定观察方法imagess.forEach(img => {// 图片进入视野+离开视野时会触发callback回调函数observer.observe(img)})
步骤 4: 定义图片的懒加载事件
imgArr
:
- 可以获得包含所有图片的
isIntersecting
属性的集合,该属性可判断是否在交叉区域内 target
为该图片的标签元素
// callback 接收的参数为带有监听所有图片交叉属性的集合
const callback = (imgArr) => {console.log("视图交叉时触发,离开交叉时也触发", imgArr);imgArr.forEach((e) => {// 判断是否在视野区域if (e.isIntersecting) {e.target.src = e.target.dataset.src;// 取消监听,避免重复加载同一张图片observer.unobserve(e.target);}});
};
(3)完整代码:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><img data-src="./public/image/VCG211430870249.jpg" src="./public/image/默认.jpg" alt="" /><img data-src="./public/image/VCG211430987515.jpg" src="./public/image/默认.jpg" alt="" /><img data-src="./public/image/VCG211431054751.jpg" src="./public/image/默认.jpg" alt="" /><img data-src="./public/image/VCG211435102490.jpg" src="./public/image/默认.jpg" alt="" /><img data-src="./public/image/VCG211438229829.jpg" src="./public/image/默认.jpg" alt="" /><img data-src="./public/image/VCG211438109615.jpg" src="./public/image/默认.jpg" alt="" /><script>// intersectionObserver 交叉观察 : 目标元素和可视窗口会产生交叉区域const imagess = [...document.querySelectorAll("img")];// 2.1 创建视觉交叉的观察实例const observer = new IntersectionObserver(callback);// 2.2 给每一个图片绑定观察方法imagess.forEach((img) => {// 2.3 图片进入视野+离开视野时触发 - 回调observer.observe(img);});// callback 接收的参数为带有监听所有图片交叉属性的集合const callback = (imgArr) => {console.log("视图交叉时触发,离开交叉时也触发", imgArr);imgArr.forEach((e) => {// 判断是否在视野区域if (e.isIntersecting) {e.target.src = e.target.dataset.src;// 取消观察追踪,避免重复加载同一张图片observer.unobserve(e.target);}});};</script></body>
</html>
参考:JS | 图片懒加载之交叉观察器IntersectionObserver API 手把手教学 - 烤地瓜的CSDN博客
3.5 方案五:利用element-ui 的<el-image>组件的lazy属性开启懒加载功能
使用element-ui 的<el-image v-for="url in urls" :key="url" :src="url" lazy></el-iamge>可通过lazy开启懒加载功能,当图片滚动到可视范围内才会加载。
具体实现代码:element-ui的 <el-image> Element - The world's most popular Vue UI framework
<div class="demo-image__lazy"><el-image v-for="url in urls" :key="url" :src="url" lazy></el-image>
</div><script>export default {data() {return {urls: ['https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg','https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg','https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg','https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg','https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg','https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg','https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg']}}}
</script>
3.6 方案六:使用vue-lazyLoad插件实现
使用vue-lazyLoad插件实现,安装【npm i vue-lazyload -S】,main.ts中进行注册
//main.ts
import VueLazyload from 'vue-lazyload'
app.use(VueLazyload,{preLoad: 1.3, //预加载的宽高比loading: loadimage:"./assets/vue.svg", //图片加载状态下显示的图片// error: "", //图片加载失败时显示的图片attempt: 1, // 加载错误后最大尝试次数
})
页面中通过v-lazy使用
//xx.vue
<template><div><div v-for="item in arr" :key="item"><img v-lazy="item" width="600" height="200" alt="" /></div></div>
</template><script lang="ts" setup>
//glob是懒加载模式,globEager静态加载
let imageList: Record<string, { default: string }> = import.meta.glob("../assets/images/*.*",{ eager: true }
);
let arr = Object.values(imageList).map((v) => v.default);
</script><style lang="scss" scoped></style>
使用vite的两种文件导入方式
- 【import.meta.glob("/xx")】方式 为懒加载模式,动态导入,构建时,会分离为独立的 chunk,该方式导入使用()=>import("/xx"),跟路由懒加载是一样的导入方式。
- 【import.meta.globEager("/xx")】以及【import.meta.glob("/xx",{eager:true})】为静态加载
打印imageList如图
● 参考资料 ●
实现图片懒加载的5种方式-CSDN博客 | JS实现图片懒加载的三种常用方法总结-CSDN博客
图片懒加载🔥三种实现方案 _ 掘金 | JS代码如何实现图片懒加载 – PingCode
如何使用HTML、CSS和jQuery实现图片懒加载的进阶技巧-js教程-PHP中文网
JS | JS中的getBoundingClientRect()方法详解,秒懂!- 烤地瓜的CSDN博客
JS | 图片懒加载之IntersectionObserver API 手把手教学 - 烤地瓜的CSDN博客
相关文章:

JS | 详解图片懒加载的6种实现方案
一、什么是懒加载? 懒加载是一种对网页性能优化的方式,比如,当访问一个网页的时候,优先显示可视区域的图片而不是一次加载全部的图片,当需要显示时,再发送请求加载图片。 懒加载 :延迟加载&…...

Java | Leetcode Java题解之第502题IPO
题目: 题解: class Solution {public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {int n profits.length;int curr 0;int[][] arr new int[n][2];for (int i 0; i < n; i) {arr[i][0] capital[i];arr[i][1] profi…...

JavaWeb学习(3)
目录 一、9大内置对象 二、JavaBean 三、MVC三层架构 Model View Controller(Servlet) 四、Filter(过滤器) 应用一:处理中文乱码 应用二:登录验证 五、监听器 六、JDBC 一、9大内置对象 PageCont…...

【含开题报告+文档+PPT+源码】基于SpringBoot的百货商城管理系统的设计与实现
开题报告 随着互联网技术的快速发展和电子商务的兴起,网上购物已成为人们日常生活中不可或缺的一部分。传统的实体店面由于时间和空间的限制,无法满足消费者对于便捷、快速、个性化购物体验的需求。在此背景下,基于 Java 的网上商城系统应运…...
Elasticsearch 实战应用与优化策略研究
一、引言 1.1 研究背景 在当今大数据时代,数据量呈爆炸式增长,对数据的存储、检索和分析提出了更高的要求。Elasticsearch 作为一款强大的分布式搜索和分析引擎,在这个时代背景下显得尤为重要。 随着数据密集型应用场景的不断增加…...

植物大战僵尸杂交版游戏分享
植物大战僵尸杂交版游戏下载:夸克网盘分享 无捆绑之类的隐形消费,下载即玩...
ProteinMPNN中DecLayer类介绍
PositionWiseFeedForward 类的代码 class PositionWiseFeedForward(nn.Module):def __init__(self, num_hidden, num_ff):super(PositionWiseFeedForward, self).__init__()self.W_in = nn.Linear(num_hidden, num_ff, bias=True)self.W_out = nn.Linear(num_ff, num_hidden, …...

Flux.all 使用说明书
all public final Mono<Boolean> all(Predicate<? super T> predicate)Emit a single boolean true if all values of this sequence match the Predicate. 如果该序列中的所有值都匹配给定的谓词(Predicate),则发出一个布尔值…...

DORA 机器人中间件学习教程(6)——激光点云预处理
文章目录 1 移植思路2 代码输入输出说明3 编写CmakeList.txt文件4 编写yml文件5 编译并启动节点参考资料 在DORA中通过驱动获取激光雷达数据后,激光点云预处理部分代码是参考了autoware官方代码并对其进行裁剪得到的,点云预处理主要包含三个节点…...
搜维尔科技:TechViz将您的协同项目评审提升到一个全新的高度
TechViz将您的协同项目评审提升到一个全新的高度 搜维尔科技: TechViz将您的协同项目评审提升到一个全新的高度...

Dinky 字段模式演变 PIPELINE 同步MySQL到Doris
背景 用Dinky数据平台 FlinkCDC收集Mysql BinLog 至 Doris 搭建实时数仓 问题 用Dinky CDCSOURCE 字段模式演变 整库同步Mysql到Doris 字段新增删除不生效 组件信息 Flink 1.17 FlinkCDC 3.1 dinky 1.1 Doris 2.1.6 Mysql 8.0Dinky MySQLCDC 整库到 Doris需要的依赖 Flink/…...

【Docker】Harbor 私有仓库和管理
目录 一、搭建本地私有仓库 二、harbor简介(特性、构成、架构的数据流向) 2.1 什么是Harbor 2.2 Harbor的特性 2.3 Harbor的构成 2.4 Harbor的工作原理(运行流程) 三、harbor部署以及配置文件 1. 部署 Docker-Compose 服…...

《重置MobaXterm密码并连接Linux虚拟机的完整操作指南》
目录 引言 一、双击MobaXterm_Personal_24.2进入,但是忘记密码。 那么接下来请跟着我操作。 二、点击此链接,重设密码。 三、下载完成后,现在把这个exe文件解压。注意解压要与MobaXterm_Personal_24.2.exe在同一目录下哦,不然…...

每天五分钟深度学习:逻辑回归和神经网络
本文重点 我们要开启深度学习的基础神经网络的学习进程了,但是在开启之前,我们先来回忆一下逻辑回归算法 逻辑回归 逻辑回归的前向传播公式为: 求出预测值a之后,进而求损失 以上就是逻辑回归模型,相信大家已经不是很陌生了,现在我们要学习神经网络了 神经网络和逻辑回…...

深度学习——线性神经网络(五、图像分类数据集——Fashion-MNIST数据集)
目录 5.1 读取数据集5.2 读取小批量5.3 整合所有组件 MNIST数据集是图像分类中广泛使用的数据集之一,但是作为基准数据集过于简单,在本小节将使用类似但更复杂的Fashion-MNIST数据集。 import torch import torchvision from torch.utils import data fr…...

音频声音怎么调大?将音频声音调大的几个简单方法
音频声音怎么调大?在现代生活中,音频内容无处不在,从在线课程和播客到音乐和电影,音频已经成为我们获取信息和娱乐的重要方式。然而,许多人在使用音频时可能会遇到一个常见问题:音频声音太小,无…...
C#的委托
方法一 private void button1_Click(object sender, EventArgs e) {// 启动后台线程 Thread backgroundThread new Thread(new ThreadStart(DoWork));backgroundThread.Start(); }private void DoWork() {// 模拟后台工作 Thread.Sleep(2000); // 等待2秒以模拟工作 // 更…...

软考(网工)——局域网和城域网
文章目录 🕐局域网基础1️⃣局域网和城域网体系架构 IEEE(负责链路层)2️⃣局域网拓扑结构 🕑CSMA/CD1️⃣CSMA/CD2️⃣CSMA/CD三种监听算法3️⃣冲突检测原理 🕒二进制指数退避算法1️⃣ 二进制指数退避算法 …...

MySQL 9从入门到性能优化-通用查询日志
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...

解码专业术语——应用系统开发项目中的专业词汇解读
文章目录 引言站点设置管理具体要求包括: Footer管理基于URL的权限控制利用数据连接池优化数据库操作什么是数据连接池?优化的优势 利用反射改造后端代码,AJAX反射的作用及其在后端代码中的应用AJAX 实现前后端无刷新交互 引言 创新实践项目二…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...