网站首页 > 技术文章 正文
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
什么是 Tuono
Tuono 是一个 Web 全栈框架,用于构建 React 应用,使用 Rust 作为后端,并高度重视可用性和性能,意大利语中意为 “雷霆”,发音为 /2OhNo/。
如果开发者有 Next.js 使用经验,那么使用 Tuono 将会非常简单。其核心功能包括:
- 原生 Typescript
- 类似 Next.js 的路由
- CSS/SCSS 模块
- 服务器端渲染
- 热模块刷新
Tuono 主要解决了以下两个限制:
- 无需使用 JS 运行时(Node、Deno)即可启用 React 服务器端渲染项目
- 使用 Rust 等通常比较难的语言简化 Web 开发
同时,Tuono API 尽可能地与 Next.js 保持一致,主要区别在于后端系统。Next.js 完全依赖于 Node/Deno/Bun,而 Tuono 无需任何中间运行时即可运行服务器,从而带来了显著的性能提升。
目前 Tuono 在 Github 通过 MIT 协议开源并非常活跃,短短时间内已经有接近 1k 的 star,是一个值得关注的前端开源项目。
如何使用 Tuono
首先需要安装相应的依赖:
cargo install tuono
tuono --version
Tuono 支持使用 tuono new CLI 命令从头开始创建新项目,开发者只需要输入下面命令:
tuono new my-first-tuono-app
cd my-first-tuono-app
npm install
tuono dev
// 开发
tuono build
// build 构建
cargo run --release
// 发布
下面是基于 Tuono 的一个服务器端路由示例:
// src/routes/pokemons/[pokemon].rs
use serde::{Deserialize, Serialize};
use reqwest::Client;
use tuono_lib::{Props, Request, Response};
const POKEMON_API: &str = "https://pokeapi.co/api/v2/pokemon";
#[derive(Debug, Serialize, Deserialize)]
struct Pokemon {
name: String,
id: u16,
weight: u16,
height: u16,
}
#[tuono_lib::handler]
async fn get_pokemon(req: Request, fetch: Client) -> Response {
// The param `pokemon` is defined in the route filename [pokemon].rs
let pokemon = req.params.get("pokemon").unwrap();
return match fetch.get(format!("{POKEMON_API}/{pokemon}")).send().await {
Ok(res) => {
let data = res.json::<Pokemon>().await.unwrap();
Response::Props(Props::new(data))
}
Err(_err) => Response::Props(Props::new("{}"))
};
}
由于基于 React,使用 tuono 创建客户端页面也非常简单,例如:下面实例创建了
src/components/PokemonLink.tsx 组件:
// src/components/PokemonLink.tsx
import type {JSX} from 'react'
import {Link} from 'tuono'
interface PokemonLinkProps {
id: number
name: string
}
export default function PokemonLink({
id,
name,
}: PokemonLinkProps): JSX.Element {
return (
<Link href={`/pokemons/${name}`} id={id.toString()}>
{name}
<img
src={`https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${id}.png`}
alt=""
/>
</Link>
)
}
tuono 还支持 SSR 等高级特性,假设页面需要预渲染频繁更新的数据(从本地文件读取)。开发者可以编写一个处理程序,读取 JSON 文件并将其传递给路由,如下所示:
// src/routes/about.rs
use tuono_lib::{Request, Response, Props};
use std::fs;
#[tuono_lib::handler]
async fn my_custom_ssr_page(req: Request) -> Response {
let data = fs::read_to_string("my_data.json").expect("Failed to read json file");
Response::Props(Props::new(data))
}
数据加载完成后,开发者就可以通过路由上的 data prop 访问。
更多关于 Tuono 的用法和示例可以参考文末资料,本文不再过多展开。
参考资料
https://github.com/tuono-labs/tuono
https://tuono.dev/documentation/rendering/server-side-rendering
- 上一篇: AI 编程的三步走:从“能用”到“能优化”
- 下一篇: 前端大一统时代来了
猜你喜欢
- 2025-08-05 智能图书馆管理系统开发实战系列(二):高保真原型设计
- 2025-08-05 Next.js 14 Server Actions:告别API路由的全栈开发新范式
- 2025-08-05 我如何驯服 Cursor AI,让它每次都生成正确代码
- 2025-08-05 React中实现苹果的Liquid Glass新拟态UI
- 2025-08-05 前端大一统时代来了
- 2025-08-05 AI 编程的三步走:从“能用”到“能优化”
- 2025-08-05 从Rax+DX到React,一次跨端组件重写的AI提效探索
- 2025-08-05 三行代码让 React 全面拥抱 MCP,开发者效率要起飞了?
- 2025-05-22 如何通过 OpenMemory MCP 让你的客户端更具上下文感知能力
- 2025-05-22 你在 Next.js 中用错 "use client" 了吗?
- 1521℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 640℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 527℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 461℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 459℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)