Repository navigation
v0.1.0
v0.1.0 — 第一个版本:三个库串成一条完整链路
第一个可以下载的版本。目标是最小但完整:用最少的依赖证明
cpp-httplib(HTTP 服务)+ webview(原生窗口)+ cpp-embedlib(前端打包进可执行文件)
这三件事能真的串起来,而不是各写各的 demo。
它是什么
跑起来是一个原生窗口,界面是本地 HTML 页面,但它不是从磁盘读的:
HTML / CSS / JS 全部被 cpp-embedlib 编译进了可执行文件,由后台的 cpp-httplib 服务器
从内存里发出来,窗口本身由 webview 创建(Windows 上是 Edge WebView2,
Linux 上是 GTK + WebKitGTK)。webview 用的是 0.12.0 的 C++ API,
窗口对象放栈上、靠 RAII 析构销毁。
里面有什么
- 6 个 HTTP 接口(全部返回
application/json; charset=utf-8):
GET /api/hello(C++ 后端的问候)、GET /api/time(本地时间 + 运行时长)、
GET /api/echo?q=…(回显与长度)、POST /api/add(表单a+b求和,缺参数返回 400)、
GET /api/assets(列出被内嵌的前端资源:路径 / MIME / 字节数)、
GET /api/info(三个库的版本 + 平台 + pid + uptime)。
首页/由cpp-embedlib的httplib::mount()兜底提供。 - 3 个 JS → C++ 绑定(走
webview::bind,完全不经过 HTTP):
cppNativeEcho(把文本交给 C++ 处理再回传)、cppNativeHandle(拿到原生窗口句柄,
Windows 是HWND、Linux 是GtkWidget *)、cppCloseWindow(关闭窗口、结束消息循环)。
这些回调跑在 UI 线程上,HTTP 服务跑在后台线程。 - 端口:默认在
127.0.0.1上自动挑一个空闲端口,也可以用--port 18080指定;
端口被占用时弹对话框说明原因,而不是静默失败。 - 依赖全部自动拉取:cpp-httplib v0.38.0、webview 0.12.0、cpp-embedlib(main),
三个都走FetchContent,不用手动 clone。 - 构建:CMake ≥ 3.20 + 预设(Windows:
x64/x64-console;Linux:linux/linux-debug)。
Windows 默认不弹控制台黑框,调试时用x64-console。 - CI:
windows-latest+ubuntu-22.04双平台配置与编译,Linux 侧另跑一遍 HTTP 冒烟测试。
下载
| 文件 | 平台 | 运行前提 |
|---|---|---|
webview-demo-v0.1.0-windows-x64.exe |
Windows 10/11 x64 | WebView2 运行时(Win11 及较新的 Win10 一般自带) |
webview-demo-v0.1.0-linux-x64 |
Linux x64 | WebKitGTK 4.1(libwebkit2gtk-4.1-0)+ 可用的显示环境 |
两个二进制都是推 tag 之后由 CI 现场从该 commit 编出来的,不是手工上传的。
已知限制
- macOS 未验证:webview 在 macOS 上走 WKWebView,代码里也留了分支,
但构建脚本和 CI 都没有覆盖它,所以不敢说能跑。 - 没有 install / 打包步骤:产物就是单个可执行文件(前端已经在里面了),
但 Windows 侧依赖系统的 WebView2 运行时,Linux 侧依赖系统的 WebKitGTK ——
这两样都要求运行环境里已经装好。 - JSON 还是手写转义拼出来的;把这件事交给一个成熟的 JSON 库是后面版本的事。
完整变更
https://github.com/leiddev/webview-httplib-demo/commits/v0.1.0
(v0.1.0 是第一个 tag,没有可比较的上一个版本,所以给的是到这个 tag 为止的全部提交。)
这段说明是事后补写的:v0.1.0 发布时还没有「手写发布说明」的约定
(release-notes/<tag>.md是 v0.1.1 才加的),正文当时只有一行自动生成的 changelog 链接。