从工具碎片化到一体化:yyzTools 如何用 C++ + WebView2 重构 Windows 桌面效率工作流

0 阅读6分钟

作为前端/全栈开发者,你一定经历过「效率工具矩阵」的痛苦——十个独立工具各自为战,数据不互通,快捷键打架。本文从前端开发者视角拆解 yyzTools 如何用混合架构解决这个问题。

一、问题:前端开发者的工具碎片化困境

日常开发中,前端/全栈开发者常用的效率工具大概长这样:

场景常用工具
应用启动PowerToys Run / Flow Launcher
文件搜索Everything
剪贴板历史Ditto / Windows 自带
翻译DeepL + 浏览器划词插件
OCR在线工具 / Umi-OCR
JSON 格式化浏览器开 jsonformatter.org
正则测试regex101.com
Base64 编解码浏览器开 tool
哈希校验命令行 openssl 或在线工具
截图Snipaste
文件预览QuickLook
批量重命名独立小工具

这些工具各有各的快捷键、设置逻辑、更新渠道。更关键的是——它们之间没有数据流动:剪贴板里的内容没法直接丢给 OCR,OCR 结果没法直接送翻译,JSON 格式化的结果没法直接回填剪贴板。

yyzTools 的解决方案是:把这些功能原生融合进一个安装包,共享同一套数据层,功能之间可以联动。

二、架构:C++ + WebView2 + 前端

作为前端开发者,最关心的是:这个工具的技术架构是什么样的?能不能用我熟悉的 Web 技术来理解?

分层架构

┌─────────────────────────────────────────┐
│        前端页面 (Alpine.js + 原生 JS)      │
│   cmdplate / ocr / translate / ...      │
│   通过 web/lib/zen_api.js 调用           │
├─────────────────────────────────────────┤
│      WebView2 桥接层                      │
│   BindSync → 同步返回                      │
│   BindAsync → 异步回调(仅耗时操作)        │
├─────────────────────────────────────────┤
│        C++ NativeApi 层                   │
│   FileManager / ProcessManager /          │
│   ClipboardManager / OcrManager /        │
│   DownloadManager / CmdManager ...        │
├─────────────────────────────────────────┤
│          Win32 系统 API                    │
└─────────────────────────────────────────┘

这本质上和 Electron 应用类似——都是「前端做 UI + 原生层做系统能力」。但区别在于:

  • Electron 捆绑了一个完整的 Chromium,内存开销大
  • yyzTools 用 WebView2(Windows 自带的 Edge 内核),不额外捆绑浏览器引擎,内存更省
  • 前端框架用的是 Alpine.js(3KB gzip)而非 React/Vue,没有虚拟 DOM 开销,也没有构建链的复杂性
  • 构建工具用 Vite 多入口,每个功能页面独立打包

桥接机制详解

前端不直接调 window.Zen,而是统一通过 web/lib/zen_api.js 的 ZenAPI 封装类:

// zen_api.js 封装示例
class ZenAPI {
    static isOk(res) {
        return String(res.error) === '0';
    }

    static async getConfig() {
        const res = await window.Zen.getConfig();
        return res;
    }

    static async searchApp(keyword) {
        const res = await window.Zen.searchApp(keyword);
        return res;
    }
}

C++ 侧的注册(NativeApi::SetupBindings()):

// 同步绑定(绝大多数方法)
m_bindManager->BindSync("getConfig", [this]() {
    return this->GetConfig();
});

// 异步绑定(仅耗时操作,如 OCR)
m_bindManager->BindAsync("ocrRecognition",
    std::bind(&NativeApi::OcrRecognition, this,
        std::placeholders::_1,
        std::placeholders::_2  // 回调参数
    )
);

一个值得注意的类型陷阱

C++ 有两条 JSON 生成路径,同一个 error 字段类型不同:

路径error 类型
手拼字符串数字 0
boost::property_tree字符串 "0"

所以前端不能直接比较 res.error === 0,必须用 ZenAPI.isOk(res)(内部 String(res.error) === '0' 归一化)。

这个设计对前端开发者来说很好理解——就像 API 返回的数字在某些序列化路径下变成了字符串,需要统一归一化处理。

三、前端开发者最该关注的功能

3.1 命令面板:一个搜索框贯穿整台电脑

Alt + 空格 唤起,前缀切换搜索域:

