Tauri 前端配置把任何前端框架“正确地”接进 Tauri(含 Vite/Next/Nuxt/Qwik/SvelteKit/Leptos/Trunk)

1. 配置清单:先把底层规则记住

把下面三条当作 Tauri 前端接入的硬规则:

  1. 只走静态路线:SSG / SPA / MPA
    Tauri 不原生支持基于服务端的方案(例如 SSR)。(Tauri)
  2. 移动端真机开发必须有“可被设备访问”的 dev server
    需要让 dev server 绑定到你的内网 IP(或按 Tauri CLI 提供的 host),否则 iOS/Android 真机加载不到页面。(Tauri)
  3. 保持标准的 Client ↔ API 模式
    不要把 SSR 那种“前端渲染与 API 混在一起”的混合模式搬进 Tauri(因为 Tauri 本身不是 Node runtime)。(Tauri)

2. Tauri 侧关键配置位:你最常改的是 build 这四个字段

无论你用什么前端,最终基本都要把这几项在 src-tauri/tauri.conf.json 配好:

  • build.devUrl:开发模式加载哪个 dev server 地址
  • build.frontendDist:打包时把哪个目录当作静态资源目录(dist/out/build 等)
  • build.beforeDevCommand:跑 tauri dev 前先执行什么(通常是 npm/pnpm/yarn dev
  • build.beforeBuildCommand:跑 tauri build 前先执行什么(通常是 npm/pnpm/yarn build/generate

官方在 Vite/Next/Nuxt/SvelteKit/Trunk 等指南里都是这个套路。(Tauri)

一个非常典型的(以 Vite 为例):

{"build":{"beforeDevCommand":"pnpm dev","beforeBuildCommand":"pnpm build","devUrl":"http://localhost:5173","frontendDist":"../dist"}}

(Tauri)

3. 框架推荐配置

3.1 Vite(官方最推荐的 JS 方案)

官方明确:大多数 SPA 框架(React/Vue/Svelte/Solid)推荐用 Vite。(Tauri)

Tauri 配置(重点是 devUrl、frontendDist、两个 before 命令):(Tauri)

{"build":{"beforeDevCommand":"pnpm dev","beforeBuildCommand":"pnpm build","devUrl":"http://localhost:5173","frontendDist":"../dist"}}

Vite 配置(移动端真机关键:吃 TAURI_DEV_HOST;并忽略 watching src-tauri;HMR 在真机时走 ws):(Tauri)

import{ defineConfig }from'vite';const host = process.env.TAURI_DEV_HOST;exportdefaultdefineConfig({clearScreen:false,server:{port:5173,strictPort:true,host: host ||false,hmr: host ?{protocol:'ws', host,port:1421}:undefined,watch:{ignored:['**/src-tauri/**'],},},envPrefix:['VITE_','TAURI_ENV_*'],build:{target: process.env.TAURI_ENV_PLATFORM=='windows'?'chrome105':'safari13',minify:!process.env.TAURI_ENV_DEBUG?'esbuild':false,sourcemap:!!process.env.TAURI_ENV_DEBUG,},});

3.2 Next.js(必须静态导出)

核心结论就一句:Next.js 要用静态导出 output: 'export',并把 out/ 作为 frontendDist。(Tauri)

Tauri 配置:

{"build":{"beforeDevCommand":"pnpm dev","beforeBuildCommand":"pnpm build","devUrl":"http://localhost:3000","frontendDist":"../out"}}

(Tauri)

Next 配置(两个很关键的坑位:images.unoptimized、开发态 assetPrefix):(Tauri)

const isProd = process.env.NODE_ENV==='production';const internalHost = process.env.TAURI_DEV_HOST||'localhost';/** @type {import('next').NextConfig} */const nextConfig ={output:'export',images:{unoptimized:true},assetPrefix: isProd ?undefined:`http://${internalHost}:3000`,};exportdefault nextConfig;

3.3 Nuxt(SSG:关闭 SSR + generate)

Nuxt 指南同样强调:设置 ssr: false 走 SSG,并用 nuxi build/generate 产物接给 Tauri。(Tauri)

Tauri 配置(build 用 generate,dist 用 ../dist):(Tauri)

{"build":{"beforeDevCommand":"pnpm dev","beforeBuildCommand":"pnpm generate","devUrl":"http://localhost:3000","frontendDist":"../dist"}}

Nuxt 配置里对移动端真机/开发体验做了几处“非常工程化”的增强:

  • devServer.host: '0' 让 dev server 可被其他设备发现
  • vite.envPrefixTAURI_ 环境变量也暴露给前端
  • ignore: ['**/src-tauri/**'] 避免 watch 导致文件句柄过多等问题(Tauri)
exportdefaultdefineNuxtConfig({ ssr:false, devServer:{ host:'0'}, vite:{ clearScreen:false, envPrefix:['VITE_','TAURI_'], server:{ strictPort:true},}, ignore:['**/src-tauri/**'],});

3.4 Qwik(用 Static Adapter 做 SSG)

Qwik 这类偏 SSR 的框架接 Tauri,核心就是:走 SSG(Static adapter),产物目录用 dist/。(Tauri)

Tauri 配置示例(dist + devUrl 5173):(Tauri)

{"build":{"devUrl":"http://localhost:5173","frontendDist":"../dist","beforeDevCommand":"pnpm dev","beforeBuildCommand":"pnpm build"}}

3.5 SvelteKit(static adapter + 关闭 SSR;prerender 要谨慎)

SvelteKit 官方指南点得很清楚:用 adapter-static 走 SSG/SPA,并把 build/ 作为 frontendDist。(Tauri)

更重要的是:如果你启用了 prerender,构建阶段的 load 函数拿不到 Tauri API;因此更推荐 SPA(不 prerender),让 load 只在 WebView 里执行。(Tauri)

Tauri 配置:

{"build":{"beforeDevCommand":"pnpm dev","beforeBuildCommand":"pnpm build","devUrl":"http://localhost:5173","frontendDist":"../build"}}

(Tauri)

SvelteKit 配置(fallback 到 index.html,配合 SPA 路由):(Tauri)

import adapter from'@sveltejs/adapter-static';import{ vitePreprocess }from'@sveltejs/vite-plugin-svelte';const config ={preprocess:vitePreprocess(),kit:{adapter:adapter({fallback:'index.html'}),},};exportdefault config;

并在根布局关闭 SSR:(Tauri)

exportconst ssr =false;

3.6 Rust 前端(Leptos / Trunk):WASM 工程的两个关键点

Leptos 与 Trunk 的指南里,除了“走 SSG”之外,有两个移动端相关的关键配置:

  • serve.ws_protocol = "ws":确保热更新 websocket 在移动端连接正常
  • withGlobalTauri: true:把 Tauri API 挂到 window.__TAURI__,便于 wasm-bindgen 引入/调用(Tauri)

Leptos(Trunk)示例:(Tauri)

src-tauri/tauri.conf.json

{"build":{"beforeDevCommand":"trunk serve","devUrl":"http://localhost:1420","beforeBuildCommand":"trunk build","frontendDist":"../dist"},"app":{"withGlobalTauri":true}}

Trunk.toml

[watch] ignore = ["./src-tauri"] [serve] port = 1420 open = false ws_protocol = "ws" 

(Tauri)

4. 移动端真机开发:别硬写 0.0.0.0,优先用 TAURI_DEV_HOST

Tauri 在移动端开发时会通过 TAURI_DEV_HOST 告诉你“应该监听哪个地址”,尤其是 iOS 真机存在更安全的设备地址/隧道地址选择流程。(Tauri)

结论是:

  • 你的 dev server host 要能读取 process.env.TAURI_DEV_HOST
  • HMR websocket 也要按 host 调整(Vite 官方示例已给出)(Tauri)

如果你是用 create-tauri-app 创建的项目,官方也说明:移动端所需的 dev server 配置通常已经帮你配好了。(Tauri)

5. 常见“白屏/资源 404”排坑清单

这些坑我建议你在团队 wiki 里直接当“发布前检查”:

  • 资源路径必须在打包后仍可解析
    很多白屏本质是“静态资源路径错了”,尤其你给 Vite/框架配置了自定义 base path 时,dev 正常、build 后 WebView 找不到 js/css(看起来像 MIME 错/404)。(GitHub)
  • 元框架在 dev 模式下可能需要显式配置 asset 前缀
    Next.js 的 assetPrefix 就是为了让 dev server 下资源解析正确(尤其移动端/非 localhost 情况)。(Tauri)
  • SPA 路由要有 fallback
    SvelteKit adapter-static 的 fallback: 'index.html' 就是典型做法,否则刷新深层路由可能直接 404。(Tauri)

6. 调试体验提醒:Tauri API 只能在 App 窗口里用

一旦你开始调用 Tauri API,你的前端页面就不能“直接用系统浏览器打开”来完全复现了,因为这些 API 只在 Tauri WebView 容器里生效。(Tauri)

如果你特别依赖浏览器 DevTools 的工作流,官方建议用 tauri-invoke-http 把调用桥接成 HTTP 服务来调试。(Tauri)

Read more

从零开始“养龙虾”:OpenClaw 本地极简部署与 QQ 机器人接入全保姆级教程

从零开始“养龙虾”:OpenClaw 本地极简部署与 QQ 机器人接入全保姆级教程

文章目录 * 引言 * 什么是 OpenClaw? * 为什么选择 OpenClaw? * 一、基础环境准备 * 1. 安装 Node.js (v22及以上) * 2.安装 Git * 3. 解决 npm 被拦截(没报错跳过) * 二、一键部署与唤醒“龙虾” * 1.全自动拉取与组装 * 2.醒龙虾与配置“大脑” * 三、接入官方 QQ 机器人(可选) * 1. 领取官方机器人的“身份证” * 2. 本地安装专属通信插件 * 3. 结果展示 * 总结 引言 什么是 OpenClaw? 最近开源界有一只“红皮小龙虾”非常火,它就是 OpenClaw。

Java 大视界 -- Java 大数据在智能家居环境监测与智能调节中的应用拓展(423)

Java 大视界 -- Java 大数据在智能家居环境监测与智能调节中的应用拓展(423)

Java 大视界 -- Java 大数据在智能家居环境监测与智能调节中的应用拓展(423) * 引言: * 快速上手指南:3 步跑通智能家居 Demo(新手友好) * Step 1:环境准备(必装软件清单) * Step 2:代码运行(按顺序执行) * Step 3:效果验证(用 Postman 模拟数据) * 正文: * 一、智能家居环境监测与调节的核心痛点 * 1.1 设备数据的 “异构化” 困境 * 1.1.1 多源数据的 “协议壁垒” * 1.1.2 数据规模的 “爆发式增长” * 1.2 实时调节的 “滞后性” 痛点 * 1.

【离散化 线段树 二分查找】3661可以被机器人摧毁的最大墙壁数目|2525

【离散化 线段树 二分查找】3661可以被机器人摧毁的最大墙壁数目|2525

本文涉及知识点 【C++】树状数组的使用、原理、封装类、样例 C++线段树 C++二分查找 3661. 可以被机器人摧毁的最大墙壁数目 一条无限长的直线上分布着一些机器人和墙壁。给你整数数组 robots ,distance 和 walls: robots[i] 是第 i 个机器人的位置。 distance[i] 是第 i 个机器人的子弹可以行进的 最大 距离。 walls[j] 是第 j 堵墙的位置。 每个机器人有 一颗 子弹,可以向左或向右发射,最远距离为 distance[i] 米。 子弹会摧毁其射程内路径上的每一堵墙。机器人是固定的障碍物:如果子弹在到达墙壁前击中另一个机器人,它会 立即 在该机器人处停止,无法继续前进。

知识库问答机器人:基于SpringAI+RAG的完整实现

知识库问答机器人:基于SpringAI+RAG的完整实现

一、引言 随着大语言模型的快速发展,RAG(Retrieval-Augmented Generation)技术已成为构建知识库问答系统的核心技术之一。本文将带领大家从零开始,使用Spring AI框架构建一个支持文档上传的知识库问答机器人,帮助大家深入理解RAG技术的核心原理和实践应用。 1.1 什么是RAG? RAG(检索增强生成)是一种结合了信息检索和文本生成的技术。它的基本工作流程是: 用户提出问题 系统从知识库中检索相关信息 大语言模型基于检索到的信息生成答案 从系统设计角度触发,RAG 的核心作用可以被描述为: 在LLM调用生成响应之前,由系统动态构造一个“最小且相关的知识上下文”。 请注意两个关键词: 动态 :每次问题都不同,检索的知识也不同(比如用户问 A 产品时找 A 的文档,问 B 产品时找 B 的文档) 最小 :只注入必要信息(比如用户问 “A 产品的定价”,就只塞定价相关的片段,而非整份产品手册) RAG可以有效的弥补上下文窗口的先天不足:不再需要把所有知识塞进窗口,