使用 Farm + Tauri 构建 Vanilla TypeScript 桌面应用:模板结构、开发流程与前后端桥接实战
前端构建构建工具开发工具【免费下载链接】farmExtremely fast Vite-compatible web build tool written in Rust项目地址https://gitcode.com/gh_mirrors/fa/farm点击查看免费下载导读本篇指南围绕 Farm 官方脚手架create-farm-rs内置的tauri/vanilla模板展开讲解如何用原生 HTML、CSS 与 TypeScript 快速搭建一个基于 Tauri 的桌面应用并以 Farm 作为前端构建工具驱动开发、构建与预览全流程。读完本文你将掌握该模板的完整目录结构、tauri.conf.json与farm.config.ts的协作方式、greet命令的前后端桥接原理以及如何用 CLI 一行命令生成项目并跑通tauri dev。关联文档位于 crates/create-farm-rs/templates/tauri/vanilla/README.md本文所有代码与配置均来自该模板目录下的真实文件可对照验证。模板概览Tauri Vanilla TS 是什么tauri/vanilla是 Farm 项目脚手架中面向桌面端的一组模板之一。与 React、Vue、Svelte、Solid、Preact 等带框架的变体不同它刻意保持零框架依赖只使用Vanilla HTML页面骨架由 index.html 直接承载Vanilla CSS全局样式写在 src/styles.css并支持跟随系统自动切换深色/浅色主题TypeScript前端逻辑集中在 src/main.ts通过tauri-apps/api调用 Rust 侧能力。原 README 明确指出该模板的目标是帮助你开始使用 Tauri 进行原生 HTML、CSS 和 TypeScript 开发因此它是学习 Tauri 命令机制、理解 Farm 与 Tauri 双构建系统协作的最小可运行示例。推荐 IDE 环境原文档给出了开发该模板推荐的 IDE 配置核心是 VS Code 搭配两个关键扩展扩展作用TauriTauri 官方扩展提供配置校验、调试与快捷命令rust-analyzerRust 语言服务用于编辑src-tauri下的 Rust 代码时获得补全、诊断与跳转由于本项目同时包含 TypeScript 前端与 Rust 后端建议再配合 VS Code 内置的 TypeScript 支持即可获得完整开发体验。模板中的 gitignore 也预留了.vscode/*但保留!.vscode/extensions.json的规则说明官方期待你在项目中落地一套团队级 IDE 配置。目录结构逐层拆解从 templates/tauri/vanilla 目录看模板分为两大部分tauri/vanilla/ ├── index.html # 前端入口页面 ├── farm.config.ts # Farm 构建配置 ├── package.json # 前端脚本与依赖声明 ├── tsconfig.json # TypeScript 编译配置 ├── src/ │ ├── main.ts # 前端 TS 逻辑调用 Tauri command │ ├── styles.css # 全局样式 │ └── assets/ # 展示用 logoFarm/Tauri/TS └── src-tauri/ # Tauri 后端Rust ├── Cargo.toml # Rust 依赖清单 ├── tauri.conf.json # Tauri 核心配置 └── src/main.rs # Rust 入口与 command 定义前端部分由 Farm 构建后端部分由 Cargo Tauri 构建两者通过固定的开发端口与产物目录衔接。前端Farm 负责构建的 Vanilla TSFarm 配置farm.config.ts 是全模板最简配置import { defineConfig } from farmfe/core; export default defineConfig({ server: { port: 1420 } });关键点在于server.port 1420。这个端口不是随意选的——它必须与 Tauri 侧tauri.conf.json中的devPathhttp://localhost:1420保持一致否则tauri dev启动的 WebView 将无法加载 Farm 的开发服务器页面。两个端口配置必须同步修改这是双构建系统协作的核心约束。入口页面index.html 使用标准 ES Module 方式引入资源link relstylesheet href/src/styles.css / script typemodule src/src/main.ts defer/script页面主体包含一个问候表单输入框 Greet 按钮 结果展示区#greet-msg以及三枚可点击的 LogoFarm、Tauri、TypeScript用于演示前端与 Rust 后端的交互入口。前端逻辑src/main.ts 演示了 Tauri 命令调用import { invoke } from tauri-apps/api/tauri; async function greet() { if (greetMsgEl greetInputEl) { greetMsgEl.textContent await invoke(greet, { name: greetInputEl.value }); } } window.addEventListener(DOMContentLoaded, () { greetInputEl document.querySelector(#greet-input); greetMsgEl document.querySelector(#greet-msg); document.querySelector(#greet-form)?.addEventListener(submit, (e) { e.preventDefault(); greet(); }); });这里invoke(greet, { name: ... })会通过 Tauri 的 IPC 桥把name参数传给 Rust 侧注册的greet命令并把返回的字符串写入页面。表单提交被preventDefault()拦截避免触发页面刷新导致 WebView 重载。包脚本package.json 定义了完整命令链{ scripts: { dev: farm, build: tsc farm build, preview: farm preview, tauri: tauri }, dependencies: { tauri-apps/api: ^1 }, devDependencies: { tauri-apps/cli: ^1, farmfe/cli: beta, farmfe/core: beta, typescript: ^5.0.2 } }farm/farm build/farm preview分别是 Farm 的开发服务器、产物构建与本地预览tsc在构建前做一次类型检查tsconfig.json中noEmit: true只查不产出tauri-apps/api是前端调用 Rust 的运行时依赖tauri-apps/cli是 Tauri 的脚手架 CLI。TypeScript 配置tsconfig.json 采用 Bundler 模式{ compilerOptions: { target: ES2020, module: ESNext, lib: [ES2020, DOM, DOM.Iterable], moduleResolution: bundler, allowImportingTsExtensions: true, resolveJsonModule: true, isolatedModules: true, noEmit: true, strict: true, noUnusedLocals: true, noUnusedParameters: true, noFallthroughCasesInSwitch: true }, include: [src] }moduleResolution: bundler与allowImportingTsExtensions是为 Farm 这类现代打包器准备的strict及noUnused*系列规则让模板默认处于较严格的类型检查水平。后端Rust 侧的 Tauri 壳Rust 入口src-tauri/src/main.rs 是理解整个模板原理的钥匙#![cfg_attr(not(debug_assertions), windows_subsystem windows)] #[tauri::command] fn greet(name: str) - String { format!(Hello, {}! Youve been greeted from Rust!, name) } fn main() { tauri::Builder::default() .invoke_handler(tauri::generate_handler![greet]) .run(tauri::generate_context!()) .expect(error while running tauri application); }三个要点windows_subsystemrelease 构建在 Windows 上不弹出额外控制台窗口注释明确标注DO NOT REMOVE#[tauri::command]宏把greet函数暴露为可被前端invoke调用的命令invoke_handler通过generate_handler!完成注册——这正是前端main.ts中invoke(greet, ...)能命中greet的原因generate_context!()在编译期嵌入tauri.conf.json与图标资源是 Tauri 应用打包的基础。Rust 依赖src-tauri/Cargo.toml[build-dependencies] tauri-build { version 1, features [] } [dependencies] tauri { version 1, features [shell-open] } serde { version 1, features [derive] } serde_json 1 [features] custom-protocol [tauri/custom-protocol]shell-openfeature 对应tauri.conf.jsonallowlist 中shell.open: true的能力点击链接跳转外部浏览器custom-protocolfeature 用于生产构建没有开发服务器时通过自定义协议加载资源注释同样标注DO NOT REMOVEserde/serde_json是 Tauri 命令参数序列化的基础依赖。核心配置src-tauri/tauri.conf.json 把前后端两套构建系统粘合在一起{ build: { beforeDevCommand: pnpm dev, beforeBuildCommand: pnpm build, devPath: http://localhost:1420, distDir: ../dist, withGlobalTauri: true }, package: { productName: FARM-TEMPLATE-NAME, version: 0.0.0 }, tauri: { allowlist: { all: false, shell: { all: false, open: true } }, windows: [ { title: FARM-TEMPLATE-NAME, width: 800, height: 600 } ], security: { csp: null }, bundle: { active: true, targets: all, identifier: com.tauri.dev, icon: [ icons/32x32.png, icons/128x128.png, icons/128x1282x.png, icons/icon.icns, icons/icon.ico ] } } }逐项说明字段值含义beforeDevCommandpnpm devtauri dev之前自动启动 Farm 开发服务器beforeBuildCommandpnpm buildtauri build之前先执行类型检查 Farm 产物构建devPathhttp://localhost:1420开发模式下 WebView 加载的地址与farm.config.ts端口对应distDir../dist生产构建时 WebView 加载的静态产物目录Farm 默认输出目录withGlobalTauritrue把 Tauri API 挂到全局window便于无打包器场景直接使用allowlist.shell.opentrue允许打开系统默认浏览器页面中 Farm/Tauri 链接跳转依赖此项windows800×600应用主窗口尺寸title由项目名填充bundletargetsall生成当前平台全部目标格式msi/dmg/appimage 等完整的工作流闭环是tauri dev ├─ beforeDevCommand: pnpm dev ──► Farm dev server 监听 http://localhost:1420 └─ WebView 加载 http://localhost:1420 ──► 用户操作 ──► invoke(greet) ──► Rust 命令返回端到端开发流程实战1. 用 CLI 生成项目该模板由 create-farm-rs 脚手架提供模板枚举定义在 crates/create-farm-rs/src/template.rs其中TauriSubTemplate::Vanilla对应的标识为tauri/vanilla。命令行生成方式以 npm 为例npm create farmlatest -- --template tauri-vanilla # 或先创建再追加参数 npm create farmlatest my-tauri-app -- --template tauri-vanilla脚手架支持的关键参数定义于 crates/create-farm-rs/src/args.rs参数说明-m, --manager指定包管理器pnpm/yarn/npm/bun-t, --template指定模板如tauri、tauri-vanilla、tauri-react等-f, --force目标目录非空时强制覆盖--dry-run试运行不写入任何文件若不带--templateCLI 会进入交互选择先选顶层框架其中包含Tauri与Tauri2选中后再让你挑选react/vue/svelte/vanilla/solid/preact子模板逻辑见 crates/create-farm-rs/src/lib.rs 的run_cli。注意交互式校验要求项目名只包含小写字母、数字与连字符且不能以数字开头见 lib.rs 中is_valid_pkg_name非法输入会被自动纠正或要求重输。2. 安装依赖并启动开发生成目录后按脚手架提示执行命令由PackageManager的install_cmd()与get_run_cmd()动态给出见 crates/create-farm-rs/src/package_manager.rscd my-tauri-app pnpm install # npm install / yarn / bun install pnpm tauri dev # npm run tauri dev / yarn tauri dev / bun tauri devpnpm tauri dev会触发beforeDevCommandpnpm dev拉起 Farm 开发服务器再以开发模式编译 Rust 并打开 WebView。在页面输入框输入名字并点击Greet即可看到 Rust 返回的Hello, xxx! Youve been greeted from Rust!——这是验证前后端桥接打通的最小闭环。3. 构建与打包pnpm tauri build该命令依次执行beforeBuildCommand→pnpm build先tsc做类型检查再farm build产出静态资源到dist/Cargo release 构建 Rust 二进制依据tauri.conf.json的bundle配置生成安装包Windows 下为.msi/.exemacOS 下为.app/.dmgLinux 下为.deb/.AppImage等。若只想验证前端产物可单独运行pnpm build后用pnpm preview通过 Farm 预览dist目录。模板渲染机制占位符如何变成你的项目名该模板目录中的package.json、Cargo.toml、tauri.conf.json里出现的FARM-TEMPLATE-NAME并非遗留文本而是脚手架渲染时的占位符。在 crates/create-farm-rs/src/template.rs 的render()中可以看到完整机制模板文件通过#[derive(RustEmbed)]的EMBEDDED_TEMPLATES在编译期打包进二进制运行时按Template::Tauri(Some(Vanilla))对应的tauri/vanilla前缀筛选文件并写出写文件时会把所有FARM-TEMPLATE-NAME替换为你的项目名project_name因此productName、窗口title、Cargopackage.name都会自动跟随项目名gitignore文件会被重命名为.gitignore再写出避免打包时被当作普通文件忽略dry-run模式下只打印计划不落盘方便预览生成效果。从模板出发的可扩展路径理解该模板的协作模型后你可以按需扩展增加 Tauri 命令在 main.rs 中用#[tauri::command]定义新函数加入generate_handler!列表前端即可invoke调用调整端口同时修改farm.config.ts的server.port与tauri.conf.json的devPath二者必须一致更换入口框架tauri/目录下还有react/、vue/、svelte/、solid/、preact/变体见 templates/tauri结构同构、可对照迁移升级 Tauri 2仓库同时维护tauri2/模板见 templates/tauri2/vanilla其结构在tauri基础上增加了capabilities/default.json权限声明命令注册改为src-tauri/src/lib.rs可结合官方迁移文档比对差异。小结tauri/vanilla模板是一个麻雀虽小、五脏俱全的最小桌面应用示例Farm 负责快速构建与热更新的前端侧Tauri 提供 Rust 驱动的原生壳与 IPC 桥tauri.conf.json则是连接两套构建系统的契约文件。对初学者它是理解 Tauri 命令模型与 Farm 双构建协作的最佳起点对老手它也是搭建新桌面项目、或把现有 Web 前端快速包装成桌面应用的可靠基底。需要动手验证时直接运行npm create farmlatest -- --template tauri-vanilla并执行tauri dev即可复现本文全部流程。赞分享前端构建构建工具开发工具【免费下载链接】farmExtremely fast Vite-compatible web build tool written in Rust项目地址https://gitcode.com/gh_mirrors/fa/farm点击查看免费下载相关推荐Farm 构建 Tauri React TypeScript 桌面应用模板结构与配置全解析Farm 构建 Tauri React TypeScript 桌面应用模板结构与配置全解析 本指南以 Farm 仓库中 create farm rs前端构建构建工具开发工具使用 Amazon S3 托管 Squirrel.Windows 发布文件从存储桶搭建到自动化更新分发使用 Amazon S3 托管 Squirrel.Windows 发布文件从存储桶搭建到自动化更新分发 Amazon S3 是托管 Squirrel.Wind前端构建构建工具开发工具TypeScript与Tauri构建轻量级桌面应用TypeScript与Tauri构建轻量级桌面应用 你是否还在为Electron应用的庞大体积而困扰是否希望开发出启动速度快、资源占用低的桌面应用本文将带文档教程上一篇一份SKILL.md无限复用awesome-claude-design设计资产跨项目迁移终极指南下一篇Open Brain数据卫生实战指纹去重与重复内容回填的完整操作指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

