Skip to content

本地调试模式

框架封装 vite dev server 启停,dev/prod 仅 cmake.toml 一行开关切换。

  • devWEBVIEW_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"      # 注释掉或删则 prod

build + 跑 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 进程 + spawn cmd /c npm run dev(异步,不阻塞窗口,无黑窗口,输出捕到 perf)+ 连 http://localhost:5173
  • 窗口立即显示(不等 vite),改 web/src/** 保存 → 页面热更新(vite HMR),无 rebuild
  • 关 exe → vite kill(JobObject,崩溃也清)

prod:构建期自动 vite build

删/注释 cmake.tomlWEBVIEW_DEVcmake --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,窗口先显)

DevServerdetail/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 阻塞)

下一步