引言

在当今视觉驱动的网络环境中,图像和媒体资源往往占据了网页总下载量的60%-80%,因此对图像和媒体资源进行有效优化已成为前端性能提升的关键领域。尽管网络带宽持续提升,但用户对加载速度的期望也在不断提高,特别是在移动设备和网络条件不稳定的场景下。

本文作为JavaScript性能优化实战系列的第九篇,将深入探讨图像与媒体资源优化的各个方面,从现代图像格式选择、响应式图像加载、Canvas和WebGL渲染技巧,到视频流优化以及OffscreenCanvas的应用。我们将结合实际案例,为您提供实用且可立即应用的优化策略,助力提升您的Web应用性能。

现代图像格式选择与性能对比

图像是网页中最常见的资源类型之一,选择合适的图像格式对性能有着决定性影响。

主流图像格式性能对比

格式优势劣势最佳使用场景浏览器支持
JPEG压缩率高
兼容性好
有损压缩
不支持透明
照片、复杂色彩图像全面支持
PNG无损压缩
支持透明
文件较大需要透明度的图像
图标、简单图形
全面支持
GIF支持动画
兼容性好
色彩有限(256色)
压缩效率低
简单动画
图标
全面支持
WebP同时支持有损和无损
支持透明度和动画
比JPEG小25-34%
IE不支持几乎所有场景
替代JPEG/PNG
Chrome, Firefox, Edge, Safari 14+
AVIF比WebP小50%
更好的压缩率
编码速度慢
浏览器支持有限
静态图像
照片
Chrome, Firefox, Opera
SVG矢量格式
任意缩放不失真
文件小
不适合复杂图像
渲染成本高
图标、Logo
简单插图
全面支持

现代图像格式深入分析

WebP格式

WebP是由Google开发的图像格式,提供了优异的压缩性能。

