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

零基础搭建OCR文字检测系统:科哥开发的WebUI一键启动指南

零基础搭建OCR文字检测系统:科哥开发的WebUI一键启动指南 你是不是也遇到过这些场景: * 手里有一堆发票、合同、证件照片,想快速提取上面的文字,却要一张张手动敲? * 截图里的操作说明看不清,放大后更模糊,复制又不支持? * 做电商运营,每天要处理上百张商品图,光是找图中文字就耗掉半天? 别再靠截图+人工抄写了。今天带你用零代码、零配置、零环境依赖的方式,5分钟内跑起一个专业级OCR文字检测系统——它不是调用API,而是本地部署、完全可控、永久免费的WebUI工具,由开发者“科哥”亲手打造,开箱即用。 这不是Demo,不是演示,而是一个真正能放进工作流、每天稳定运行的OCR检测服务。下面我们就从按下第一个命令开始,手把手带你走完全部流程。 1. 为什么选这个镜像:轻量、精准、开箱即用 cv_resnet18_ocr-detection 这个名字听起来有点技术味,但它的设计哲学非常朴素:把OCR检测这件事,做成和打开网页一样简单。 它不像传统OCR方案那样需要装CUDA、编译OpenCV、下载预训练权重、改配置文件…

从 Renderless 架构到 WebAgent:我的 OpenTiny 前端智能化实战之路

从 Renderless 架构到 WebAgent:我的 OpenTiny 前端智能化实战之路

一、缘起:为什么我要给 DialogBox 加上"resizable"能力? 说起来挺有意思的。作为一名在企业级应用开发一线摸爬滚打多年的前端,DialogBox 这个组件我用了不下百次。但每次用的时候,总觉得差点意思——用户想自己调整弹窗大小?不好意思,不支持。 直到我参加了 OpenTiny NEXT 前端智能化系列直播,听到老师讲 AI Agent 和 WebMCP 的时候,我突然意识到:这不就是我一直在等的那个契机吗? 传统的组件开发模式是:开发者定义好所有功能,用户只能被动接受。但在 AI 时代,组件应该是"可对话"的——用户说"我想把这个弹窗调大一点",AI 就能理解意图并调用相应的 API。 但要实现这个愿景,首先得让组件具备足够的能力。

BAAI/bge-m3环境部署教程:从零配置到WebUI运行完整步骤

BAAI/bge-m3环境部署教程:从零配置到WebUI运行完整步骤 1. 学习目标与前置准备 本教程将带领您完成 BAAI/bge-m3 语义相似度分析引擎的完整部署流程,涵盖环境搭建、模型加载、服务启动及 WebUI 使用等关键环节。通过本文,您将能够: * 在本地或云服务器上成功部署 bge-m3 模型推理环境 * 理解基于 sentence-transformers 的文本向量化实现机制 * 启动并访问可视化 WebUI 界面进行语义相似度测试 * 验证 RAG 场景下的文本召回质量 1.1 前置知识要求 为确保顺利跟随本教程操作,请确认已掌握以下基础知识: * 基础 Linux 命令行使用能力(文件操作、权限管理) * Python 编程基础(了解 pip 包管理工具) * 对 NLP 中“文本嵌入”和“余弦相似度”有基本理解

Web基石:Java Servlet 全面指南:从基础原理到 Spring Boot 实战

Web基石:Java Servlet 全面指南:从基础原理到 Spring Boot 实战

这是一份非常详细、实用、通俗易懂、权威且全面的 Java Servlet 指南,涵盖了其方方面面,包括在 Spring Boot 中的应用,并提供了可直接在 IDE 中运行的最佳实践代码和完整案例。 目录 1. Servlet 概述 * 1.1 什么是 Servlet? * 1.2 为什么需要 Servlet? * 1.3 Servlet 与 CGI 的比较 * 1.4 Servlet 在 Web 应用中的位置 2. Servlet API 核心 * 2.1 javax.servlet 包 (jakarta.servlet)