微信小程序中缓存数据全方位解惑

微信小程序中缓存数据全方位解惑

微信小程序中的数据缓存是提升用户体验和优化性能的重要手段,跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍:

1. 数据缓存的类型

微信小程序提供了两种数据缓存方式:

  • 本地存储(Local Storage):数据存储在本地,即使小程序关闭后数据依然保留,直到手动清除。
  • 内存存储(Memory Storage):数据存储在小程序的运行内存中,小程序关闭后数据丢失。

2. 数据缓存的API

微信小程序提供了以下API用于数据缓存操作:

2.1 设置缓存

前情:缓存方法后面跟上Sync的就是同步方法,反之就是异步方法

  • 异步设置缓存wx.setStorage

    wx.setStorage({// 设置缓存的名字  key: 'userInfo',// 设置缓存的值  data: { name: '张三', age: 28 },// 设置缓存成功时候调用的方法success: function(res) {console.log('设置成功:', res);},// 设置缓存失败时候调用的方法fail: function(err) {console.error('设置失败:', err);}
    });
    
  • 同步设置缓存wx.setStorageSync

    // 由于是同步的方法,所以用try{}catch(){}格式
    try {// 注意:同步设置缓存与上面的异步方法的参数有所不同// 参数1:存储数据的键名// 参数2:存储的数据wx.setStorageSync('userInfo', { name: '张三', age: 28 }); // 尝试同步设置本地缓存console.log('设置成功'); // 如果设置成功,打印“设置成功”到控制台
    } catch (err) {console.error('设置失败:', err); // 如果设置失败,捕获错误并打印“设置失败:”以及错误信息
    }
    

2.2 获取缓存

  • 异步获取缓存wx.getStorage

    wx.getStorage({key: 'userInfo', // 指定要获取的缓存键(key),这里是 'userInfo'success(res) {   // 成功回调函数,当获取缓存成功时执行console.log('获取成功:', res.data); // 打印获取到的缓存数据,res.data 是缓存的值},fail(err) {      // 失败回调函数,当获取缓存失败时执行console.error('获取失败:', err);   // 打印错误信息,err 是错误对象}
    });
    
  • 同步获取缓存wx.getStorageSync

    try {const userInfo = wx.getStorageSync('userInfo'); // 同步获取本地缓存中键为 'userInfo' 的数据console.log('获取成功:', userInfo);           // 如果获取成功,将获取到的数据打印到控制台
    } catch (err) {console.error('获取失败:', err);             // 如果获取失败,捕获错误并打印错误信息
    }
    

