wails 集成 sveltekit 可行但需手动替换 frontend 目录、改用 adapter-static、配置 prerender、修正 wails.json 中 build/dist 路径,并注意 base 为空、window.wails.ready 初始化时机及 json 序列化传参。

Wails 集成 Svelte 是可行的,但默认 wails init -t svelte 生成的是传统 Svelte(非 SvelteKit)项目,而多数人实际想用的是 SvelteKit —— 它更现代、路由更规范,但也需要手动适配。直接跑 wails dev 很可能卡在构建或路由错误上。
为什么 wails init -t svelte 生成的不是 SvelteKit?
Wails v2/v3 官方模板中的 svelte 模板基于 Svelte 4 + Vite,不带 SvelteKit 运行时和 SSR 能力。它适合轻量 UI,但如果你需要 $lib、+layout.svelte 或静态导出能力,就得自己替换前端骨架。
- 官方模板的
frontend/是纯 Svelte 组件 +main.js入口,无src/routes/ - SvelteKit 项目结构完全不同:有
src/routes/、svelte.config.js、package.json中含build和preview脚本 -
wails dev默认调用npm run build,而 SvelteKit 的构建命令是npx svelte-kit build,必须对齐
如何正确集成 SvelteKit 到 Wails?
核心是「替换 frontend 目录 + 改写构建流程」,不能依赖模板自动生成。Wails 只负责加载最终产出的 dist/ 静态文件,不管你怎么生成它。
- 删除原始
frontend/,执行npm create svelte@latest frontend,选Skeleton project(不要选 “SvelteKit demo”,它带服务端逻辑,Wails 不需要) - 修改
frontend/svelte.config.js:把adapter-auto换成adapter-static,并确保prerender: { default: true } - 在
frontend/package.json的scripts中确认存在"build": "svelte-kit build" - 编辑项目根目录的
wails.json,将frontend:build改为"npm run build --prefix frontend"(注意--prefix) - 首次运行
wails dev若报all routes must be fully prerenderable,说明有动态路由(如src/routes/blog/[slug]),删掉或改用src/routes/blog/[slug]/+page.svelte+export const prerender = true
Go 后端调用 SvelteKit 页面里的函数要注意什么?
Wails 的 JS 运行环境不是浏览器全局上下文,而是 WebView 内嵌环境。SvelteKit 构建后所有逻辑都打包进 dist/client/index.js,但 window 对象初始化时机比你想象的晚。
-
window.wails在document.readyState === 'complete'后才可用,不能在<script></script>标签里直接访问 - 必须等
window.wails.ready回调触发后再注册事件监听:window.wails.ready(() => { window.wails.events.on('data_updated', handler) }) - 若用
onMount注册,需确保该组件是首屏渲染的(比如+layout.svelte或+page.svelte),否则监听会漏发 - Go 端调用前端函数(如
runtime.Events.Emit("data_updated", data))传参必须是 JSON-serializable;SvelteKit 中接收方建议用JSON.parse(JSON.stringify(data))防止 Proxy 对象问题
打包后白屏或资源 404 怎么排查?
这不是代码逻辑错误,而是路径映射失效。SvelteKit 默认输出到 frontend/dist/client/,但 Wails 默认从 frontend/dist/ 读取 —— 少了一层 client。
- 检查
wails.json中frontend:dist字段是否为"frontend/dist/client"(SvelteKit v4.5+ 默认路径) - 运行
wails build -platform darwin后,进入build/darwin/myapp.app/Contents/Resources/dist/,确认里面有没有index.html和assets/ - 如果只有空文件夹,说明构建没成功:手动进
frontend/执行npx svelte-kit build,看终端是否报错(常见于import.meta.env未定义,需在svelte.config.js中加env: {}) - macOS 上双击无反应,优先终端运行
./myapp.app/Contents/MacOS/myapp,看是否输出FATAL: failed to load index.html—— 那就是dist路径错了
最易被忽略的一点:SvelteKit 的 base 配置。Wails 加载的是本地 file:// 协议页面,不是 http://,所以 svelte.config.js 中不要设 kit.paths.base = '/app',保持默认空字符串即可,否则所有 fetch() 和资源路径都会挂掉。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











