Advanced

WebAssembly Implementation: Claude Code 활용 가이드

webassembly implementation: Claude Code 활용. 실용적인 팁과 코드 예시를 포함합니다.

WebAssembly통합をClaude Code로実現する

WebAssembly(Wasm)は브라우저でネイティブに近い速度で動作するバイナリ形式です。이미지処理、暗号計算、ゲームロジックなどCPU負荷の高い処理をWebで高速に実行할 수 있습니다。Claude Code를 활용하면 Wasm모듈の생성から통합までスムーズに進められます。

RustからWasm모듈を생성

> Rustで이미지フィルタ処理のWasm모듈를 생성해줘。
> wasm-packで빌드する구성にして。
# Cargo.toml
[package]
name = "image-filter"
version = "0.1.0"
edition = "2021"

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

[dependencies]
wasm-bindgen = "0.2"
js-sys = "0.3"
web-sys = { version = "0.3", features = ["console"] }
// src/lib.rs
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn grayscale(pixels: &mut [u8]) {
    for chunk in pixels.chunks_exact_mut(4) {
        let gray = (0.299 * chunk[0] as f64
            + 0.587 * chunk[1] as f64
            + 0.114 * chunk[2] as f64) as u8;
        chunk[0] = gray;
        chunk[1] = gray;
        chunk[2] = gray;
        // chunk[3] はアルファ値、그まま
    }
}

#[wasm_bindgen]
pub fn blur(pixels: &mut [u8], width: u32, height: u32, radius: u32) {
    let src = pixels.to_vec();
    let r = radius as i32;

    for y in 0..height as i32 {
        for x in 0..width as i32 {
            let mut r_sum = 0u32;
            let mut g_sum = 0u32;
            let mut b_sum = 0u32;
            let mut count = 0u32;

            for dy in -r..=r {
                for dx in -r..=r {
                    let nx = (x + dx).clamp(0, width as i32 - 1) as usize;
                    let ny = (y + dy).clamp(0, height as i32 - 1) as usize;
                    let idx = (ny * width as usize + nx) * 4;
                    r_sum += src[idx] as u32;
                    g_sum += src[idx + 1] as u32;
                    b_sum += src[idx + 2] as u32;
                    count += 1;
                }
            }

            let idx = (y as usize * width as usize + x as usize) * 4;
            pixels[idx] = (r_sum / count) as u8;
            pixels[idx + 1] = (g_sum / count) as u8;
            pixels[idx + 2] = (b_sum / count) as u8;
        }
    }
}

JavaScriptからWasmを読み込む

> Wasm모듈を브라우저で読み込んで、
> Canvas이미지に適用する処理を書いて。
// src/wasm-loader.ts
import init, { grayscale, blur } from '../pkg/image_filter';

export async function initWasm() {
  await init();
}

export async function applyGrayscale(canvas: HTMLCanvasElement) {
  const ctx = canvas.getContext('2d')!;
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const pixels = new Uint8Array(imageData.data.buffer);

  grayscale(pixels);

  ctx.putImageData(imageData, 0, 0);
}

export async function applyBlur(
  canvas: HTMLCanvasElement,
  radius: number
) {
  const ctx = canvas.getContext('2d')!;
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const pixels = new Uint8Array(imageData.data.buffer);

  blur(pixels, canvas.width, canvas.height, radius);

  ctx.putImageData(imageData, 0, 0);
}

빌드と번들설정

# wasm-packでビルド
wasm-pack build --target web --out-dir pkg

# Viteでの設定
# vite.config.ts
// vite.config.ts
import { defineConfig } from 'vite';
import wasm from 'vite-plugin-wasm';
import topLevelAwait from 'vite-plugin-top-level-await';

export default defineConfig({
  plugins: [wasm(), topLevelAwait()],
  build: {
    target: 'esnext',
  },
});

성능比較

JavaScriptとWasmの処理速度を比較してみましょう。

// benchmark.ts
async function benchmark() {
  const size = 1920 * 1080 * 4;
  const pixels = new Uint8Array(size);
  crypto.getRandomValues(pixels);

  // JavaScript版
  const jsStart = performance.now();
  grayscaleJS(pixels);
  const jsTime = performance.now() - jsStart;

  // Wasm版
  const wasmStart = performance.now();
  grayscale(pixels);
  const wasmTime = performance.now() - wasmStart;

  console.log(`JS: ${jsTime.toFixed(2)}ms`);
  console.log(`Wasm: ${wasmTime.toFixed(2)}ms`);
  console.log(`速度比: ${(jsTime / wasmTime).toFixed(1)}x`);
}

Full HDサイズの이미지処理では、Wasm版がJavaScript版の3〜5倍高速に動作する場合があります。

정리

WebAssemblyを활용すれば、Web앱の성능を大幅に向上할 수 있습니다。Claude Code를 활용하면 RustやAssemblyScriptのコード생성からJavaScript통합まで효율적으로進められます。성능최적화가이드Rust개발도 참고하세요.

WebAssembly의 상세 정보는MDN WebAssembly가이드를 참고하세요.

#Claude Code #WebAssembly #Wasm #Rust #performance