使用 Wasm 模块
如何在边缘函数中使用 WebAssembly。
边缘函数支持运行 WebAssembly (Wasm) 模块。当您需要优化JavaScript运行较慢的代码或进行底层操作时,WebAssembly非常有用。
它还允许您将其他语言编写的现有库移植到JavaScript环境中使用。例如,magick-wasm 就是一个将C语言库移植到WebAssembly的图像处理和转换工具。
编写Wasm模块
您可以使用不同的语言和SDK来编写Wasm模块。本教程中,我们将用Rust编写一个简单的Wasm模块来实现两数相加。
按照这个使用Rust编写Wasm模块的指南来设置您的开发环境。
创建一个名为wasm-add
的新边缘函数:
1supabase functions new wasm-add
在函数目录内为Wasm模块创建一个新的Cargo项目:
12cd supabase/functions/wasm-addcargo new --lib add-wasm
将以下代码添加到add-wasm/src/lib.rs
中:
123456use wasm_bindgen::prelude::*;#[wasm_bindgen]pub fn add(a: u32, b: u32) -> u32 { a + b}
更新add-wasm/Cargo.toml
文件,添加wasm-bindgen
依赖项:
123456789101112[package]name = "add-wasm"version = "0.1.0"description = "A simple wasm module that adds two numbers"license = "MIT/Apache-2.0"edition = "2021"[lib]crate-type = ["cdylib"][dependencies]wasm-bindgen = "0.2"
然后我们可以通过运行以下命令构建包:
1wasm-pack build --target deno
这将在add-wasm/pkg
目录下生成一个Wasm二进制文件。
从边缘函数调用 Wasm 模块
现在让我们更新边缘函数,从 Wasm 模块调用 add
方法。
123456789import { add } from "./add-wasm/pkg/add_wasm.js";Deno.serve(async (req) => { const { a, b } = await req.json(); return new Response( JSON.stringify({ result: add(a, b) }), { headers: { "Content-Type": "application/json" } }, );});
Supabase 边缘函数当前使用 Deno 1.46 版本。从 Deno 2.1 开始,导入 Wasm 模块 将需要更少的样板代码。
打包并部署边缘函数
在部署边缘函数之前,我们需要确保它打包了 Wasm 模块。我们可以通过在 superbase/config.toml
中为函数定义 static_files
来实现这一点。
您需要将 Supabase CLI 更新到 2.7.0 或更高版本以获得 static_files
支持。
12[functions.wasm-add]static_files = [ "./functions/wasm-add/add-wasm/pkg/*"]
通过运行以下命令部署函数:
1supabase functions deploy wasm-add