// 使用JavaScript检测WebP支持
function checkWebPSupport() {return new Promise((resolve) => {const webpImage = new Image();webpImage.onload = () => { resolve(true); };webpImage.onerror = () => { resolve(false); };webpImage.src = 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoBAAEAAgA0JaQAA3AA/vv9UAA=';});
}// 根据浏览器支持提供相应格式
async function provideOptimalImageFormat() {const isWebPSupported = await checkWebPSupport();const imageUrl = isWebPSupported ? 'image.webp' : 'image.jpg';document.getElementById('hero-image').src = imageUrl;
}provideOptimalImageFormat();
AVIF格式

AVIF是基于AV1视频编解码器的图像格式,提供更好的压缩率和质量。

// 检测AVIF支持
function checkAVIFSupport() {return new Promise((resolve) => {const avifImage = new Image();avifImage.onload = () => { resolve(true); };avifImage.onerror = () => { resolve(false); };avifImage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=';});
}
根据场景智能选择格式

基于不同图像类型的特性,我们可以智能选择最佳格式:

// 根据图像内容和浏览器支持选择最佳格式
async function selectOptimalFormat(imageType, needsTransparency) {const supportsAVIF = await checkAVIFSupport();const supportsWebP = await checkWebPSupport();if (imageType === 'photo') {if (supportsAVIF) return 'avif';if (supportsWebP) return 'webp';return 'jpg';}if (imageType === 'graphic') {if (needsTransparency) {if (supportsAVIF) return 'avif';if (supportsWebP) return 'webp';return 'png';}return 'svg';}if (imageType === 'animation') {if (supportsWebP) return 'webp';return 'gif';}return 'jpg'; // 默认
}

图像转换与优化工具

选择合适的格式后,我们还需要对图像进行进一步的优化:

  1. sharp.js: 用于Node.js环境中高性能图像处理
  2. imagemin: 广泛使用的图像压缩工具,支持多种格式
  3. squoosh.app: Google提供的在线图像优化工具

以下是使用imagemin在构建流程中优化图像的示例:

// webpack.config.js中使用imagemin-webpack-plugin
const ImageminPlugin = require('imagemin-webpack-plugin').default;
const ImageminMozjpeg = require('imagemin-mozjpeg');
const ImageminPngquant = require('imagemin-pngquant');
const ImageminWebp = require('imagemin-webp');module.exports = {// ... 其他配置plugins: [new ImageminPlugin({test: /\.(jpe?g|png|gif|svg)$/i,pngquant: {quality: '65-80'},plugins: [ImageminMozjpeg({quality: 75,progressive: true}),ImageminWebp({ quality: 75 })]})]
};

图像格式性能测试与对比

下面展示了不同格式对同一图像的压缩效果对比:

图像原始大小JPEG (Q=80)WebP (Q=80)AVIF (Q=60)加载时间对比(3G网络)
风景照5.2MB820KB410KB205KBJPEG: 4.1s, WebP: 2.1s, AVIF: 1.1s
产品照3.8MB640KB320KB160KBJPEG: 3.2s, WebP: 1.6s, AVIF: 0.8s
图标集1.5MB不适用180KB90KBPNG: 1.8s, WebP: 0.9s, AVIF: 0.5s

关键发现:对于典型的图像内容,WebP比JPEG减少约50%的文件大小,而AVIF比WebP再减少约50%。这直接转化为加载时间的显著改善。

响应式图像加载与懒加载实现

在不同设备和网络条件下,我们需要为用户提供最适合其环境的图像资源,这就是响应式图像加载的核心思想。

响应式图像技术

使用srcset和sizes属性

HTML5提供了强大的响应式图像属性:

<img src="small.jpg" srcset="small.jpg 400w, medium.jpg 800w, large.jpg 1600w" sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1600px"alt="响应式图像示例">

这告诉浏览器:

  • 在窄屏设备(600px以下)上使用small.jpg (400px宽)
  • 在中等宽度设备(600px-1200px)上使用medium.jpg (800px宽)
  • 在宽屏设备(1200px以上)上使用large.jpg (1600px宽)
使用picture元素实现格式和分辨率响应
<picture><source media="(min-width: 1200px)" srcset="large.avif" type="image/avif"><source media="(min-width: 1200px)" srcset="large.webp" type="image/webp"><source media="(min-width: 1200px)" srcset="large.jpg"><source media="(min-width: 600px)" srcset="medium.avif" type="image/avif"><source media="(min-width: 600px)" srcset="medium.webp" type="image/webp"><source media="(min-width: 600px)" srcset="medium.jpg"><source srcset="small.avif" type="image/avif"><source srcset="small.webp" type="image/webp"><img src="small.jpg" alt="响应式图像示例">
</picture>

这个例子不仅根据屏幕宽度提供不同尺寸的图像,还根据浏览器支持提供不同的格式。

图像懒加载实现

图像懒加载是一种延迟加载视口外图像的技术,可以显著提升页面初始加载性能。

使用原生懒加载

现代浏览器支持原生的懒加载属性:

<img src="image.jpg" loading="lazy" alt="懒加载图像">
使用Intersection Observer API实现高级懒加载
// 自定义懒加载实现
function setupLazyLoading() {const images = document.querySelectorAll('.lazy-image');if ('IntersectionObserver' in window) {const imageObserver = new IntersectionObserver((entries) => {entries.forEach(entry => {if (entry.isIntersecting) {const image = entry.target;const src = image.dataset.src;const srcset = image.dataset.srcset;if (src) image.src = src;if (srcset) image.srcset = srcset;image.classList.remove('lazy-image');imageObserver.unobserve(image);}});});images.forEach(image => imageObserver.observe(image));} else {// 回退方案,使用滚动事件监听let lazyloadThrottleTimeout;function lazyload() {if (lazyloadThrottleTimeout) {clearTimeout(lazyloadThrottleTimeout);}lazyloadThrottleTimeout = setTimeout(() => {const scrollTop = window.pageYOffset;images.forEach(image => {if (image.offsetTop < window.innerHeight + scrollTop) {if (image.dataset.src) image.src = image.dataset.src;if (image.dataset.srcset) image.srcset = image.dataset.srcset;image.classList.remove('lazy-image');}});if (images.length === 0) {document.removeEventListener('scroll', lazyload);window.removeEventListener('resize', lazyload);window.removeEventListener('orientationChange', lazyload);}}, 20);}document.addEventListener('scroll', lazyload);window.addEventListener('resize', lazyload);window.addEventListener('orientationChange', lazyload);}
}document.addEventListener('DOMContentLoaded', setupLazyLoading);
渐进式加载与图像模糊预览

渐进式加载可以先显示低质量的图像,然后逐步加载高质量版本:

// 实现LQIP (Low Quality Image Placeholder)技术
function setupProgressiveImages() {const progressiveImages = document.querySelectorAll('.progressive-image-container');progressiveImages.forEach(container => {const thumbnail = container.querySelector('.thumbnail');const fullImage = new Image();fullImage.src = container.dataset.src;fullImage.className = 'full-image';fullImage.onload = () => {container.appendChild(fullImage);container.classList.add('image-loaded');};});
}

配合CSS实现平滑过渡:

.progressive-image-container {position: relative;overflow: hidden;
}.thumbnail {width: 100%;filter: blur(10px);transform: scale(1.05);transition: all 0.3s ease-in-out;
}.full-image {position: absolute;top: 0;left: 0;width: 100%;height: 100%;opacity: 0;transition: opacity 0.3s ease-in-out;
}.image-loaded .thumbnail {filter: blur(0);
}.image-loaded .full-image {opacity: 1;
}

响应式图像CDN与自适应服务

对于大型应用,可以使用专业的图像CDN服务自动优化图像:

<!-- 使用图像CDN (以Cloudinary为例) -->
<img src="https://res.cloudinary.com/demo/image/upload/w_auto,c_scale,f_auto,q_auto/sample.jpg" alt="CDN优化的响应式图像">

这种服务可以:

  • 自动选择最佳格式 (f_auto)
  • 根据设备提供合适尺寸 (w_auto)
  • 优化压缩质量 (q_auto)
  • 应用智能裁剪 (c_scale)

响应式图像加载性能测试

以下是在不同场景下响应式图像技术的性能改进对比:

优化技术页面图像总大小减少首屏加载时间改善内存占用减少
使用srcset/sizes60-70%45-55%30-40%
图像懒加载40-60%30-40%50-60%
渐进式加载不显著25-35% (感知)不显著
格式自适应30-50%20-30%不显著
组合应用所有技术70-85%60-75%55-70%

真实案例:某电商网站应用上述技术后,首页加载时间从原来的4.2秒降至1.5秒,页面跳出率下降了18%,页面转化率提升了12%。

Canvas性能优化与渲染技巧

Canvas作为HTML5引入的强大绘图API,能够处理复杂的2D图形渲染,但在处理大量图形元素或高频率更新时,性能问题也随之而来。以下我们将探讨Canvas性能优化的关键技术和实战经验。

Canvas基础性能优化

1. 调整Canvas尺寸

Canvas的实际渲染尺寸(通过width和height属性设置)与显示尺寸(通过CSS设置)是分开的。当这两者不一致时,浏览器需要进行缩放,这会消耗额外的性能:

// 不推荐:通过CSS调整Canvas大小
canvas.style.width = '500px';
canvas.style.height = '300px';// 推荐:通过属性设置实际渲染尺寸
canvas.width = 500;
canvas.height = 300;// 在高分辨率屏幕上,可以考虑使用更高的渲染尺寸配合CSS缩放以提高清晰度
if (window.devicePixelRatio > 1) {const scale = window.devicePixelRatio;// 增加实际渲染尺寸canvas.width = 500 * scale;canvas.height = 300 * scale;// 使用CSS保持显示尺寸不变canvas.style.width = '500px';canvas.style.height = '300px';// 缩放绘图上下文以匹配const ctx = canvas.getContext('2d');ctx.scale(scale, scale);
}
2. 避免Canvas状态改变

每次改变绘图上下文的状态(如颜色、线宽、阴影等)都会产生一定的性能开销。可以通过最小化状态改变和批量处理相同状态的绘制操作来优化:

// 不推荐:频繁改变状态
function drawShapes(ctx) {for (let i = 0; i < shapes.length; i++) {ctx.fillStyle = shapes[i].color;ctx.fillRect(shapes[i].x, shapes[i].y, shapes[i].width, shapes[i].height);}
}// 推荐:按状态分组绘制
function drawShapesOptimized(ctx) {// 按颜色分组const shapesByColor = {};for (let i = 0; i < shapes.length; i++) {const color = shapes[i].color;if (!shapesByColor[color]) {shapesByColor[color] = [];}shapesByColor[color].push(shapes[i]);}// 每种颜色只设置一次fillStylefor (const color in shapesByColor) {ctx.fillStyle = color;for (const shape of shapesByColor[color]) {ctx.fillRect(shape.x, shape.y, shape.width, shape.height);}}
}
3. 使用多层Canvas分离更新频率不同的元素

当场景中包含静态和动态元素时,可以使用多个重叠的Canvas层,将不同更新频率的元素放在不同的层上:

<div class="canvas-container"><canvas id="background-layer" class="canvas-layer"></canvas><canvas id="middle-layer" class="canvas-layer"></canvas><canvas id="foreground-layer" class="canvas-layer"></canvas>
</div>
.canvas-container {position: relative;width: 800px;height: 600px;
}.canvas-layer {position: absolute;top: 0;left: 0;width: 100%;height: 100%;
}
// 初始化各层
const bgLayer = document.getElementById('background-layer');
const midLayer = document.getElementById('middle-layer');
const fgLayer = document.getElementById('foreground-layer');// 各层上下文
const bgCtx = bgLayer.getContext('2d');
const midCtx = midLayer.getContext('2d');
const fgCtx = fgLayer.getContext('2d');// 背景层(很少更新)
function drawBackground() {// 绘制复杂但静态的背景// ...
}// 中间层(偶尔更新)
function drawMiddleLayer() {// 绘制偶尔变化的元素// ...
}// 前景层(频繁更新)
function drawForeground() {// 清除前一帧fgCtx.clearRect(0, 0, fgLayer.width, fgLayer.height);// 绘制快速变化的元素// ...
}// 初始绘制
drawBackground();
drawMiddleLayer();// 动画循环只更新前景层
function animate() {drawForeground();requestAnimationFrame(animate);
}
animate();// 当需要时才更新中间层
function updateMiddleLayerWhenNeeded() {midCtx.clearRect(0, 0, midLayer.width, midLayer.height);drawMiddleLayer();
}

高级Canvas渲染优化

1. 离屏渲染与缓存

对于复杂但不经常变化的图形,可以先绘制到离屏Canvas,然后将结果作为图像绘制到主Canvas上:

// 创建离屏Canvas
const offscreenCanvas = document.createElement('canvas');
offscreenCanvas.width = 200;
offscreenCanvas.height = 200;
const offCtx = offscreenCanvas.getContext('2d');// 在离屏Canvas上绘制复杂图形(只需执行一次)
function drawComplexShape(ctx) {// 绘制复杂形状...ctx.beginPath();for (let i = 0; i < 1000; i++) {const angle = (i / 1000) * Math.PI * 2;const x = 100 + Math.cos(angle) * (50 + Math.sin(i/50) * 20);const y = 100 + Math.sin(angle) * (50 + Math.cos(i/50) * 20);if (i === 0) {ctx.moveTo(x, y);} else {ctx.lineTo(x, y);}}ctx.fillStyle = 'rgba(0, 128, 255, 0.5)';ctx.fill();ctx.strokeStyle = 'blue';ctx.lineWidth = 2;ctx.stroke();
}// 绘制到离屏Canvas
drawComplexShape(offCtx);// 主绘制循环中复用离屏Canvas内容
function mainRenderLoop() {const mainCtx = document.getElementById('main-canvas').getContext('2d');mainCtx.clearRect(0, 0, mainCanvas.width, mainCanvas.height);// 绘制多个复杂形状的实例(使用缓存的图像)for (let i = 0; i < 20; i++) {mainCtx.drawImage(offscreenCanvas, Math.random() * 600, Math.random() * 400);}requestAnimationFrame(mainRenderLoop);
}
2. 避免阴影和半透明

Canvas中的阴影和半透明操作是性能密集型的,可以通过预渲染或减少使用来优化:

// 不推荐:直接使用阴影
ctx.shadowColor = 'rgba(0, 0, 0, 0.5)';
ctx.shadowBlur = 10;
ctx.shadowOffsetX = 5;
ctx.shadowOffsetY = 5;
ctx.fillRect(50, 50

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

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

相关文章

NHANES指标推荐:LC9

文章题目&#xff1a;Association between lifes crucial 9 and kidney stones: a population-based study DOI&#xff1a;10.3389/fmed.2025.1558628 中文标题&#xff1a;生命的关键 9 与肾结石之间的关联&#xff1a;一项基于人群的研究 发表杂志&#xff1a;Front Med 影响…

谷歌 NotebookLM 支持生成中文播客

谷歌 NotebookLM 支持生成中文播客。 2025 年 4 月 29 日&#xff0c;NotebookLM 宣布其 “音频概览”&#xff08;Audio Overviews&#xff09;功能新增 76 种语言支持&#xff0c;其中包括中文。用户只需将文档、笔记、研究材料等上传至 NotebookLM&#xff0c;然后在设置中选…

ElasticSearch深入解析(十):字段膨胀(Mapping 爆炸)问题的解决思路

文章目录 一、核心原理&#xff1a;动态映射的双刃剑1. 动态映射的工作机制2. 映射爆炸的触发条件3. 底层性能损耗 二、典型场景与案例分析1. 日志系统&#xff1a;动态标签引发的灾难2. 物联网数据&#xff1a;设备属性的无序扩展 三、系统性解决方案1. 架构层优化2. 配置层控…

交互式智能体面临长周期决策和随机环境反馈交互等挑战 以及解决办法

交互式智能体面临长周期决策和随机环境反馈交互等挑战 以及解决办法 目录 交互式智能体面临长周期决策和随机环境反馈交互等挑战 以及解决办法随机初始化参数,lora但是训练需要更加细粒度的评价指数(对思考过程评价,对得出结果的证明评价,对结果评价)用户进看到结果《RAGE…

4:机器人目标识别无序抓取程序二次开发

判断文件是否存在 //判断文件在不在 int HandEyeCalib::AnsysFileExists(QString FileAddr) {QFile File1(FileAddr);if(!File1.exists()){QMessageBox::warning(this,QString::fromLocal8Bit("提示"),FileAddrQString::fromLocal8Bit("文件不存在"));retu…

【Touching China】2007-2011

文章目录 1、20072、20083、20094、20105、2011 1、2007 钱学森 身份&#xff1a;中国航天事业奠基人&#xff0c;中国科学院、中国工程院资深院士获奖事迹&#xff1a;钱学森1955年冲破重重阻力回到祖国&#xff0c;长期担任火箭导弹和航天器研制的技术领导职务。他以总体、动…

linux常用基础命令_最新版

常用命令 查看当前目录下个各个文件大小查看当前系统储存使用情况查看当前路径删除当前目录下所有包含".log"的文件linux开机启动jar更改自动配置文件后操作关闭自启动linux静默启动java服务查询端口被占用查看软件版本重启关机开机启动取别名清空当前行创建文件touc…

Mamba+Attention+CNN 预测模型:破局长程依赖的计算机视觉新范式

目录 一、引言:从 CNN 到 Mamba 的视觉建模进化之路 二、模型关键组成部分解析 (一)CNN 基干:局部特征提取器 (二)Mamba 块:长程依赖建模核心 (三)注意力机制:特征交互增强器 三、模型创新点 四、模型原理与作用 五、优缺点对比 六、应用领域 一、引言:从 C…

LangChain4j +DeepSeek大模型应用开发——8 Function Calling 函数调用

Function Calling 函数调用也叫 Tools 工具 入门案例 例如&#xff0c;大语言模型本身并不擅长数学运算。如果应用场景中偶尔会涉及到数学计算&#xff0c;我们可以**为他提供一个 “数学工具”。**当我们提出问题时&#xff0c;大语言模型会判断是否使用某个工具。 创建工具…

【Prometheus-Mongodb Exporter安装配置指南,开机自启】

目录 内容概述 一、创建MongoDB监控专用用户二、安装MongoDB Exporter三、启动Exporter服务四、配置Systemd服务五、服务管理命令六、Prometheus集成配置七、Grafana看板 内容概述 本教程详细演示了如何在Linux系统中部署MongoDB Exporter以监控MongoDB数据库&#xff0c;并将…

在 Ubuntu 上安装 cPanel

开始之前&#xff0c;请确保拥有一台 Ubuntu 服务器&#xff0c;推荐使用 Ubuntu 22.04 LTS。如果没有&#xff0c;可以查看免费服务器&#xff1a; 11个免费 VPS&#xff0c;够用一辈子了&#xff01;&#xff08;2025最新&#xff09;Top 11 免费VPS推荐平台对比&#xff08…

【算法基础】插入排序算法 - JAVA

一、算法基础 1.1 什么是插入排序 插入排序是一种简单直观的排序算法&#xff0c;它的工作原理类似于我们打牌时整理手牌的过程。插入排序的核心思想是将数组分为已排序和未排序两部分&#xff0c;每次从未排序部分取出一个元素&#xff0c;插入到已排序部分的适当位置。 1.…

WEB前端小练习——记事本

一、登陆页面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>记事本登录注册</title><link…

[ACTF2020 新生赛]Include [ACTF2020 新生赛]Exec

[ACTF2020 新生赛]Include 因为前端过滤的太多了 所以直接使用 日志包含 搞 包含这个 /var/log/nginx/access.log [ACTF2020 新生赛]Include蚁剑连接 翻看 flag{1ce7a81e-0339-44ef-a398-a7784d3efe37} [ACTF2020 新生赛]Exec [ACTF2020 新生赛]Exec 127.0.0.1 |echo <?…

VFS Global 携手 SAP 推动数字化转型

2025年5月2日&#xff0c;SAP 公司宣布&#xff0c;全球领先的签证、领事和技术服务提供商 VFS Global 将采用 SAP 的多项核心软件解决方案&#xff0c;推动其全球政务服务和跨境流动解决方案迈向全面数字化和智能化。此次合作标志着 VFS Global 在 AI 赋能的政府科技&#xff…

GTC2025全球流量大会:领驭科技以AI云端之力,助力中国企业出海破浪前行

在全球化与数字化浪潮下&#xff0c;AI技术正成为中国企业出海的重要驱动力。一方面&#xff0c;AI通过语言处理、数据分析等能力显著提升出海企业的运营效率与市场适应性&#xff0c;尤其在东南亚等新兴市场展现出"高性价比场景适配"的竞争优势&#xff1b;另一方面…

安全漏洞扫描费用受哪些因素影响?市场价格区间是多少?

安全漏洞扫描费用是个复杂且关键的话题。它涉及多种影响因素。合理的费用可让企业有效防范安全风险。下面我们深入探讨一番。 市场价格区间 安全漏洞扫描的费用在市场上差别很大。小型企业进行简单扫描&#xff0c;可能只要几千元。大型企业做全面的深度扫描&#xff0c;费用…

n8n工作流自动化平台的实操:解决中文乱码

解决问题&#xff1a; 通过ftp读取中文内容的文件&#xff0c;会存在乱码&#xff0c;如下图&#xff1a; 解决方案 1.详见《安装 iconv-lite》 2.在code节点&#xff0c;写如下代码&#xff1a; const iconv require(iconv-lite);const items $input.all(); items.forEa…

豪越科技消防立库方案:实现应急物资高效管理

在消防救援工作中&#xff0c;应急物资管理是至关重要的一环。然而&#xff0c;当前应急物资管理的现状却令人担忧。传统的应急物资管理方式存在诸多弊端&#xff0c;严重影响了消防救援的效率和效果。 走进一些传统的消防仓库&#xff0c;映入眼帘的往往是杂乱无章的存储场景。…

zabbix 重置登录密码

概述 本节介绍在 Zabbix 中重置用户密码的步骤。 步骤 如果您忘记了 Zabbix 密码并且无法登录&#xff0c;请联系您的 Zabbix 管理员。 超级管理员用户可以更改用户 配置表单 中所有用户的密码。 如果超级管理员忘记了密码并且无法登录&#xff0c;则必须运行以下 SQL 查询…