workers-multi-lang について
Rust、Python、WebAssembly で Cloudflare Workers を開発する人向けのガイドです。言語の選び方、統合方法、性能改善の助言と、よくあるエラーへの対処を扱います。
主な機能
- 01Rust、Python、WASM の開発案
- 02言語選択のガイダンス
- 03WASM モジュール統合例
- 04多言語のエラー調査
- 05性能改善のアドバイス
活用シーン
- 01計算負荷の高い処理の言語選定
- 02Worker への WASM モジュール統合
- 03データ処理や ML 推論での Python 利用
- 04多言語のビルドや実行時エラーの調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill workers-multi-langインストール後、Claude Code で/workers-multi-langを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/python-workers.mdrust-workers.mdwasm-integration.mdscripts/build-rust.shbuild-wasm.shtest-wasm.shtemplates/python-worker.pyrust-worker.rswasm-integration.tswasm-worker.ts詳細
複数言語による Workers 開発
パフォーマンスが重要な処理向けに、Rust、Python、または WebAssembly を使って Cloudflare Workers を構築します。
言語の比較
| 特徴 | JavaScript/TS | Rust | Python |
|---|---|---|---|
| 起動時間 | 高速 | 最速(WASM) | 中程度 |
| CPU 性能 | 良好 | 優秀 | 良好 |
| メモリ | 多め | 少なめ | 多め |
| バンドルサイズ | 小さめ | 中程度 | 大きめ |
| 型安全性 | 任意(TS) | 厳格 | 任意 |
| 最適な用途 | 一般的なアプリ | CPU 負荷の高い処理 | データ/ML |
簡単な選び方
Need maximum performance? → Rust/WASM
Heavy computation (crypto, image processing)? → Rust/WASM
Data processing, ML inference? → Python
General web apps? → JavaScript/TypeScript
複数言語でよくあるエラー 10 選
| エラー | 言語 | 原因 | 解決策 |
|---|---|---|---|
WebAssembly.instantiate() failed | Rust | WASM が無効 | wasm-pack のビルド出力を確認します |
Module parse failed: Unexpected token | Rust | ESM/CJS の不一致 | --target bundler を使用します |
Cannot find module | Python | 依存関係が不足 | pyproject.toml に追加します |
Out of memory | すべて | WASM が大きすぎる | ストリーミングによるインスタンス化を有効にします |
Exceeded CPU time limit | すべて | 処理時間が長い | 処理を分割します |
wasm-bindgen version mismatch | Rust | 依存関係の競合 | Cargo.toml のバージョンを揃えます |
RuntimeError: unreachable | Rust | WASM 内でパニックが発生 | 適切なエラー処理を追加します |
TypeError: not a function | Rust | エクスポートが不足 | #[wasm_bindgen] 属性を追加します |
Python worker startup timeout | Python | 初期化が遅い | インポートを最小限にします |
SharedArrayBuffer not supported | すべて | セキュリティ | COOP/COEP ヘッダーを追加します |
Rust クイックスタート
# Install tools
cargo install wasm-pack
# Create project
cargo new --lib my-worker
cd my-worker
# Add to Cargo.toml
cat >> Cargo.toml << 'EOF'
[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.2"
worker = "0.3"
console_error_panic_hook = "0.1"
[profile.release]
opt-level = "s"
lto = true
EOF
// src/lib.rs
use worker::*;
#[event(fetch)]
async fn fetch(req: Request, env: Env, _ctx: Context) -> Result<Response> {
console_error_panic_hook::set_once();
Router::new()
.get("/", |_, _| Response::ok("Hello from Rust!"))
.get("/compute", |_, _| {
// CPU-intensive computation
let result = heavy_computation();
Response::ok(format!("Result: {}", result))
})
.run(req, env)
.await
}
fn heavy_computation() -> u64 {
(1..1_000_000).filter(|n| is_prime(*n)).count() as u64
}
fn is_prime(n: u64) -> bool {
if n < 2 { return false; }
(2..=(n as f64).sqrt() as u64).all(|i| n % i != 0)
}
Python クイックスタート(Workers for Platforms)
# pyproject.toml
[project]
name = "my-worker"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = []
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
# src/entry.py
from js import Response, Headers
async def on_fetch(request, env):
url = request.url
if "/compute" in url:
result = heavy_computation()
return Response.new(f"Result: {result}")
return Response.new("Hello from Python!")
def heavy_computation():
"""CPU-intensive computation"""
return sum(1 for n in range(2, 100000) if is_prime(n))
def is_prime(n):
if n < 2:
return False
return all(n % i != 0 for i in range(2, int(n**0.5) + 1))
WASM モジュールの統合
// Load and use WASM module in TypeScript Worker
import wasmModule from './pkg/my_lib_bg.wasm';
import { init, process_data } from './pkg/my_lib';
let wasmInstance: WebAssembly.Instance;
export default {
async fetch(request: Request, env: Env): Promise<Response> {
// Initialize WASM once
if (!wasmInstance) {
wasmInstance = await WebAssembly.instantiate(wasmModule);
init();
}
// Use WASM function
const result = process_data(inputData);
return Response.json({ result });
},
};
リファレンスを読み込むタイミング
| リファレンス | 読み込むタイミング |
|---|---|
references/rust-workers.md | Rust/WASM で Workers を構築するとき |
references/python-workers.md | Workers for Platforms で Python を使用するとき |
references/wasm-integration.md | 任意の Worker で WASM モジュールを統合するとき |
パフォーマンスのヒント
- WASM の初期化:インスタンスをキャッシュし、ストリーミングを使用します
- メモリ:データ転送には型付き配列を使用します
- バンドルサイズ:LTO を有効にし、デバッグ情報を削除します
- コールドスタート:WASM モジュールを小さく保ちます
- データ転送:JS/WASM 境界をまたぐデータ転送を最小限にします
関連項目
workers-performance- 一般的な最適化手法workers-testing- 複数言語による Workers のテストcloudflare-worker-base- Workers の基本設定
コメント
Markdown 対応