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 实现前后端无刷新交互 引言 创新实践项目二…...

高级java每日一道面试题-2024年10月18日-JVM篇-说下你对G1垃圾收集器的理解?
如果有遗漏,评论区告诉我进行补充 面试官: 说下你对G1垃圾收集器的理解? 我回答: 在Java高级面试中,G1垃圾收集器是一个经常被提及的话题。以下是对G1垃圾收集器的详细解析: G1垃圾收集器的概述 G1(Garbage-First)垃圾收集器…...

2024系统架构师---湖仓一体架构论文知识点
湖仓一体架构深度解析:构建企业级数据管理与分析的新基石 在当今数据驱动的时代,企业对于数据的管理与分析需求日益复杂。传统的数据仓库与数据湖架构虽各有优势,但单独使用时往往难以满足企业的全面需求。湖仓一体(Lakehouse&am…...

Unity性能优化
前言 当游戏开发使用传统的OPP(面向对象编程)面对大量的Game object时FPS会显著降低,而使用Dots(面向数据编程)性能依旧很好 计算机内存基础 CPU自身有三级高速缓存,L1,L2,L3,其中CPU访问(L1…...

MyHdfs代码分享
关于hdfs协议层相关的的解析已经比较全面,但是大多的分析停留在理论层面。为此笔者通过对hadoop源码的整理,完成了myhdfs项目。此项目有个特点是不依赖于任何hadoop的maven包,但却可以作为原生的hadoop客户端的server。项目暂时已经完成了rpc…...

Java网络编程-简单的API调用
Get请求 - 无参数 安装依赖库 首先需要安装一个库: Okhttp3,这是一个非常流行的 HTTP 库,可以简单、快速的实现 HTTP 调用。 安装 Okhttp3 的方式是在 pom.xml 文件中增加依赖: <!-- https://mvnrepository.com/artifact/c…...

论文笔记(五十)Segmentation-driven 6D Object Pose Estimation
Segmentation-driven 6D Object Pose Estimation 文章概括摘要1. 引言2. 相关工作3. 方法3.1 网络架构3.2 分割流3.3 回归流3.4 推理策略 4. 实验4.1 评估 Occluded-LINEMOD4.1.1 与最先进技术的比较4.1.2 不同融合策略的比较4.1.3 与人体姿态方法的比较 4.2 在YCB-Video上的评…...

微服务的一些基本概念
目录 1 概述1.1 微服务架构的特征1.2 微服务架构示例 2 微服务与单体式架构2.1 什么是单体式架构?2.2 单体式架构的优点2.3 单体式架构的缺点 3 什么是微服务?3.1 微服务的优点3.2 微服务的缺点 4 如何构建微服务4.1 从单体式开始4.2 以正确的方式组织团…...

el-table修改指定列字体颜色 ,覆盖划过行的高亮显示文字颜色
修改指定列字体颜色 ,覆盖划过行的高亮显示文字颜色 代码如下: <div class"c1"><el-table:data"tableData"striperow-class-name"custom-table-row"style"width:100%"cell-mouse-enter"lightFn"cell-…...

java高频面试题汇总
Java 基础 Java 中的序列化和反序列化是什么? 序列化是将 Java 对象转换为字节流的过程,以便可以将其存储在文件中或通过网络进行传输。反序列化则是将字节流恢复为 Java 对象的过程。通过实现 Serializable 接口,Java 对象可以支持序列化。…...

Docker安装ocserv教程(效果极佳)
本章教程,介绍如何在Debain系统上安装ocserv。安装方式是使用Docker方式部署。 一、安装Docker curl -sSL https://file.ewbang.com/docker/debian/install_docker.sh -o install_docker.sh && bash install_docker.sh二、拉取镜像 docker pull tommylau/ocserv...