t3code实战指南:终端AI编程助手如何修复代码与提交PR

t3code实战指南:终端AI编程助手如何修复代码与提交PR

我最初误以为代码自动生成还需要等两年,直到在终端里连着用t3code改完三个issue之后,才意识到这种认知已经过期了。它不生成一个完整的项目,而是像有个熟悉代码库的同事坐在命令行旁边,帮你定位问题、改完代码、跑测试&#xff0c…

2026/10/13 9:27:04 阅读更多 →
分段线性函数拐点检测:从变点识别到断点定位实战解析

分段线性函数拐点检测:从变点识别到断点定位实战解析

做数据拟合时,我经常遇到一类很典型的需求:给定一堆看起来“弯折”的数据点,想找到它在哪个位置斜率发生了突变,也就是找出分段线性函数中间的拐点。比如传感器标定曲线、金融时间序列的制度切换、流量阈值识别,甚至医…

2026/10/13 9:27:04 阅读更多 →
皮尔逊相关系数置信区间:Fisher变换与Bootstrap实战指南

皮尔逊相关系数置信区间:Fisher变换与Bootstrap实战指南

1. 只报一个r值&#xff0c;在评审和业务场景里会碰哪些壁先说一个我常碰到的场景&#xff1a;某段时间帮同事看一份分析报告&#xff0c;里面写“变量A和变量B的皮尔逊相关系数为0.63&#xff0c;p<0.01”。一眼看去挺正常&#xff0c;但当我翻到样本量那一栏&#xff0c;发…

2026/10/13 9:27:04 阅读更多 →

最新新闻

大模型面试避坑指南:小白程序员如何通过真实项目斩获Offer(收藏版)

大模型面试避坑指南:小白程序员如何通过真实项目斩获Offer(收藏版)

本文基于作者上百场大模型面试经验&#xff0c;提炼出2026年大模型面试的核心考察点&#xff0c;包括Agent方向岗位增多、简历价值变化、准备时机等。文章强调“为可靠付钱”的行业趋势&#xff0c;建议候选人关注Agentic与推理能力、业务链路闭环、项目深度和评价维度变化。此…

2026/10/13 10:16:45 阅读更多 →
Windows Terminal 定制全攻略:配色、字体与提示符打造专属控制台

Windows Terminal 定制全攻略:配色、字体与提示符打造专属控制台

各位用 Windows 的朋友应该都有过这样的经历&#xff1a;每天打开系统自带的 CMD 或者 PowerShell 窗口&#xff0c;黑底白字&#xff0c;一条条命令敲下去&#xff0c;总觉得少了点什么。直到我第一次接触 Windows Terminal&#xff0c;才意识到原来控制台也可以玩出这么多花样…

2026/10/13 10:16:45 阅读更多 →
液压伺服电动机状态空间建模与控制器设计仿真

液压伺服电动机状态空间建模与控制器设计仿真

这个题目我太熟了&#xff0c;控制类和机电类专业做课设、毕设&#xff0c;十个里有八个会碰到“液压伺服电动机的状态空间设计与仿真”这种组合。对象是电液伺服系统&#xff0c;方法是现代控制理论的状态空间法&#xff0c;工具是Matlab。这套源程序迭代到14900期&#xff0c…

2026/10/13 10:16:45 阅读更多 →
Qt xcb插件加载失败原因与修复指南

Qt xcb插件加载失败原因与修复指南

1. 问题本质&#xff1a;这不是Qt程序崩溃&#xff0c;而是图形系统“失联”了你看到这行报错——This application failed to start because it could not find or load the Qt platform plugin xcb——第一反应可能是“Qt坏了”“程序编译错了”“Linux系统不兼容”。但实话讲…

2026/10/13 10:16:45 阅读更多 →
蓝屏0x10E显存管理内部错误:从驱动到BIOS的笔记本排查实战

蓝屏0x10E显存管理内部错误:从驱动到BIOS的笔记本排查实战

最近手头碰到一台新到的某品牌笔记本&#xff0c;配置是 Ultra X7 358H 处理器加独立显卡的组合&#xff0c;系统装好没两天就开始出问题。现象很典型&#xff1a;浏览网页或者看视频的时候突然画面卡住&#xff0c;随后屏幕一黑&#xff0c;直接蓝屏&#xff0c;错误代码0x10E…

2026/10/13 10:16:45 阅读更多 →
FFMpeg 4.1音频检测实战:命令详解与批处理自动化

FFMpeg 4.1音频检测实战:命令详解与批处理自动化

做内容生产这一年多&#xff0c;我处理过最多的活儿不是剪辑&#xff0c;而是给一堆音频素材做体检。尤其是接手播客剪辑、视频课程批量转码这类项目时&#xff0c;几十个甚至上百个文件摆在面前&#xff0c;里面哪个有静音、哪个音量忽大忽小、哪个爆音了&#xff0c;光靠耳朵…

2026/10/13 10:15:43 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →