Fastify深度解析:高性能Node.js Web框架实战指南
这次我们来看一个在 Node.js 社区里有点“叫好不叫座”的框架Fastify。它性能强悍、生态成熟但讨论热度似乎总被 Express 和新兴的 Hono 盖过。这篇文章不聊空洞的概念直接拆解 Fastify 的核心价值、上手门槛、性能表现以及为什么它值得你在下一个项目中认真考虑。Fastify 是一个高度专注于开发者体验和极致性能的 Node.js Web 框架。它由 Matteo Collina 和 Tomas Della Vedova 等核心成员打造底层基于 HTTP/2 优先设计并内置了强大的 JSON 序列化、日志系统和插件架构。它的核心卖点非常明确在提供丰富功能的同时保持极低的开销和极高的吞吐量。对于关心 API 响应速度、微服务架构、或者需要处理高并发请求的开发者来说Fastify 是一个被严重低估的选项。本文将带你快速验证 Fastify 的实用性。我们会从环境搭建、基础项目创建开始实测其启动速度和简单的接口性能。然后我们会深入其插件系统、验证Validation与序列化Serialization机制并与 Express 进行直观对比。最后我们会探讨其“热度不足”背后的技术与非技术原因并给出在 2024 年的技术选型建议。无论你是正在为性能瓶颈寻找解决方案还是单纯好奇这个框架的实力这篇文章都能给你清晰的答案。1. 核心能力速览在深入代码之前先用一个表格快速了解 Fastify 的定位和能力边界这有助于判断它是否适合你的项目。能力项说明项目类型高性能 Node.js Web 框架核心目标极致的低开销与高吞吐优秀的开发者体验性能基准根据官方基准测试吞吐量可达 Express 的 2-3 倍启动速度极快依赖预加载和提前编译插件系统高度封装、异步加载、依赖图管理生态成熟数据验证内置基于 JSON Schema 的请求验证性能优于中间件校验序列化内置高性能 JSON 序列化大幅减少响应时间TypeScript一等公民支持类型推断非常出色学习曲线比 Express 略陡但远低于 NestJS 等全栈框架适合场景高性能 API 服务、微服务、实时应用、需要快速迭代的原型不适合场景极度简单的单文件脚本、强依赖 Express 中间件生态且不愿改造的项目2. 适用场景与使用边界Fastify 不是万能的清楚它的适用边界能帮你做出更明智的选择。它最适合谁性能敏感型开发者当你服务的 QPS 开始成为瓶颈或者服务器资源CPU/内存紧张时Fastify 的低开销能直接转化为成本节约和体验提升。微服务架构师在微服务体系中服务间调用频繁网络开销占比大。Fastify 的高性能 JSON 处理和 HTTP/2 支持能显著降低内部通信延迟。TypeScript 重度用户Fastify 的类型系统设计精良能提供从路由到返回值的完整类型安全开发体验流畅。追求工程质量的团队内置的验证、序列化、日志系统配合强大的插件架构能促使团队写出更规范、更易维护的代码。它能解决什么问题吞吐量瓶颈替换 Express/Koa在不升级硬件的情况下获得显著的性能提升。代码结构混乱通过插件系统天然地鼓励模块化和关注点分离。重复的校验逻辑用 JSON Schema 统一声明请求数据的格式告别散落在各处的if-else校验。序列化性能问题内置的序列化器在响应大量数据或嵌套对象时效率远高于JSON.stringify()。它的边界在哪里小型/一次性脚本如果只是写一个十几行的临时 HTTP 服务Express 的简洁性可能更有优势。强绑定特定 Express 中间件如果项目严重依赖某个没有 Fastify 版本或替代品的 Express 中间件迁移成本需要评估。“够用就行”的心态如果当前 Express 服务性能完全满足需求且团队对现有技术栈满意为换而换的收益不大。3. 环境准备与前置条件开始实测前确保你的本地环境就绪。Fastify 对环境要求非常宽松。基础环境清单Node.jsFastify v4 需要 Node.js v16。建议使用最新的 LTS 版本如 v20.x。你可以使用nvm或fnm轻松管理多个版本。# 检查 Node.js 版本 node --version # 检查 npm 版本 npm --version包管理器npm 或 yarn 或 pnpm 均可。本文示例使用 npm。代码编辑器推荐 VS Code并安装相关的 TypeScript 和 Node.js 插件。API 测试工具用于测试接口。推荐 Thunder Client (VS Code 扩展)、 Postman 或命令行工具curl。没有复杂的系统依赖不需要配置数据库或缓存服务即可开始。我们首先创建一个最纯净的项目来感受 Fastify 的启动和基础路由。4. 安装部署与启动方式让我们从零开始创建一个 Fastify 服务并体验其“一键启动”般的开发体验。步骤 1创建项目并初始化# 创建一个新目录并进入 mkdir fastify-demo cd fastify-demo # 初始化 package.json所有选项可以按回车默认 npm init -y步骤 2安装 Fastify# 安装 Fastify 作为项目依赖 npm install fastify步骤 3创建入口文件在项目根目录创建app.js或app.ts用于 TypeScript。// app.js // 1. 导入 fastify const fastify require(fastify)({ logger: true // 启用内置日志开发时非常有用 }) // 2. 声明一个路由 fastify.get(/, async (request, reply) { return { hello: world from Fastify } }) // 3. 启动服务器 const start async () { try { // 监听 3000 端口所有网络接口 await fastify.listen({ port: 3000, host: 0.0.0.0 }) // 日志会打印出服务地址 fastify.log.info(Server listening on ${fastify.server.address().port}) } catch (err) { fastify.log.error(err) process.exit(1) } } start()步骤 4启动服务# 使用 node 运行应用 node app.js启动后控制台会立刻输出日志类似{level:30,time:1743152834567,pid:12345,hostname:your-pc,msg:Server listening at http://127.0.0.1:3000}注意观察从执行命令到看到这行日志的时间通常非常快。步骤 5验证服务打开浏览器访问http://localhost:3000或者使用curl命令测试curl http://localhost:3000你应该会立刻收到 JSON 响应{hello:world from Fastify}。至此一个最基本的 Fastify 服务已经在 2 分钟内跑起来了。接下来我们测试它的核心能力。5. 功能测试与效果验证5.1 基础路由与性能初探我们增加一个带参数的路由模拟更真实的场景。 修改app.js在首页路由后添加// 带参数和查询字符串的路由 fastify.get(/user/:id, async (request, reply) { const { id } request.params const { name } request.query return { userId: id, userName: name || Guest, timestamp: new Date().toISOString(), message: This is a fast response. } })重启服务后测试curl http://localhost:3000/user/123?nameFastifyTester响应速度极快你会立刻拿到包含 ID、名称和时间戳的 JSON。5.2 内置验证与序列化测试核心优势这是 Fastify 区别于 Express 的关键。我们创建一个POST /user接口来演示。 在app.js中继续添加// 定义请求体和响应体的 JSON Schema const userSchema { body: { type: object, required: [name, email], // 必填字段 properties: { name: { type: string, minLength: 2 }, email: { type: string, format: email }, // 内置邮箱格式校验 age: { type: integer, minimum: 0 } } }, response: { 200: { // 定义 HTTP 200 的响应格式 type: object, properties: { id: { type: string }, name: { type: string }, email: { type: string }, createdAt: { type: string } } } } } // 注册路由并关联 schema fastify.post(/user, { schema: userSchema }, async (request, reply) { const { name, email, age } request.body // 业务逻辑这里模拟创建用户 const newUser { id: user_${Date.now()}, name, email, createdAt: new Date().toISOString() } // 直接返回对象Fastify 会自动根据 schema 序列化 return newUser })重启服务使用curl进行测试测试有效请求curl -X POST http://localhost:3000/user \ -H Content-Type: application/json \ -d {name:Alice,email:aliceexample.com,age:28}你会收到一个格式规整的201响应。测试无效请求验证失败curl -X POST http://localhost:3000/user \ -H Content-Type: application/json \ -d {name:A,email:not-an-email}Fastify 会自动返回一个结构化的 400 错误指出name长度不足且email格式错误。你无需在控制器中写任何if (!name || name.length 2)这样的校验代码。这个机制的好处性能验证和序列化在框架底层通过编译后的函数执行比中间件循环快得多。安全无效数据在进入业务逻辑前就被拦截。文档化Schema 本身就是最好的 API 文档可以轻松生成 OpenAPI/Swagger 文档通过fastify/swagger插件。5.3 插件系统体验插件是 Fastify 的基石。我们创建一个简单的插件。 新建文件plugins/my-plugin.js// plugins/my-plugin.js module.exports async function (fastify, options) { // 在插件内注册一个装饰器为 fastify 实例添加一个工具方法 fastify.decorate(utility, function () { return This is a utility from my plugin }) // 在插件内注册路由 fastify.get(/plugin-route, async (request, reply) { return { message: fastify.utility() } }) }修改app.js在启动前注册插件// 在 app.js 顶部导入 fastify 后 const path require(path) // ... fastify 实例化 ... // 注册插件 fastify.register(require(./plugins/my-plugin)) // ... 后续路由和启动逻辑 ...重启服务访问http://localhost:3000/plugin-route你会看到插件路由正常工作。插件系统支持封装、作用域隔离和异步加载非常适合构建模块化应用。6. 接口 API 与“批量任务”模拟对于 Web 框架“批量任务”可以理解为高并发请求处理能力。我们来模拟一个场景并发生成多个用户。我们可以写一个简单的脚本使用axios或node-fetch并发调用我们刚创建的POST /user接口。 首先安装axiosnpm install axios创建测试脚本test-concurrent.jsconst axios require(axios) const BASE_URL http://localhost:3000 async function createUser(userData) { try { const response await axios.post(${BASE_URL}/user, userData) console.log(Success: ${response.data.id}) return response.data } catch (error) { console.error(Failed for ${userData.name}:, error.response?.data || error.message) } } async function runConcurrentTest() { const users [] for (let i 0; i 50; i) { // 模拟 50 个并发创建请求 users.push({ name: User${i}, email: user${i}test.com, age: 20 i }) } console.time(Concurrent Requests) // 使用 Promise.all 发起并发请求 const results await Promise.allSettled(users.map(user createUser(user))) console.timeEnd(Concurrent Requests) const successful results.filter(r r.status fulfilled).length console.log(Total: ${users.length}, Success: ${successful}, Failed: ${users.length - successful}) } // 确保服务已启动然后运行 runConcurrentTest().catch(console.error)运行前请确保你的 Fastify 服务正在运行。然后执行node test-concurrent.js观察控制台输出的总耗时。你可以对比使用相同逻辑测试一个 Express 服务需要手动添加验证中间件在同等条件下Fastify 处理完所有请求的总时间通常更短且 CPU 占用率可能更低。这模拟了 API 网关或任务队列消费者需要快速处理大量请求的场景。7. 资源占用与性能观察如何量化 Fastify 的性能优势我们可以从几个维度观察1. 启动时间Fastify 在启动时会进行大量的代码编译和优化如 Schema 编译但这通常发生在启动阶段。你可以用console.time简单测量const start async () { console.time(Server startup) try { await fastify.listen({ port: 3000 }) console.timeEnd(Server startup) // 查看从调用 listen 到 ready 的时间 } catch (err) { // ... } }对于已启动的服务处理每个请求的延迟极低。2. 内存占用可以使用 Node.js 内置的process.memoryUsage()或在服务器运行期间通过ps aux | grep node或任务管理器观察。一个简单的 Fastify 服务内存占用通常很小与 Express 相当但在高并发下由于其高效的数据处理常表现出更好的内存稳定性。3. 压力测试对比使用 autocannon安装压力测试工具npm install -g autocannon对 Fastify 服务进行测试autocannon -c 100 -d 10 http://localhost:3000/参数解释-c 100表示 100 个并发连接-d 10表示持续 10 秒。 再用同样的命令测试一个功能类似的 Express 服务。对比两者的Requests/sec每秒请求数和Latency延迟指标。根据官方和社区基准测试Fastify 在纯 JSON 响应场景下RPS 通常是 Express 的 2 倍以上。性能关键点JSON 序列化Fastify 的fast-json-stringify在响应复杂、嵌套的 JSON 时优势巨大。路由匹配基于find-my-way的路由器速度极快。开销控制极少的中间件层和封装让每个请求的框架层开销最小化。8. 常见问题与排查方法在迁移或使用 Fastify 时你可能会遇到以下典型问题。问题现象可能原因排查方式解决方案启动时报Address already in use端口被占用检查netstat -ano | findstr :3000(Win) 或lsof -i :3000(Mac/Linux)更换listen中的端口号或杀死占用端口的进程。插件中的装饰器报decorate is not a function插件加载顺序问题或尝试在根上下文外使用decorate检查插件注册是否在fastify.register内部并确保在await register()之后使用装饰器。遵循 Fastify 的插件封装规范。确保装饰器在插件函数内调用fastify.decorate。请求体验证失败但日志不清晰未启用详细日志或 Schema 定义有误1. 实例化时设置logger: { level: debug }。2. 仔细检查 JSON Schema 语法。开启调试日志。使用ajvFastify 使用的验证器的独立工具验证 Schema。TypeScript 类型报错提示某属性不存在类型声明未正确扩展检查是否使用了fastify/type-provider-*来增强类型支持。参考 Fastify TypeScript 文档正确定义接口并使用泛型。性能提升不如预期应用瓶颈不在框架而在业务逻辑、数据库或外部 API使用 Node.js 性能分析工具如clinic.js、0x进行火焰图分析。优化慢速的数据库查询、减少不必要的同步操作、引入缓存。Fastify 解决的是框架本身的开销。某个 Express 中间件找不到 Fastify 版本生态差异在 Fastify 生态网站 或 npm 上搜索fastify/前缀的替代品。寻找替代插件或自己用 Fastify 的钩子hooks系统封装一个。9. 最佳实践与使用建议要让 Fastify 发挥最大价值遵循一些最佳实践很重要。拥抱 JSON Schema不要回避它。将请求和响应的格式约束用 Schema 定义清楚这是获得性能、安全和自动文档三重收益的关键。善用插件化架构按功能模块如数据库连接、认证、邮件服务组织成插件。这会让代码更清晰且便于测试和复用。理解“生命周期钩子”Fastify 提供了onRequest,preParsing,preValidation,preHandler,preSerialization,onSend,onResponse等钩子。在合适的钩子中执行逻辑如认证放在preValidation比滥用中间件更高效。为生产环境配置日志开发时用logger: true很方便生产环境建议配置更结构化的日志如pino的持久化目标并设置合适的日志级别。谨慎使用异步/等待Fastify 全面支持async/await。确保你的路由处理函数是async的或者在回调中正确调用reply.send()避免请求挂起。安全性配置使用fastify/helmet插件来设置重要的安全 HTTP 头使用fastify/rate-limit进行限流。从简单开始不要一开始就试图把整个 Express 应用迁移过来。可以先在一个新的、简单的微服务中尝试 Fastify或者将现有应用中的一个性能关键路由用 Fastify 重写进行对比。10. 总结与下一步所以回到最初的问题为什么 Fastify 没有获得与其技术实力相匹配的“热度”技术层面它几乎没有短板甚至在很多方面是标杆。其“热度不足”更多是生态位和时机问题Express 的统治地位Express 的“中间件即一切”的极简哲学以及海量的中间件生态形成了强大的网络效应和惯性。对于很多项目“够用”比“最优”更重要。学习曲线感知JSON Schema 和插件系统对新手有一定学习成本而 Express 的app.use看起来更直接。营销与定位Fastify 一直低调地专注于性能和开发者体验而非市场营销。新兴框架如 Hono针对边缘计算等因其更鲜明的细分市场定位更容易获得话题性。“性能无关论”对于大量内部管理后台、低频访问的应用框架性能差异的确感知不强。那么下一步你应该怎么做如果你正在面临性能瓶颈或者启动一个新的 Node.js API 服务Fastify 绝对值得你投入时间评估。建议的行动路径动手实测按照本文的步骤花 30 分钟创建一个简单的 Fastify 服务并与你熟悉的框架进行对比测试。数据最有说服力。深入插件生态浏览fastify/命名空间下的官方插件你会发现数据库、缓存、认证、文档生成等常用功能都有高质量实现。在低风险场景试点在一个新的微服务或现有系统的一个独立模块中使用 Fastify积累实战经验。关注社区Fastify 的 GitHub 仓库和 Discord 社区非常活跃核心团队响应迅速遇到问题很容易得到帮助。Fastify 可能永远不会像 Express 那样无处不在但在追求效率、性能和现代开发体验的开发者心中它早已是顶级选择。在资源日益珍贵、性能即成本的今天这样一个框架的价值只会越来越凸显。建议收藏本文在你下次技术选型时给它一个公平竞争的机会。

