mcpField
W
workers-multi-lang

workers-multi-lang

github.com/secondsky開発24076 回インストール5 週間前に更新
リポジトリ

workers-multi-lang について

Rust、Python、WebAssembly で Cloudflare Workers を開発する人向けのガイドです。言語の選び方、統合方法、性能改善の助言と、よくあるエラーへの対処を扱います。

主な機能

  1. 01Rust、Python、WASM の開発案
  2. 02言語選択のガイダンス
  3. 03WASM モジュール統合例
  4. 04多言語のエラー調査
  5. 05性能改善のアドバイス

活用シーン

  1. 01計算負荷の高い処理の言語選定
  2. 02Worker への WASM モジュール統合
  3. 03データ処理や ML 推論での Python 利用
  4. 04多言語のビルドや実行時エラーの調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/secondsky/claude-skills --skill workers-multi-lang

インストール後、Claude Code で/workers-multi-langを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
python-workers.md
rust-workers.md
wasm-integration.md
scripts/
build-rust.sh
build-wasm.sh
test-wasm.sh
templates/
python-worker.py
rust-worker.rs
wasm-integration.ts
wasm-worker.ts

詳細

複数言語による Workers 開発

パフォーマンスが重要な処理向けに、Rust、Python、または WebAssembly を使って Cloudflare Workers を構築します。

言語の比較

特徴JavaScript/TSRustPython
起動時間高速最速(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() failedRustWASM が無効wasm-pack のビルド出力を確認します
Module parse failed: Unexpected tokenRustESM/CJS の不一致--target bundler を使用します
Cannot find modulePython依存関係が不足pyproject.toml に追加します
Out of memoryすべてWASM が大きすぎるストリーミングによるインスタンス化を有効にします
Exceeded CPU time limitすべて処理時間が長い処理を分割します
wasm-bindgen version mismatchRust依存関係の競合Cargo.toml のバージョンを揃えます
RuntimeError: unreachableRustWASM 内でパニックが発生適切なエラー処理を追加します
TypeError: not a functionRustエクスポートが不足#[wasm_bindgen] 属性を追加します
Python worker startup timeoutPython初期化が遅いインポートを最小限にします
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.mdRust/WASM で Workers を構築するとき
references/python-workers.mdWorkers for Platforms で Python を使用するとき
references/wasm-integration.md任意の Worker で WASM モジュールを統合するとき

パフォーマンスのヒント

  1. WASM の初期化:インスタンスをキャッシュし、ストリーミングを使用します
  2. メモリ:データ転送には型付き配列を使用します
  3. バンドルサイズ:LTO を有効にし、デバッグ情報を削除します
  4. コールドスタート:WASM モジュールを小さく保ちます
  5. データ転送:JS/WASM 境界をまたぐデータ転送を最小限にします

関連項目

  • workers-performance - 一般的な最適化手法
  • workers-testing - 複数言語による Workers のテスト
  • cloudflare-worker-base - Workers の基本設定

コメント