2.3 清除缓存

  • 清除单个缓存wx.removeStorage

    wx.removeStorage({key: 'userInfo', // 指定要删除的缓存键(key),这里是 'userInfo'success(res) {   // 成功回调函数,当删除操作成功时执行console.log('清除成功:', res); // 打印成功信息,res 是返回的结果对象},fail(err) {      // 失败回调函数,当删除操作失败时执行console.error('清除失败:', err); // 打印错误信息,err 是错误对象}
    });
    
  • 同步清除单个缓存wx.removeStorageSync

    try {wx.removeStorageSync('userInfo'); // 同步删除本地缓存中键为 'userInfo' 的数据console.log('清除成功');         // 如果删除成功,打印成功信息
    } catch (err) {console.error('清除失败:', err); // 如果删除失败,捕获错误并打印错误信息
    }
    
  • 清除所有缓存wx.clearStorage

    wx.clearStorage({success(res) { // 成功回调函数,当所有缓存数据被成功清除时执行console.log('所有缓存清除成功:', res); // 打印成功信息,res 是返回的结果对象},fail(err) { // 失败回调函数,当清除操作失败时执行console.error('清除失败:', err); // 打印错误信息,err 是错误对象}
    });
    

3. 缓存策略

3.1 高频更新数据的缓存策略

对于高频更新的数据(如新闻列表),可以采用以下策略:

  1. 初始加载时从服务器获取最新数据并缓存到本地。
  2. 设置缓存过期时间(如1小时),在过期内直接从本地读取。
  3. 缓存过期后自动发起网络请求更新缓存。

示例代码:

// 缓存新闻列表并设置过期时间
wx.setStorageSync('news_list', newsList, 3600 * 1000); // 缓存1小时

3.2 大文件缓存策略

对于大文件(如图片或视频),可以缓存文件的URL而不是文件本身:

  1. 首次加载时,将文件URL保存到本地存储。
  2. 需要显示文件时,检查本地存储是否有URL,若有则直接加载,否则从服务器下载并保存URL。

示例代码:

// 缓存大文件URL
let fileUrl = 'http://example.com/largefile.jpg';
wx.setStorageSync('largefile_url', fileUrl);

4. 注意事项

  1. 存储空间限制:微信小程序的本地存储空间有限(单个key最大1MB),需合理规划。
  2. 数据安全性:敏感数据需加密存储。
  3. 缓存清理:定期清理无用缓存,避免占用过多存储空间。

5. 如何选择

在微信小程序开发中,选择使用同步缓存还是异步缓存取决于具体的应用场景和需求。同步方法(如 wx.setStorageSyncwx.getStorageSync)和异步方法(如 wx.setStoragewx.getStorage)各有优缺点,适用于不同的场景。以下是详细的分析和建议:


5.1 同步缓存方法

特点:
  1. 阻塞当前线程:同步方法会阻塞当前线程,直到操作完成。
  2. 直接返回结果:操作完成后直接返回结果,不需要回调函数。
  3. 代码简洁:适合简单的操作,代码更直观。
适用场景:
  1. 数据量小且操作简单
    • 如果需要存储或读取的数据量较小(例如单个对象或字符串),同步方法可以快速完成操作,不会对用户体验产生明显影响。
    • 示例:存储用户的基本信息(如用户名、头像URL)。
  2. 初始化操作
    • 在页面加载时(如 onLoadonShow 生命周期方法中)加载或设置必要的数据。
    • 示例:加载用户配置或初始化任务列表。
  3. 对性能要求不高
    • 如果操作不会频繁触发,且对性能要求不高,同步方法可以简化代码逻辑。
    • 示例:保存用户设置(如主题颜色、字体大小)。
示例代码:
// 同步保存数据
try {wx.setStorageSync('userInfo', { name: '张三', age: 28 });
} catch (err) {console.error('保存失败:', err);
}// 同步读取数据
try {const userInfo = wx.getStorageSync('userInfo');console.log('读取成功:', userInfo);
} catch (err) {console.error('读取失败:', err);
}

5.2 异步缓存方法

特点:
  1. 非阻塞:异步方法不会阻塞当前线程,操作完成后通过回调函数返回结果。
  2. 适合复杂操作:适合数据量较大或操作频繁的场景。
  3. 用户体验更好:避免因同步操作导致的页面卡顿或白屏。
适用场景:
  1. 数据量大
    • 如果需要存储或读取的数据量较大(例如长列表、大文件路径等),异步方法可以避免阻塞主线程。
    • 示例:保存或加载任务列表、文章内容等。
  2. 操作频繁
    • 如果数据存储或读取操作频繁(例如实时更新数据、频繁读取配置),异步方法可以避免主线程卡顿。
    • 示例:实时更新用户消息列表、频繁读取用户偏好设置。
  3. 需要反馈用户操作
    • 如果需要在操作完成后给用户明确的反馈(如提示框、加载动画),异步方法可以通过回调函数实现。
    • 示例:保存任务后提示用户“保存成功”或“保存失败”。
  4. 与其他异步操作结合
    • 如果需要与其他异步操作(如网络请求、文件操作)结合,异步方法可以更好地管理操作流程。
    • 示例:从服务器获取数据后保存到本地缓存。
示例代码:
// 异步保存数据
wx.setStorage({key: 'userInfo',data: { name: '张三', age: 28 },success() {console.log('保存成功');},fail(err) {console.error('保存失败:', err);}
});// 异步读取数据
wx.getStorage({key: 'userInfo',success(res) {console.log('读取成功:', res.data);},fail(err) {console.error('读取失败:', err);}
});

5.3 总结

使用同步缓存的场景:
  1. 数据量小且操作简单。
  2. 初始化操作(如页面加载时加载数据)。
  3. 对性能要求不高,且代码逻辑需要简洁。
使用异步缓存的场景:
  1. 数据量大或操作复杂。
  2. 操作频繁,需要避免主线程卡顿。
  3. 需要在操作完成后给用户反馈。
  4. 需要与其他异步操作结合。

5.4 最佳实践

  1. 小数据量优先使用同步方法:如果数据量小且操作简单,同步方法可以简化代码逻辑。
  2. 大数据量或频繁操作使用异步方法:如果数据量大或操作频繁,异步方法可以提升用户体验。
  3. 结合实际需求:根据具体需求选择合适的方法,必要时可以混合使用同步和异步方法。

希望这些分析和建议能帮助你更好地选择合适的缓存方法!

6. 实战示例

以下是一个完整的示例,展示如何在两个页面之间通过缓存传递数据:

完整示例1(存入数据)

<view><!-- 每当用户输入内容时,getInput 方法会被触发。 --><input placeholder="输入信息" bind:input="getInput" /><button bind:tap="saveInput">存入</button>
</view>
Page({data: {storage: '' // 定义页面数据,初始值为空字符串,用于存储用户输入的内容},getInput(e) { // 获取输入框的值,e就是表单中输入的值this.setData({ storage: e.detail.value }); // 使用 setData 更新页面数据,将输入框的值赋给 storage},saveInput() { // 保存输入的内容到本地缓存wx.setStorageSync('storage', this.data.storage); // 同步将页面数据 storage 保存到本地缓存,键为 'storage'}
});

完整示例2(读取数据)

<view>从存储中得到的数据:{{storage}}</view>
Page({data: {storage: '' // 定义页面数据,初始值为空字符串,用于存储从本地缓存获取的内容},onLoad() { // 页面加载时触发的生命周期方法wx.getStorage({ // 调用异步方法获取本地缓存中的数据key: 'storage', // 指定要获取的缓存键success: (res) => { // 成功回调函数this.setData({ storage: res.data }); // 使用 setData 更新页面数据,将获取到的缓存数据赋值给 storage}});}
});

通过以上内容,您可以更好地理解和应用微信小程序中的数据缓存功能,从而提升小程序的性能和用户体验。

7. 实战案例-任务列表

7.1 功能需求

  1. 添加任务:用户可以输入任务内容并添加到任务列表。
  2. 查看任务列表:用户可以查看所有未完成的任务。
  3. 完成任务:用户可以标记任务为已完成。
  4. 删除任务:用户可以删除不再需要的任务。

7.2 页面结构和逻辑

我们将使用两个文件:

  1. index.wxml:页面的结构文件。
  2. index.js:页面的逻辑文件。
1. 页面结构文件(index.wxml
<view class="container"><!-- 页面的最外层容器 --><view class="header"><!-- 页面头部,包含输入框和添加按钮 --><input type="text" placeholder="请输入任务" bind:input="getInput" /><!-- 输入框,用户可以在这里输入任务内容 --><!-- bind:input="getInput":绑定输入事件,当用户输入时触发页面的 getInput 方法 --><button bind:tap="addTask">添加任务</button><!-- 添加按钮,用户点击后触发页面的 addTask 方法,将输入的任务添加到任务列表 --></view><view class="task-list"><!-- 任务列表的容器 --><block wx:for="{{tasks}}" wx:key="id"><!-- 使用 wx:for 循环渲染任务列表 --><!-- tasks:页面数据中的任务数组 --><!-- wx:key="id":指定循环的唯一键值,提升渲染性能 --><view class="task-item" bind:tap="toggleTask" data-id="{{item.id}}"><!-- 每个任务项 --><!-- bind:tap="toggleTask":点击任务项时触发页面的 toggleTask 方法 --><!-- data-id="{{item.id}}":为任务项绑定一个自定义属性,存储任务的唯一 ID --><text class="{{item.completed ? 'completed' : ''}}">{{item.content}}</text><!-- 显示任务内容 --><!-- class="{{item.completed ? 'completed' : ''}}":根据任务的完成状态动态添加样式 --><!-- 如果任务已完成(item.completed 为 true),添加 'completed' 样式 --><button bind:tap="deleteTask" data-id="{{item.id}}">删除</button><!-- 删除按钮,点击后触发页面的 deleteTask 方法 --><!-- data-id="{{item.id}}":为删除按钮绑定任务的唯一 ID --></view></block></view>
</view>
2. 页面逻辑文件(index.js
Page({data: {tasks: [], // 任务列表newTask: '' // 当前输入的任务内容},// 在页面加载时调用 loadTasks 方法,从本地缓存加载任务列表onLoad() {this.loadTasks(); // 页面加载时加载任务},// 当用户输入时触发的方法,再用this.setData把输入框中的值,赋值到data区中的newTaskgetInput(e) {this.setData({ newTask: e.detail.value }); // 获取输入框的内容},// 添加任务的方法addTask() {// 解构赋值,等同于 const newTask = this.data.newTaskconst { newTask } = this.data;// trim() 方法会移除字符串两端的空格(包括空格、制表符、换行符等)if (newTask.trim() === '') {// 调用微信小程序的 wx.showToast 方法,显示一个提示框。// icon: 'none':指定提示框的图标类型为无图标(none)wx.showToast({ title: '任务不能为空', icon: 'none' });// return终止当前函数的执行return;}// 将一个新的任务对象添加到任务列表中// Array.prototype.concat() 方法是用来合并数组的,它会返回一个新的数组,而不会修改原始数组const newTasks = this.data.tasks.concat({id: Date.now(), // 使用时间戳生成唯一 IDcontent: newTask,completed: false // 默认未完成});this.setData({ tasks: newTasks, newTask: '' }); // 更新任务列表并清空输入框// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新(添加过的)过的任务数组this.saveTasks(newTasks); // 保存任务到本地缓存},// 当用户点击任务项时,会触发 toggleTask 方法// 该方法会找到对应的任务并切换其完成状态,然后更新页面数据并保存到本地缓存toggleTask(e) {// 参数e为设置的自定义属性 data-id="{{item.id}}"const taskId = e.currentTarget.dataset.id; // a.获取任务的唯一 ID// b.map方法遍历任务列表const tasks = this.data.tasks.map(task => {// c.通过id找到被点击的任务if (task.id === taskId) { task.completed = !task.completed; // d.切换任务的完成状态}return task; // 返回任务对象});this.setData({ tasks }); // e.更新页面数据// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新过(切换状态)的任务数组this.saveTasks(tasks); // f.保存任务到本地缓存},// 删除任务的方法deleteTask(e) {// 参数e为设置的自定义属性 data-id="{{item.id}}"const taskId = e.currentTarget.dataset.id; // a.获取任务的唯一 ID// 用filter方法,通过传过来的id将点击删除的任务项过滤掉,生成一个新的数组tasksconst tasks = this.data.tasks.filter(task => task.id !== taskId); // b.过滤掉被删除的任务this.setData({ tasks }); // c.更新页面数据// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新过(删除过的)的任务数组this.saveTasks(tasks); // d.保存任务到本地缓存},// 方法 saveTasks,用于将任务列表保存到本地缓存// 在上面的几个更改任务列表(tasks)的几个方法中调用saveTasks(tasks) {try {wx.setStorageSync('tasks', tasks); // 将任务保存到本地缓存} catch (err) {console.error('保存任务失败:', err);}},// loadTasks作用:从微信小程序的本地缓存中加载任务列表,并将其设置为页面数据loadTasks() {try {const tasks = wx.getStorageSync('tasks') || []; // 从本地缓存加载任务列表this.setData({ tasks }); // 更新页面数据} catch (err) {console.error('加载任务失败:', err); // 捕获并打印错误信息}}
});

7.3 功能说明

  1. 添加任务
    • 用户在输入框中输入任务内容,点击“添加任务”按钮。
    • 新任务会被添加到任务列表中,并保存到本地缓存。
  2. 查看任务列表
    • 任务列表通过 wx:for 循环渲染,显示所有未完成的任务。
    • 如果任务已完成,任务内容会显示为划线样式(通过 class="completed" 实现)。
  3. 完成任务
    • 点击任务项时,任务的完成状态会切换(未完成变为已完成,已完成变为未完成)。
    • 更新后的任务列表会保存到本地缓存。
  4. 删除任务
    • 点击任务项中的“删除”按钮,任务会被从列表中移除。
    • 更新后的任务列表会保存到本地缓存。

7.4 本地缓存的使用

  • 保存任务:使用 wx.setStorageSync 将任务列表保存到本地缓存。
  • 加载任务:页面加载时,通过 wx.getStorageSync 从本地缓存中加载任务列表。

7.5 样式文件(可选)

你可以在 index.wxss 文件中添加样式,使页面更美观:

.container {padding: 20px;
}
.header {display: flex;margin-bottom: 20px;
}
.header input {flex: 1;margin-right: 10px;
}
.task-item {display: flex;justify-content: space-between;padding: 10px 0;border-bottom: 1px solid #ccc;
}
.task-item text {flex: 1;
}
.completed {text-decoration: line-through;color: #ccc;
}

7.6 总结

这个案例展示了如何使用微信小程序的本地缓存功能来实现一个简单的代办任务应用。通过 wx.setStorageSyncwx.getStorageSync 方法,任务数据可以持久化存储,并在页面加载时恢复。

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

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

相关文章

IP 路由基础 | 路由条目生成 / 路由表内信息获取

注&#xff1a;本文为 “IP 路由” 相关文章合辑。 未整理去重。 IP 路由基础 秦同学学学已于 2022-04-09 18:44:20 修改 一. IP 路由产生背景 我们都知道 IP 地址可以标识网络中的一个节点&#xff0c;并且每个 IP 地址都有自己的网段&#xff0c;各个网段并不相同&#xf…

kong身份认证插件详解之Basic Auth插件

1.3、Basic Authentication 支持基于用户名和密码的基本认证&#xff0c;通常用于简单的身份验证场景。 1.3.1、环境准备 1.3.1.1、创建一个服务&#xff0c;basic-auth-service curl -i -s -X POST http://localhost:8001/services \--data namebasic-auth-service \--dat…

计算机性能与网络体系结构探讨 —— 基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

spring boot知识点1

1.什么是spring boot spring boot是spring框架的子项目&#xff0c;主要特点是自动配置&#xff0c;以及内置的tomcat服务器&#xff0c;适合快速开发web与微服务架构 2.spring boot和spring cloud俩者之间的联系 spring boot可单独运行&#xff0c; spring cloud则是用于多…

thingboard告警信息格式美化

原始报警json内容&#xff1a; { "severity": "CRITICAL","acknowledged": false,"cleared": false,"assigneeId": null,"startTs": 1739801102349,"endTs": 1739801102349,"ackTs": 0,&quo…

【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调

文章目录 1.背景2.微调方式2.1 关键环境版本信息2.2 步骤2.2.1 下载llama-factory2.2.2 准备数据集2.2.3 微调模式2.2.3.1 zero-3微调2.2.3.2 zero-2微调2.2.3.3 单卡Lora微调 2.3 踩坑经验2.3.1 问题一&#xff1a;ValueError: Undefined dataset xxxx in dataset_info.json.2…

Python函数的函数名250217

函数名其实就是一个变量&#xff0c;这个变量就是代指函数而已函数也可以被哈希&#xff0c;所以函数名也可以当作集合中的元素&#xff0c;也可作为字典的key值 # 将函数作为字典中的值&#xff0c;可以避免写大量的if...else语句 def fun1():return 123 def fun2():return 4…

apache artemis安装

安装apache artemis https://xxzkid.github.io/2025/apache-artemis-install

VoIP之音视频会议中的混音技术

在VoIP音视频会议中&#xff0c;需要将多路参会方音频流混合成一路音频流再发送给各参会方&#xff0c;以达到参会方可以听到每个与会人声音的目的&#xff0c;这种技术叫混音。 一、混音基础原理 在实际生活中&#xff0c;我们所处的生活和工作环境就是一个自然的混音场&…

青龙圣者的训练脚本训练 Flux lora

下载 通过网盘分享的文件&#xff1a;qinglong_trainer_21.zip 链接: https://pan.baidu.com/s/12JL1c-gwTR5zzqHAPNleRA?pwd7860 提取码: 7860 搭建python环境 conda create -n qinglong python3.10.14 -yconda activate qinglongcd qinglong_trainer_21pip install -r s…

音视频入门基础:RTP专题(9)——FFmpeg接收RTP流的原理和内部实现

一、引言 由《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》可以知道&#xff0c;推流端通过下面FFmpeg命令可以将一个媒体文件转推RTP&#xff0c;生成RTP流&#xff1a; ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec cop…

matlab 三维时频图绘制

1、内容简介 matlab146-三维时频图绘制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

基于 Ollama 工具的 LLM 大语言模型如何部署,以 DeepSeek 14B 本地部署为例

简简单单 Online zuozuo :本心、输入输出、结果 文章目录 基于 Ollama 工具的 LLM 大语言模型如何部署,以 DeepSeek 14B 本地部署为例前言下载 Ollama实际部署所需的硬件要求设置 LLM 使用 GPU ,发挥 100% GPU 性能Ollama 大模型管理命令大模型的实际运行资源消耗基于 Ollam…

PAT乙级( 1018 锤子剪刀布)C语言超详细解析

文章目录 1018 锤子剪刀布 1018 锤子剪刀布 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现给出两人的交锋记录&#xff0c;请统计双方的胜、平、负次数&#xff0c;并且给出双方分别出什么手势的胜算最大。 输入…

2025 年 2 月 TIOBE 指数

2025 年 2 月 TIOBE 指数 二月头条:快,更快,最快! 现在,世界需要每秒处理越来越多的数字,而硬件的发展速度却不够快,程序的速度变得越来越重要。话虽如此,快速编程语言在 TIOBE 指数中取得进展也就不足为奇了。编程语言 C++ 最近攀升至第 2 位,Go 已稳居前 10 名,Ru…

【硬件设计细节】缓冲驱动器使用注意事项

目录 一、缓冲驱动器核心功能与选型原则 二、电路设计关键点 三、布局与布线规范 四、特殊场景处理 五、测试与验证 六、典型问题与解决方案 七、设计流程建议 一、缓冲驱动器核心功能与选型原则 信号增强与隔离 驱动能力匹配&#xff1a;根据负载电流需求选择缓冲器&a…

TCP

TCP 是什么&#xff1f; TCP ( Transmission Control Protocol 传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。 TCP 对应的应用层协议 FTP&#xff1a;定义了文件传输协议&#xff0c;使用 21 端口 TeInet&#xff1a;它是一种用于远程登…

HTML5+CSS多层级ol标签序号样式问题

在CSS中&#xff0c;ol标签用于创建有序列表&#xff0c;而多层级的ol标签可以通过CSS实现不同的序号样式。以下是一些常见的问题和解决方案&#xff1a; 1. 多层级ol的序号格式问题 默认情况下&#xff0c;多层级的ol标签会自动继承父级的序号格式&#xff0c;但有时我们可能…

人工智能3d点云之Pointnet++项目实战源码解读(点云分类与分割)

一.项目文件概述 二.数据读取模块配置 实际代码运行时是先定义与加载好模型&#xff0c;然后再去读取数据进来传入到模型网络中去训练。但现在反过来先读取数据开始。 进入ModelNetDataLoader类的_getitem方法, 做标准化的目的是处理异常大的数值 上面返回的cls是类别,相当于…

[250217] x-cmd 发布 v0.5.3:新增 DeepSeek AI 模型支持及飞书/钉钉群机器人 Webhook 管理

目录 X-CMD 发布 v0.5.3&#x1f4c3;Changelog&#x1f9e9; deepseek&#x1f9e9; feishu|dingtalk&#x1f4e6; x-cmd✅ 升级指南 X-CMD 发布 v0.5.3 &#x1f4c3;Changelog &#x1f9e9; deepseek 新增 deepseek 模块&#xff0c;用户可通过 deepseek 直接请求使用 …