本地调试模式
框架封装 vite dev server 启停,dev/prod 仅 cmake.toml 一行开关切换。
- dev(
WEBVIEW_DEV="ON"):cmake 跳 vite build + 资源打包;exe 启自动拉起 vite dev server + 连 localhost 热更新。 - prod(删/注释):cmake configure 期自动 vite build + 打包进 exe。
dev:热更新开发
cmake.toml 加(消费方,cmkr [variables]):
toml
[variables]
WEBVIEW_DEV = "ON" # 注释掉或删则 prodbuild + 跑 exe:
- cmake 读
WEBVIEW_DEV→ 跳 vite build + 资源打包(dev 不打包 html,用 dev server)+target_compile_definitions(webview PUBLIC WEBVIEW_DEV)(消费方编译 inherit) - exe 启:webview.hpp inline ctor(
#ifdef WEBVIEW_DEV)→configureDev→ kill 占用 5173 进程 + spawncmd /c npm run dev(异步,不阻塞窗口,无黑窗口,输出捕到 perf)+ 连http://localhost:5173 - 窗口立即显示(不等 vite),改
web/src/**保存 → 页面热更新(vite HMR),无 rebuild - 关 exe → vite kill(JobObject,崩溃也清)
prod:构建期自动 vite build
删/注释 cmake.toml 的 WEBVIEW_DEV → cmake --build configure 期自动 cmd /c npm run build(web/ → src/assets/html)+ gen_assets_rc 打包进 exe(.rc/.7z)。
改 web/src/** 触发 reconfigure(CMAKE_CONFIGURE_DEPENDS)→ 重跑 vite build。
机制
消费方 cmake.toml [variables] WEBVIEW_DEV="ON"
→ cmkr set(WEBVIEW_DEV "ON")
→ 框架 FetchContent cmake:
if(WEBVIEW_DEV) target_compile_definitions(webview PUBLIC WEBVIEW_DEV)
跳 vite build + asset 打包
→ 消费方编译 webview.hpp(inherit WEBVIEW_DEV)
inline ctor #ifdef → App::configureDev(WEBVIEW_DEV_CWD, 5173) 设 devPending_
→ createWindow if(devPending_):
opts.url = localhost:5173
DevServer: killPortOccupant(5173) + CreateProcess npm run dev(异步)
Window::create 立即(不等 vite,窗口先显)DevServer(detail/dev_server.hpp):
killPortOccupant(5173):GetExtendedTcpTable 找 LISTENING PID + TerminateProcess(占用直接杀,不检测)CreateProcess cmd /c npm run dev+CREATE_NO_WINDOW(无黑窗口)+ stdout pipe 捕到 perf(后台线程按行读,不阻塞)- JobObject
KILL_ON_JOB_CLOSE:exe 退出/崩溃 → OS kill 整子进程树,无孤儿 - 不等 vite ready:窗口立即显示,opts.url=localhost 直接载(vite 启动期间页面空白,ready 后 F5 或浏览器重连)
cwd 来源:cmake bake WEBVIEW_DEV_CWD="${CMAKE_SOURCE_DIR}/web"(PUBLIC),inline ctor 用。
约束
- web/ 需
npm install(node_modules) - 固定端口 5173(被占直接杀占用进程)
- Win 子进程(CreateProcess + JobObject + iphlpapi),仅 Windows
- dev 首次载入慢(vite cold start + on-demand transform,非 webview 阻塞)