相关新闻

Spring Boot应用反编译防护实战:从代码混淆到立体安全体系

Spring Boot应用反编译防护实战:从代码混淆到立体安全体系

这次我们来看一个 Java 开发者,尤其是 Spring Boot 开发者必须关注的安全实践:如何防止你的应用被反编译。这不仅仅是面试题,更是保护核心业务逻辑和知识产权的实际需求。一个打包好的 JAR 或 WAR 文件,在反编译工具面前几乎是透明…

2026/8/22 21:47:46 阅读更多 →
Calibre电子书管理:从格式转换到私人图书馆搭建全指南

Calibre电子书管理:从格式转换到私人图书馆搭建全指南

如果你手头有一堆格式各异的电子书,比如 Kindle 专用的 MOBI、苹果图书青睐的 EPUB、PDF 文档,甚至是 TXT 纯文本,想要统一管理、格式转换、编辑元数据,或者只是想在多个设备间无缝阅读,那么今天要聊的这个工具&#x…

2026/8/24 1:31:34 阅读更多 →
MARCH框架解析:多智能体协同如何革新CT报告生成

MARCH框架解析:多智能体协同如何革新CT报告生成

1. 项目概述:当大模型遇上放射科报告最近在医学影像AI的圈子里,一个叫“MARCH”的框架讨论热度挺高。它的全称是“Multi-Agent Radiology Clinical Hierarchy for CT Report Generation”,直译过来就是“用于CT报告生成的多智能体放射科临床层…

