Installation-and-Project-Setup[20260807224038]

0 阅读1分钟

安装与项目设置

项目代码:github.com/euv-dev/euv

euv 是一个 Rust + WASM 前端 UI 框架,它将响应式信号、虚拟 DOM 和声明式宏的强大功能带到了浏览器中。本指南将带你完成设置新 euv 项目的每一步,从安装工具链到在浏览器中运行你的第一个应用。

前置条件

在开始之前,请确保你的系统上已安装以下内容:

  • Rust(最新稳定版)—— 如果尚未安装,请通过 rustup 安装
  • wasm-pack —— Rust 生成的 WebAssembly 的构建工具
  • 现代浏览器 —— Chrome、Firefox、Edge 或 Safari

你可以通过以下命令验证 Rust 安装:

rustc --version
cargo --version

如果尚未安装 wasm-pack,请使用以下命令安装:

cargo install wasm-pack

创建新项目

首先使用 Cargo 生成一个新的 Rust 项目:

cargo new my-euv-app
cd my-euv-app

这会创建一个标准的 Rust 库项目。打开生成的 Cargo.toml 文件,更新它以包含 WASM 项目所需的配置:

[package]
name = "my-euv-app"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib"]

[dependencies]
euv = "0.1"
wasm-bindgen = "0.2"

crate-type = ["cdylib"] 条目告诉 Rust 编译器生成适合 WASM 的动态库。wasm-bindgen 依赖提供了 Rust 和 JavaScript 之间的桥梁。

添加 euv

配置好 Cargo.toml 后,将 euv 添加到你的项目中:

cargo add euv

此命令会自动将最新版本的 euv 添加到你的依赖中。你可以通过检查 Cargo.toml 来确认是否添加成功:

cargo add euv

设置 HTML 入口文件

在项目根目录(不在 src/ 内)创建一个 index.html 文件:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>My euv App</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module">
      import init from './pkg/my_euv_app.js';
      init();
    </script>
  </body>
</html>

<div id="app"> 元素充当 euv 渲染应用的挂载点。JavaScript 导入加载编译后的 WASM 模块并初始化它。

编写你的第一个 euv 代码

src/lib.rs 的内容替换为以下代码:

use euv::*;

fn app() -> VirtualNode {
    html! {
        div {
            h1 { "Hello, euv!" }
        }
    }
}

mount("#app", app);

这个最小示例从 euv crate 导入所有内容,定义一个返回 VirtualNode 的组件函数,并将其挂载到 DOM 中的 #app 元素。

构建项目

要将项目编译为 WASM,请运行:

wasm-pack build --target web

此命令将你的 Rust 代码编译为 WebAssembly,并在 pkg/ 目录中生成 JavaScript 包装文件。--target web 标志生成可直接在浏览器中使用 ES 模块加载的输出。

构建成功后,你应该看到 pkg/ 目录包含:

  • my_euv_app_bg.wasm —— 编译后的 WebAssembly 二进制文件
  • my_euv_app.js —— JavaScript 粘合代码
  • package.json —— 包的元数据

在浏览器中运行

对于本地开发,你需要一个简单的 HTTP 服务器。可以使用任何静态文件服务器:

# 使用 Python
python -m http.server 8080

# 使用 Node.js(通过 npx)
npx serve .

# 使用 Rust(通过 basic-http-server)
cargo install basic-http-server
basic-http-server .

然后在浏览器中打开 http://localhost:8080。你应该会在页面上看到 "Hello, euv!"。

项目结构概览

一个典型的 euv 项目具有以下结构:

my-euv-app/
├── Cargo.toml          # 项目配置和依赖
├── Cargo.lock          # 锁定的依赖版本
├── index.html          # HTML 入口文件
├── src/
│   └── lib.rs          # 主应用代码
├── pkg/                # 生成的 WASM 输出(构建后)
│   ├── my_euv_app_bg.wasm
│   └── my_euv_app.js
└── target/             # Rust 构建产物

使用渲染功能

euv 的渲染器使用增量渲染来高效地更新 DOM。它采用 Keyed Diffing(键控差异比较)来最小化列表变化时的不必要 DOM 操作,并使用事件委托来高效处理多个元素的事件,无需附加单独的监听器。

当你调用 mount("#app", app) 时,euv 会获取你的 app 函数返回的 VirtualNode,并将其渲染到匹配 #app 选择器的 DOM 元素中。在后续更新中,虚拟 DOM 差异算法会计算所需的最小变更集。

理解虚拟 DOM

euv 的核心是 VirtualNode 类型,它有多个变体:

  • Element —— 标准 HTML 元素,如 divspanh1
  • Text —— 纯文本节点
  • Fragment —— 没有包装元素的节点集合
  • Dynamic —— 可响应式变化的节点
  • Empty —— 不渲染任何内容

每个元素由一个 Tag 枚举标识:

  • Element(String) —— 标准 HTML 标签名
  • Component(String) —— 自定义组件名

这种虚拟表示使 euv 能够在渲染之间计算高效的差异。

下一步

现在你的项目已经设置完成并运行起来了,你可以探索 euv 的核心概念:

  • 响应式信号 —— 了解 use_signalcomputed!watch! 如何驱动响应式 UI
  • html! 宏 —— 掌握用于构建虚拟 DOM 树的声明式语法
  • class! 宏 —— 使用 CSS 类、伪类和媒体查询为组件添加样式
  • 组件系统 —— 使用 props 和 children 构建可复用组件

本系列的后续文章将详细介绍以上每个主题。


项目代码:github.com/euv-dev/euv