前缀功能对标工具
应用+系统命令搜索PowerToys Run
f全盘文件搜索Everything
p进程搜索任务管理器
w窗口搜索
b书签搜索
c剪贴板历史Ditto
>命令行执行终端

还有即时计算——输入 128*0.85 直接出结果。作为经常要算 padding/margin 的前端开发者,这个功能比开 DevTools 的 Console 还快。

3.2 开发者工具集

这一组功能对前端开发者特别实用:

正则表达式测试器

输入文本:test@example.com, hello@world.org
正则:^[\w.-]+@[\w.-]+.\w+$

→ 逐行匹配高亮,分组查看

编码解码

Base64 编码:hello → aGVsbG8=
URL 解码:%E4%BD%A0%E5%A5%BD → 你好
HTML 实体:&lt;div&gt; → <div>
Unicode:\u4f60\u597d → 你好

数据转换——前端配置文件格式互转:

// JSON 输入
{"name":"app","version":"1.0","dev":true}
# YAML 输出
name: app
version: '1.0'
dev: true
# TOML 输出
name = "app"
version = "1.0"
dev = true
<!-- XML 输出 -->
<root>
  <name>app</name>
  <version>1.0</version>
  <dev>true</dev>
</root>

哈希计算——校验文件完整性或生成内容指纹:

SHA-256("hello") → 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

3.3 剪贴板 + OCR + 翻译联动

这是 yyzTools 最能体现「融合」价值的功能链:

截图 OCR 识别 → 一键送翻译 → 一键回填剪贴板

场景:你在看一篇英文技术文档的截图,想翻译其中的代码注释——

  1. Ctrl+Shift 框选截图区域 → OCR 识别文字
  2. 识别结果面板点击「翻译」→ 翻译结果出现
  3. 点击「复制」→ 回填剪贴板

整个过程不切换窗口、不打开浏览器、不联网(翻译除外)。

3.4 文件预览

空格键预览文件,前端开发者可能需要的格式:

格式场景
代码文件(语法高亮)快速查看 .js/.ts/.vue/.css
压缩包看 node_modules tarball 目录树
图片设计稿预览
PDF需求文档查看
视频录屏回放

四、扩展开发:JSON 即插件

作为前端开发者,你可能想往命令面板里加自己的快捷入口。yyzTools 的扩展方式极其轻量——一个 JSON 文件就是一条新命令:

{
    "id": "local-dev-server",
    "type": "app",
    "name": {
        "zh_cn": "本地开发服务器",
        "en": "Local Dev Server"
    },
    "desc": {
        "zh_cn": "一键打开 localhost:5173",
        "en": "Quick open localhost:5173"
    },
    "cmdPath": "yyzBrowser.exe",
    "cmdArgs": "--url=http://localhost:5173 --size=1200x800"
}

放到 Modules/App/ 目录下,下次打开命令面板搜「本地开发」就能命中。不需要编译,不需要重启。

多语言文案规则

  • 语言码用下划线小写:zh_cnenjako...
  • 支持三级回落:当前语言 → en → 纯字符串
  • 纯字符串写法 "name": "本地开发服务器" 依然有效

五、与前端工具链的关系

yyzTools 不是要替代你的开发工具链(VSCode、Git、Node.js 等),而是补充那些散落在浏览器标签和系统工具里的操作:

yyzTools 替代原来的方式
命令面板搜索应用开始菜单 / PowerToys Run
即时计算DevTools Console
JSON 格式化jsonformatter.org
正则测试regex101.com
Base64 编解码在线工具
截图Snipaste / Win+Shift+S
文件预览QuickLook
剪贴板历史Ditto / Windows 自带

把这些「偶尔需要但不想为它开一个窗口」的操作收敛到一个搜索框里,是 yyzTools 对前端开发者的核心价值。

六、获取

  • 官网:yyztools.com
  • 价格:永久免费,无需注册
  • 系统:Windows 10 1809+ / 11,64 位
  • 版本:v1.0.3.1300

总结:yyzTools 用 C++ + WebView2 + Alpine.js 的混合架构,把 40+ 效率工具融合进一个安装包。对前端开发者来说,它替代的不是你的 IDE,而是那些散落在浏览器标签和系统角落里的零碎操作。JSON 即插件的扩展模式也让定制成本极低。如果你厌倦了在十个工具之间来回切换,可以试试。

yyzTools 官网:yyztools.com · 永久免费 · 本地优先 · 12 种语言