跳转到内容
搜索文档

Rust

最后更新 查看 MarkdownAgent 设置

Cloudflare Workers 通过 workers-rs crate ↗ 提供 Rust 支持,该 crate 使运行时 API 以及到开发者平台产品(如 Workers KV、R2 和 Queues)的绑定(binding)可直接从你的 Rust 代码中使用。

按照本指南,你将学习如何完全使用 Rust 编程语言构建 Worker。

前提条件

在开始本指南之前,请确保你拥有:

  • 最新版本的 Rust ↗
  • npm ↗
  • Rust wasm32-unknown-unknown 工具链:
rustup target add wasm32-unknown-unknown
  • 以及通过运行以下命令安装 cargo-generate 子命令:
cargo install cargo-generate

1. 使用 Wrangler 创建新项目

打开终端窗口,运行以下命令以生成 Rust Worker 项目模板:

cargo generate cloudflare/workers-rs

你的项目将在你命名的目录中创建,其中包含以下文件和文件夹:

  • Cargo.toml - Rust Cargo ↗ 包管理器的标准项目配置文件。模板预填充了在 Workers 上构建 Wasm 的最佳实践设置。
  • wrangler.toml - Wrangler 配置,预填充了调用 worker-build 的自定义构建命令(请参阅 Wrangler 打包)。
  • src - Rust 源代码目录,预填充了 Hello World Worker。

2. 本地开发

创建第一个 Worker 后,运行 wrangler dev 命令以启动用于开发 Worker 的本地服务器。这将允许你在开发中测试 Worker。

npx wrangler dev

如果你以前没有使用过 Wrangler,它将尝试打开 Web 浏览器以使用 Cloudflare 账户登录。

访问 http://localhost:8787 ↗ 查看正在运行的 Worker。对代码的任何更改都会触发重新构建,刷新页面将显示 Worker 的最新输出。

3. 编写 Worker 代码

生成新项目后,编写 Worker 代码。在 src/lib.rs 中找到 Worker 的入口点:

use worker::*;

#[event(fetch)]
async fn main(req: Request, env: Env, ctx: Context) -> Result<Response> {
    Response::ok("Hello, World!")
}

相关运行时 API

workers-rs 提供了与 Worker 的 JavaScript API 紧密匹配的运行时 API,并支持与 Worker 平台功能的集成。有关 API 的详细文档,请参阅 docs.rs/worker ↗。

event 宏

此宏允许你定义 Worker 的入口点。event 宏支持以下事件:

fetch 参数

fetch 处理程序提供三个与 JavaScript API 匹配的参数:

  1. Request ↗

表示传入请求的对象。这包括访问 headers、method、path、Cloudflare 属性和 body 的方法(支持使用 Serde ↗ 进行异步流式传输和 JSON 反序列化)。

  1. Env ↗

提供对 Worker 绑定(binding)的访问。

  1. Context ↗

提供对 waitUntil(延迟异步任务)和 passThroughOnException(失败时放行)功能的访问。

fetch 处理程序期望 Response ↗ 返回类型,支持异步流式响应到客户端。这也是从 Worker 发出的任何子请求的返回类型。有访问状态码和 headers 的方法,以及异步流式传输 body 或使用 Serde ↗ 从 JSON 反序列化的方法。

Router

实现便捷的路由 API ↗,从一个 Worker 提供多个路径。请参阅 worker-rs GitHub 仓库中的 Router 示例 ↗。

4. 部署 Worker 项目

配置项目后,你现在可以将 Worker 部署到 *.workers.dev 子域,或自定义域(如果已配置)。如果你尚未配置任何子域或域,Wrangler 将在部署过程中提示你设置一个。

npx wrangler deploy

在 <YOUR_WORKER>.<YOUR_SUBDOMAIN>.workers.dev 预览你的 Worker。

完成这些步骤后,你将部署一个基本的基于 Rust 的 Worker。从这里,你可以添加依赖项并编写 Rust 代码来实现 Worker 应用程序。如果你想了解更多关于 Workers 如何支持编译为 Wasm 的 Rust 的内部工作原理,下一节概述了涉及的库和工具。

此部署的工作原理

使用 workers-rs 时,Wasm Workers 从自动为你创建的 JavaScript 入口脚本调用。

JavaScript 管道(wasm-bindgen)

要访问平台功能(如绑定),Wasm Workers 必须能够访问 JavaScript 运行时 API 的方法。

这种互操作性通过 wasm-bindgen ↗ 实现,它提供了将运行时 API 导入 Wasm 模块以及从 Wasm 模块导出事件处理程序所需的粘合代码。wasm-bindgen 还提供 js-sys ↗,它实现了与 JavaScript 对象交互的类型。实际上,这是一个实现细节,因为 workers-rs 的 API 会为你处理与 JavaScript 对象的转换以及与导入的 JavaScript 运行时 API 的交互。

异步(wasm-bindgen-futures)

wasm-bindgen-futures ↗(wasm-bindgen 项目的一部分)提供 Rust Futures 和 JavaScript Promises 之间的互操作性。workers-rs 使用 spawn_local 调用整个事件处理函数,这意味着你可以使用 async Rust 编程,它被转换为单个 JavaScript Promise 并在 JavaScript 事件循环上运行。对导入的 JavaScript 运行时 API 的调用会自动转换为可以从 async Rust 函数调用的 Rust Futures。

打包(worker-build)

要在 Workers 上运行生成的 Wasm 二进制文件,workers-rs 包含一个名为 worker-build ↗ 的构建工具,它:

  1. 创建一个 JavaScript 入口脚本,使用 wasm-bindgen 的 JavaScript API 正确调用模块。
  2. 调用 web-pack 来压缩和打包 JavaScript 代码。
  3. 输出 Wrangler 可用于打包和部署最终 Worker 的目录结构。

worker-build 默认在模板项目中通过 wrangler.toml 文件中指定的自定义构建命令调用。

二进制大小(wasm-opt)

未优化的 Rust Wasm 二进制文件可能很大,可能超出 Worker 包大小限制或经历较长的启动时间。模板项目在 Cargo.toml 文件中预配置了几个有用的体积优化:

[profile.release]
lto = true
strip = true
codegen-units = 1

最后,worker-bundle 在上传前自动调用 wasm-opt ↗ 以进一步优化二进制大小。

相关资源

这篇文档对您有帮助吗?