2026/8/22 21:46:45 阅读更多 →

最新新闻

零门槛上手BiliRoaming:区域解锁一份就够的指南

零门槛上手BiliRoaming:区域解锁一份就够的指南

零门槛上手BiliRoaming:区域解锁一份就够的指南 【免费下载链接】BiliRoaming 哔哩漫游,解除B站客户端番剧区域限制的Xposed模块,并且提供其他小功能。An Xposed module that unblocks bangumi area limit of BILIBILI with miscellaneous fe…

2026/8/24 5:33:54 阅读更多 →
.NET Framework项目配置CommunityToolkit.Mvvm源生成器实现MVVM自动化

.NET Framework项目配置CommunityToolkit.Mvvm源生成器实现MVVM自动化

如果你正在开发一个 .NET MAUI、WPF 或 WinUI 3 应用,并且厌倦了手动编写那些重复、冗长且容易出错的 MVVM 样板代码——比如为每个属性实现INotifyPropertyChanged,或者为每个命令编写ICommand的包装器,那么这篇文章就是为你准备的。很多开发…

2026/8/24 5:33:54 阅读更多 →
Java位运算实战:从面试题到HashMap底层优化

Java位运算实战:从面试题到HashMap底层优化

1. 为什么Java面试官总爱问位运算——它真只是“老古董”吗&#xff1f; 你可能在刷Java八股文时&#xff0c;看到“&、|、^、<<、>>、~、>>>”这七个符号&#xff0c;第一反应是&#xff1a;“这玩意儿我写业务代码十年都没用过&#xff0c;背它干啥…

2026/8/24 5:33:54 阅读更多 →
深度学习GPU环境搭建:从显卡算力到PyTorch的完整依赖链解析

深度学习GPU环境搭建:从显卡算力到PyTorch的完整依赖链解析

1. 项目概述&#xff1a;从“能用”到“好用”的GPU深度学习环境构建 如果你刚拿到一块新显卡&#xff0c;兴冲冲地打开PyTorch官网准备安装GPU版本&#xff0c;大概率会被“CUDA 11.8”、“CUDA 12.1”、“Compute Platform”这些选项搞得一头雾水。更让人崩溃的是&#xff0…

2026/8/24 5:33:54 阅读更多 →
RGB与CMYK色彩模型解析:从原理到Python图像处理实践

RGB与CMYK色彩模型解析:从原理到Python图像处理实践

1. 项目概述&#xff1a;从“两种三原色”说起刚入行做设计或者搞图像处理的朋友&#xff0c;估计都听过“三原色”这个词&#xff0c;但很多人可能没细想过&#xff0c;其实我们日常打交道的是两套完全不同的三原色系统。一个叫RGB&#xff0c;另一个叫CMY(K)。这可不是什么高…

2026/8/24 5:33:54 阅读更多 →
PyTorch图像分类实战:HW03人狗二分类全流程避坑指南

PyTorch图像分类实战:HW03人狗二分类全流程避坑指南

1. 这不是一份“抄作业指南”&#xff0c;而是一次真实的HW03攻坚复盘李宏毅2023机器学习作业HW03&#xff0c;标题写着“图像分类”&#xff0c;但实际踩进去才发现&#xff0c;它根本不是让你调个ResNet跑个准确率就完事的入门练习。这道题真正考的是&#xff1a;你能不能在有…

2026/8/24 5:32:53 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力&#xff1b;确需渲染 HTML 时&#xff0c;先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述&#xff1a;Windows登录密码的“黑匣子”每次你按下CtrlAltDel&#xff0c;输入密码&#xff0c;然后看到那个熟悉的桌面&#xff0c;这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者&#xff0c;我经常被问到&#xff1a;“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述&#xff1a;AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时&#xff0c;遇到一个典型案例&#xff1a;候选人在视频面试中无意提到竞争对手产品名称&#xff0c;系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →