Encore:用Rust解析器将TypeScript编译为WebAssembly的工程实践
你第一次听说 TypeScript 能直接编译成 WebAssembly 时是不是也和我一样觉得这听起来有点“跨界”毕竟TypeScript 是跑在 JavaScript 引擎里的而 WebAssembly 是接近底层的二进制指令集两者之间似乎隔着一道鸿沟。但最近一个名为Encore的项目进入了我的视野它声称能用 Rust 写的解析器把 TypeScript 编译成 WASM。这听起来不像是一个简单的“转译器”更像是在尝试打通前端动态语言与高性能计算之间的任督二脉。我最初的反应是怀疑这到底是一个学术玩具还是一个有实际价值的工程方案它解决了什么问题是单纯为了“炫技”还是真的能带来性能提升或新的应用场景带着这些疑问我深入研究了它的思路和实现。我发现Encore 的核心价值不在于它“能”把 TypeScript 编译成 WASM而在于它探索了一条“类型安全的前端逻辑”如何以接近原生性能运行在非 JavaScript 环境中的路径。这背后涉及对 TypeScript 类型系统的深度理解、Rust 在解析领域的优势以及 WASM 作为通用运行时目标的潜力。很多人可能会立刻想到性能。没错将计算密集型任务如物理模拟、图像处理、复杂算法编译成 WASM 确实能带来显著的加速。但 Encore 的野心可能不止于此。它更像是一个“桥梁”原型让我们思考当 TypeScript 不再被 V8 或 Node.js 运行时束缚而是能编译成一种可移植、高效、安全的字节码时我们的应用架构可以发生怎样的变化是让前端开发者也能触及边缘计算、插件系统还是能让服务端渲染的逻辑拥有统一的语言栈当然这条路充满挑战。TypeScript 的动态特性、庞大的标准库、对 DOM/BOM 的依赖都是需要跨越的障碍。Encore 目前的状态更像是一把锋利的“手术刀”在特定的、受限的领域纯计算、算法中展示可能性而非一把“瑞士军刀”解决所有问题。接下来我们就抛开炒作从工程实践的角度拆解 Encore 是什么、怎么工作、适合谁用以及你真正上手时需要关注的那些“坑”。1. 先理解 Encore 到底在解决什么问题从“转译”到“编译”的范式跃迁在深入代码之前我们必须先厘清一个根本区别Babel/tsc 做的叫“转译”而 Encore 在做的是“编译”。这不仅仅是语义游戏它决定了整个项目的技术栈和适用边界。1.1 “转译”与“编译”的本质差异当你用tsc或babel处理 TypeScript 时你经历的过程是解析将 TypeScript 源代码转换成抽象语法树。类型检查根据 AST 和类型定义进行静态分析。降级转换将新的语法如async/await、装饰器转换成目标环境如 ES5支持的等价语法。生成输出 JavaScript 代码。这个过程的核心产出是另一份高级语言代码。它依然需要 JavaScript 引擎来解释或即时编译执行。引擎的优化能力、垃圾回收策略、以及宿主环境浏览器/Node.js的 API 绑定共同决定了最终性能。而 Encore 的“编译”流程目标则截然不同解析与类型分析同样生成 AST并进行严格的类型分析。这是后续所有步骤的基础。中间表示转换将 TypeScript 的 AST 转换成一个更底层、更接近机器模型的中间表示。这一步是关键它开始剥离 TypeScript 对 JavaScript 特定运行时和对象模型的依赖。目标代码生成将中间表示编译成WebAssembly 文本格式或二进制格式。WASM 是一种堆栈式虚拟机的指令集它定义了自己的值类型i32, i64, f32, f64、线性内存和函数调用约定。运行时剥离TypeScript/JavaScript 中大量操作依赖运行时比如Array.prototype.map、JSON.stringify甚至console.log。在 WASM 中这些要么需要从宿主环境导入要么需要自己实现一个精简的运行时库。所以Encore 解决的核心问题是如何将一门设计时依赖动态运行时的高级语言安全、高效地映射到一个静态类型、手动管理内存的低级虚拟机上。这比“把 TypeScript 转换成另一种语法”要复杂得多。1.2 为什么选择 Rust 作为解析器实现语言从搜索热词中可以看到Rust和TypeScript都是开发者社区的热门话题。Encore 选择 Rust 来编写 TypeScript 解析器是一个深思熟虑的工程决策而非追逐潮流。性能与确定性Rust 编译出的原生代码在解析大型代码库、构建复杂 AST 时速度远超用 JavaScript 编写的解析器如typescript编译器自身的tsc。对于编译工具链来说更快的解析速度意味着更短的反馈循环。内存安全与并发Rust 的所有权系统保证了在解析过程中不会出现内存错误这对于构建稳定可靠的编译器前端至关重要。此外Rust 优秀的并发能力为未来并行解析、并行类型检查提供了可能。与 WASM 工具链的亲和性Rust 拥有目前最成熟、最活跃的 WASM 编译工具链wasm-bindgen,wasm-pack。用 Rust 写解析器使得 Encore 项目自身也更容易被编译成 WASM从而实现在浏览器中运行 TypeScript 到 WASM 的编译过程即自举。生态系统Rust 拥有优秀的解析器组合子库如nom、AST 处理库便于构建健壮的语言工具。简而言之用 Rust 写解析器是为了给这个高难度的编译过程提供一个坚固、高效的基础设施。这确保了编译过程本身的可靠性和性能避免在“翻译”的第一步就引入瓶颈或不确定性。1.3 目标WASM 带来的可能性将输出目标定为 WASM则打开了另一扇门性能在纯计算任务上WASM 可以接近原生代码性能远超 JavaScript。可移植性一次编译可在浏览器、Node.js、Deno、Bun、边缘函数、甚至物联网设备上运行。安全沙箱WASM 在一个内存安全的沙箱中运行与宿主环境隔离。语言互操作WASM 模块可以被任何支持 WASM 的语言调用反之亦然。这意味着用 TypeScript 编写的核心算法库可以被 Python、Go、Rust 等后端语言直接使用。Encore 正是在尝试将 TypeScript 开发者熟悉的语言带入到这个更广阔、更高性能的生态中。它的目标用户不是所有 TypeScript 开发者而是那些需要将用 TypeScript 表达的复杂业务逻辑或算法进行性能极限优化或跨环境部署的团队。2. 拆解 Encore 的工作流程从 TS 源码到 WASM 模块理解了“为什么”之后我们来看“怎么做”。Encore 的完整工作流程可以分解为几个清晰的阶段每个阶段都有其技术挑战和设计取舍。2.1 第一阶段深度解析与类型擦除这是最传统但也最复杂的一步。Encore 的 Rust 解析器需要完全理解 TypeScript 语法并构建出包含完整类型信息的 AST。// 伪代码示意解析阶段的核心任务 let source_code fs::read_to_string(app.ts)?; let ast typescript_parser::parse(source_code)?; // 生成TS AST let type_checker TypeChecker::new(); let typed_ast type_checker.check(ast)?; // 进行类型检查得到带类型的AST关键在于接下来的“类型擦除”和“降级”。TypeScript 的类型信息interface,type,generic在运行时是不存在的。Encore 需要验证所有类型确保代码是类型安全的。擦除类型注解生成一个去掉了所有类型声明的、更干净的 AST。处理高级特性将enum,namespace,装饰器等 TypeScript/ESNext 特性转换为更低级的、WASM 或一个简易运行时能够理解的等价结构。这个过程类似于tsc的emit阶段但目标不是 ES5/6而是一个自定义的中间表示。2.2 第二阶段生成中间表示这是 Encore 的核心创新点。它需要设计一种中间表示既能表达 TypeScript 的操作语义又能相对容易地映射到 WASM 上。考虑一个简单的 TypeScript 函数function add(a: number, b: number): number { return a b; }在 JavaScript 中number是双精度浮点数。但在 WASM 中你需要明确选择f64。对于更复杂的对象、数组、字符串问题就更棘手了。Encore 的 IR 可能需要处理值类型将 TypeScript 的number映射为f64或i32根据上下文推断。对象模型设计一个在 WASM 线性内存中表示 JavaScript 对象的结构。这可能是一个简单的结构体包含类型标签和指向数据的指针。垃圾回收最简单的方案是暂时不做真正的 GC而是用于生命周期短、内存管理明确的场景。或者集成一个现有的 WASM GC 提案实现或精简的引用计数方案。内置函数Math.sqrt、Array.from等需要提供实现。这些实现本身可能也是用 Rust 编写并编译成 WASM作为“运行时库”导入。这个 IR 可能看起来像一种简化版的、静态类型的字节码它是通往 WASM 的桥梁。2.3 第三阶段WASM 代码生成与运行时链接有了 IR下一步就是生成 WebAssembly 文本格式或二进制格式。WASM 模块的基本结构包括类型段定义函数签名。导入段声明需要从宿主环境如 JavaScript导入的函数例如console.log。函数段包含模块内部函数的定义。内存段定义线性内存。导出段声明哪些函数或内存可以被宿主调用。Encore 的编译器后端需要将 IR 中的函数转换为 WASM 函数体。管理线性内存的分配与布局用于存放对象、数组、字符串。生成必要的“胶水代码”用于在 JavaScript 和 WASM 之间传递复杂数据类型。例如将 JavaScript 字符串转换为 WASM 内存中的指针和长度。;; 一个极简的、由Encore可能生成的WAT文件示例 (module (import env log (func $log (param i32 i32))) ;; 从JS导入console.log (memory 1) ;; 1页内存64KB (func $add (param $a f64) (param $b f64) (result f64) local.get $a local.get $b f64.add) (func $main (call $log (i32.const 0) (i32.const 11)) ;; 传递字符串指针和长度 ) (export add (func $add)) (export main (func $main)) (data (i32.const 0) Hello World) ;; 在内存中存储字符串 )最终你会得到一个.wasm文件和一个自动生成的 JavaScript “胶水”文件后者负责加载 WASM 模块、设置内存、提供导入的函数。3. 实操探索 Encore 的潜力与当前边界假设我们现在想用 Encore 尝试一个具体的场景。请注意Encore 仍处于早期阶段以下流程是基于其设计理念的推演和通用 WASM 工具链的实践用于展示思路而非官方稳定教程。3.1 理想中的使用流程安装与项目初始化# 假设未来有类似这样的安装方式 cargo install encore-cli mkdir my-wasm-lib cd my-wasm-lib encore init这会创建一个包含tsconfig.json、encore.config.json和示例源码的项目。编写 TypeScript 业务逻辑 在src/compute.ts中我们编写一个纯计算的函数避免使用 DOM、BOM 或复杂的 JS 运行时特性。// 一个适合编译到WASM的示例图像灰度计算 export function calculateGrayscale(data: Uint8ClampedArray): Uint8ClampedArray { const output new Uint8ClampedArray(data.length); for (let i 0; i data.length; i 4) { const r data[i]; const g data[i 1]; const b data[i 2]; // 使用整数运算避免浮点数开销 const gray (r * 299 g * 587 b * 114) / 1000; output[i] output[i 1] output[i 2] gray; output[i 3] data[i 3]; // 保持Alpha通道 } return output; }配置编译 在encore.config.json中指定入口文件、目标 WASM 版本、需要导入的运行时函数等。{ entry: ./src/compute.ts, target: wasm32-unknown-unknown, imports: { env: { memory: shared, abort: abort_handler } }, optimizationLevel: s }编译与构建encore build --release产出dist/compute.wasm和dist/compute.js。在 Web 或 Node.js 中使用!-- 在浏览器中使用 -- script typemodule import init, { calculateGrayscale } from ./dist/compute.js; await init(); // 初始化WASM模块 // ... 获取ImageData调用calculateGrayscale /script// 在Node.js中使用 const { calculateGrayscale } require(./dist/compute.js); // ... 调用函数3.2 当前面临的挑战与边界然而上面的理想流程在 Encore 成熟之前会面临重重挑战这也是你评估是否投入时需要重点考量的语言特性支持度Encore 初期必然只能支持 TypeScript 的一个子集。以下特性可能无法支持或支持不完善动态特性eval,with,Proxy。完整的标准库大部分Array,String,Date,Math的方法需要自己实现或导入。垃圾回收复杂对象的生命周期管理是一大难题。异步/事件循环Promise,setTimeout,async/await需要完整的运行时事件循环WASM 目前不原生支持。性能陷阱并非所有 TypeScript 代码编译成 WASM 都会变快。频繁在 JS 和 WASM 之间传递复杂数据如对象、数组的序列化/反序列化开销可能抵消计算收益。最佳实践是将数据密集型、计算密集型的核心逻辑放在 WASM 中并保持接口简单使用 TypedArray、数字等。调试与工具链调试编译到 WASM 的 TypeScript 代码将异常困难。源代码映射、断点、变量查看都需要工具链的深度支持而这需要时间积累。生态系统你无法直接使用 npm 上的大多数库除非它们也是纯逻辑且能被 Encore 编译或者你只为它们提供空壳实现。因此Encore 的适用边界非常清晰适用纯算法库加密、压缩、编解码、数学计算、物理模拟、游戏逻辑、音视频处理等计算密集型任务且已有或愿意用 TypeScript 重写。不适用UI 交互、大量操作 DOM、重度依赖 npm 生态、需要复杂异步和 IO 操作的应用。4. 从 Encore 看未来TypeScript 作为“可移植算法语言”的潜力Encore 项目更像一个技术宣言和探索原型。它的长期价值不在于是否取代tsc而在于拓展了 TypeScript 的想象边界。4.1 架构启示统一前后端与边缘的逻辑层想象一下如果你的业务核心验证规则、定价计算、图像处理算法都是用 TypeScript 编写的那么通过 Encore 这样的工具你可以前端在浏览器中以 WASM 形式运行获得极致性能。后端在 Node.js 中直接作为 JS 模块运行或在其他语言中通过 WASM 运行时调用。边缘在 Cloudflare Workers、Deno Deploy 等边缘环境中以安全的沙箱模式运行。这实现了“一次编写多处部署”且保证了逻辑的严格一致性。TypeScript 强大的类型系统成为了跨平台逻辑的契约和保障。4.2 对开发者的意义技能栈的延伸对于前端开发者而言Encore 降低了接触高性能计算和系统级编程的门槛。你不需要先精通 C 或 Rust 才能写 WASM可以用更熟悉的 TypeScript 开始探索。当遇到性能瓶颈时你有一个清晰的升级路径将关键函数编译成 WASM。对于全栈或后端开发者你多了一种选择用 TypeScript 编写那些对性能敏感但又不至于要用 C/Rust 重写的模块然后将其作为 WASM 二进制包分发集成到任何支持 WASM 的运行时中。4.3 实施路径建议从实验到生产如果你对 Encore 或类似思路感兴趣我建议遵循以下路径阶段一技术与可行性验证目标验证你的核心算法编译成 WASM 后是否有性能提升。行动选择一个小的、计算密集的纯函数尝试手动或用早期工具链将其转换为 WASM甚至可以先手写 WAT 或使用 AssemblyScript 进行验证。验证指标速度提升比例、内存开销、包体积变化。阶段二工具链与开发体验建设目标搭建一个可用的本地编译、调试、测试流程。行动密切关注 Encore 等项目的进展尝试其示例。同时建立 benchmark 测试套件确保性能提升是稳定且可测量的。关键点解决数据交换格式、调试方法、与现有构建工具如 Webpack, Vite的集成。阶段三小规模生产试点目标在一个非关键路径的业务模块中使用评估全链路稳定性。行动选择一个独立的、影响面可控的功能点如图片滤镜、特定格式解析进行替换。监控重点关注错误率、性能波动、内存泄漏、不同浏览器/Node.js 版本的兼容性。阶段四模式总结与推广目标形成团队内部的最佳实践和选型标准。产出明确“什么样的代码适合编译到 WASM”、“集成规范”、“降级方案”等。Encore 为我们打开了一扇窗让我们看到 TypeScript 不仅仅是一门用于构建 Web 应用的语言它也有可能成为一种编写高性能、可移植计算单元的载体。这条路很长充满了未解决的工程难题但方向值得探索。它提醒我们在技术选型时不应被语言的“出身”所限制而应更多地关注其表达能力和最终运行的效率与边界。对于追求极致性能或需要跨环境部署统一逻辑的团队来说关注 Encore 这类项目的演进或许能在未来某个时刻为你提供一个意想不到的优质解决方案。

相关新闻

Java多数据源合并实战:构建可配置异构数据集成工具

Java多数据源合并实战:构建可配置异构数据集成工具

在实际项目中,我们经常需要处理来自不同数据源、格式各异的数据,并将其整合到一个统一的视图中进行分析或展示。这种需求在数据仓库、报表系统或业务中台建设中尤为常见。面对零散的原始数据,如果手动编写复杂的ETL脚本或定制化接口&#xff…

2026/8/22 6:23:42 阅读更多 →
聊天机器人UX设计:5个简单技巧提升用户体验与留存率

聊天机器人UX设计:5个简单技巧提升用户体验与留存率

如果你正在开发聊天机器人,可能会遇到这样的困境:技术实现明明没问题,但用户就是不爱用。消息回复生硬、交互流程混乱、用户不知道下一步该做什么……这些问题往往不是后端逻辑的缺陷,而是用户体验(UX)设计…

2026/8/22 18:08:40 阅读更多 →
Godot 4 核心工具 remap() 函数详解:数值映射与实战应用

Godot 4 核心工具 remap() 函数详解:数值映射与实战应用

这次我们来看一个 Godot 游戏引擎中非常核心但容易被忽视的数学工具:remap()函数。它不是用来渲染炫酷特效的,而是解决游戏开发中一个高频痛点——数值转换。比如,你的角色经验值从 0 到 1000,但 UI 进度条的长度是 0 到 400 像素…

2026/8/21 2:23:47 阅读更多 →

最新新闻

AlwaysOnTop:免费开源的一键窗口置顶工具,把任意 Windows 窗口固定在最前面

AlwaysOnTop:免费开源的一键窗口置顶工具,把任意 Windows 窗口固定在最前面

AlwaysOnTop:免费开源的一键窗口置顶工具,把任意 Windows 窗口固定在最前面 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop AlwaysOnTop 是一款免费开源的…

2026/8/22 18:08:10 阅读更多 →
Hugging FaceSafeTensors 源码架构分析:面向大模型权重安全加载的 Rust 与 Python 设计

Hugging FaceSafeTensors 源码架构分析:面向大模型权重安全加载的 Rust 与 Python 设计

Hugging Face SafeTensors 源码架构分析:面向大模型权重安全加载的 Rust 与 Python 设计本文基于 Hugging Face safetensors 仓库提交 6eb4dc9a28ebce297606e0f4836bbf28839cacef 的可复现源码快照整理。 分析仅依据目录、构建配置、测试文件和抽样源码等静态证据&a…

2026/8/22 18:08:10 阅读更多 →
园区管理系统推荐:从瓦片经济到产业运营的范式跃迁

园区管理系统推荐:从瓦片经济到产业运营的范式跃迁

核心摘要产业园区竞争已从比地段、比租金转向比服务和比产业生态。2026年6月,明源云正式发布园区招运服一体化平台,以数智招商中心、空间运营中心、产业服务中心三大模块支撑园区从空间租赁向运营服务升级。本文基于多家城投国企实践案例,为园…

2026/8/22 18:08:10 阅读更多 →
2026 AI五大热点实战:我用MonkeyCode一次跑通了推理、多模态、RAG、MCP与人机协作

2026 AI五大热点实战:我用MonkeyCode一次跑通了推理、多模态、RAG、MCP与人机协作

2026 年的 AI 行业,已经不再是"会不会用大模型"的问题,而是"怎么把大模型真正用起来、用出生产力"的问题。推理模型、多模态、RAG、MCP、上下文工程……一个又一个热点轮番登场,朋友圈里人人都在讲,可真到自己…

2026/8/22 18:08:10 阅读更多 →
MeteoInfo气象GIS与科学计算环境:5步跑通地图可视化与Jython分析

MeteoInfo气象GIS与科学计算环境:5步跑通地图可视化与Jython分析

MeteoInfo气象GIS与科学计算环境:5步跑通地图可视化与Jython分析 【免费下载链接】MeteoInfo MeteoInfo: GIS, scientific computation and visualization environment. 项目地址: https://gitcode.com/gh_mirrors/me/MeteoInfo 气象数据散落在 NetCDF、GRIB…

2026/8/22 18:08:10 阅读更多 →
超图与多智能体协同:解决POI推荐中多模态信息缺失的工程实践

超图与多智能体协同:解决POI推荐中多模态信息缺失的工程实践

1. 项目概述:当推荐系统遇上“信息缺失”与“群体智慧”在推荐系统的世界里,我们常常面临一个经典困境:用户和物品(比如一个地点、一部电影)之间的交互数据是稀疏且不完整的。更棘手的是,描述这些物品的特征…

2026/8/22 18:07:10 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

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