Rust静态网站生成工具Trunk的使用,Trunk简化WebAssembly和前端资源构建部署流程
Rust静态网站生成工具Trunk的使用,Trunk简化WebAssembly和前端资源构建部署流程
Trunk是一个用于Rust WASM Web应用程序的打包工具。它通过简单的可选配置模式,通过源HTML文件构建和打包WASM、JS片段和其他资源(图像、css、scss)。
主要特性
- 📦 开发服务器 - Trunk内置服务器用于快速开发工作流,并支持HTTP和WebSocket代理
- 🏗 变更检测 - Trunk监视应用程序的更改并触发构建,包括自动浏览器重新加载
安装方法
# 使用cargo安装(从crates.io编译)
cargo install trunk --locked
# 或者从最新git提交编译
cargo install --git https://github.com/trunk-rs/trunk trunk
# 或者使用Homebrew安装
brew install trunk
完整示例demo
下面是一个使用Trunk构建Rust WASM应用的完整示例:
- 首先创建一个新的Rust项目:
cargo new --lib my-wasm-app
cd my-wasm-app
- 修改
Cargo.toml
文件:
[package]
name = "my-wasm-app"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.2"
- 创建
index.html
文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My WASM App</title>
<link data-trunk rel="css" href="styles.css">
</head>
<body>
<script type="module">
import init from './my-wasm-app.js';
init().then(() => {
console.log("WASM loaded!");
});
</script>
</body>
</html>
- 创建
styles.css
文件:
body {
font-family: sans-serif;
margin: 2rem;
background-color: #f5f5f5;
}
- 修改
src/lib.rs
文件:
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
#[wasm_bindgen(start)]
pub fn run() {
console_log::init().expect("error initializing logger");
log!("WASM module loaded");
}
- 运行Trunk开发服务器:
trunk serve
这将启动开发服务器,自动构建WASM应用并在浏览器中打开。当你修改代码时,Trunk会自动重新构建并刷新浏览器。
构建生产版本
trunk build --release
生产构建会优化WASM和前端资源,输出到dist
目录。
许可证
Trunk采用MIT或Apache-2.0许可证。
1 回复
Rust静态网站生成工具Trunk的使用指南
什么是Trunk?
Trunk是一个Rust生态中的静态网站生成工具,专门为构建和部署WebAssembly(Wasm)应用和前端资源而设计。它简化了从Rust代码到Web部署的整个流程,特别适合使用Rust开发前端应用的场景。
主要特性
- 自动构建Rust项目为WebAssembly
- 内置开发服务器支持热重载
- 处理CSS、SASS等前端资源
- 支持HTML模板处理
- 自动优化生产构建
- 与wasm-bindgen和wasm-pack良好集成
安装方法
首先确保已安装Rust工具链,然后运行:
cargo install trunk
基本使用方法
1. 创建新项目
cargo new --lib my-wasm-app
cd my-wasm-app
2. 修改Cargo.toml
确保你的Cargo.toml
包含以下内容:
[lib]
crate-type = ["cdylib"] # 指定为动态库类型,用于Wasm编译
[dependencies]
wasm-bindgen = "0.2" # 添加wasm-bindgen依赖
3. 创建index.html
在项目根目录创建index.html
:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Trunk Example</title>
</head>
<body>
<script type="module">
// 导入并初始化Wasm模块
import init from './my-wasm-app.js';
init();
</script>
</body>
</html>
4. 开发模式运行
trunk serve
这会启动开发服务器,默认在http://localhost:8080
。
5. 生产构建
trunk build --release
构建结果会输出到dist
目录。
高级配置
Trunk.toml配置文件
可以创建Trunk.toml
来自定义构建:
[build]
target = "index.html" # 指定入口HTML文件
dist = "dist" # 输出目录
release = false # 默认开发模式
[build.watch]
ignore = ["target/*", "dist/*"] # 忽略监视的目录
添加CSS/SASS支持
<!-- 在HTML中链接SASS文件 -->
<link data-trunk rel="scss" href="styles/main.scss"/>
使用Rust前端框架示例
如果你使用yew框架:
use yew::prelude::*;
// 定义App组件
#[function_component(App)]
fn app() -> Html {
html! {
<h1>{"Hello Trunk!"}</h1>
}
}
fn main() {
// 启动Yew应用
yew::Renderer::<App>::new().render();
}
然后修改index.html
:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Yew + Trunk</title>
</head>
<body>
<!-- Yew会自动挂载到body -->
</body>
</html>
部署
构建后的dist
目录可以直接部署到任何静态网站托管服务。
常见命令
trunk serve
: 启动开发服务器trunk build
: 构建项目trunk watch
: 监视文件变化并自动重建trunk clean
: 清理构建产物
完整示例Demo
下面是一个完整的Trunk项目示例:
- 项目结构:
my-wasm-app/
├── Cargo.toml
├── Trunk.toml
├── index.html
├── src/
│ └── lib.rs
└── styles/
└── main.scss
- Cargo.toml:
[package]
name = "my-wasm-app"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.2"
yew = "0.20"
- src/lib.rs:
use wasm_bindgen::prelude::*;
use yew::prelude::*;
#[function_component(App)]
fn app() -> Html {
html! {
<div class="container">
<h1>{"欢迎使用Trunk!"}</h1>
<p>{"这是一个使用Rust构建的WebAssembly应用"}</p>
</div>
}
}
#[wasm_bindgen(start)]
pub fn run_app() {
yew::Renderer::<App>::new().render();
}
- index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Trunk完整示例</title>
<link data-trunk rel="scss" href="styles/main.scss"/>
</head>
<body>
</body>
</html>
- styles/main.scss:
$primary-color: #3498db;
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
}
.container {
max-width: 800px;
margin: 0 auto;
text-align: center;
h1 {
color: $primary-color;
}
}
- Trunk.toml:
[build]
target = "index.html"
dist = "dist"
release = false
要运行这个示例:
cargo install trunk
trunk serve