spinny:~/writing $ less webassembly-wasm-complete-guide.md
12WebAssembly (WASM) เริ่มต้นเป็นวิธีรัน C++ ในเบราว์เซอร์ ในปี 2026 มันรันได้ทุกที่ - เบราว์เซอร์ เซิร์ฟเวอร์ เครือข่าย Edge อุปกรณ์ Embedded - และขับเคลื่อนแอปพลิเคชันที่ต้องการประสิทธิภาพสูงสุดบนเว็บ เอนจิ้นเรนเดอร์ของ Figma, Adobe Photoshop บนเว็บ, การประมวลผลวิดีโอของ Google Meet และแพลตฟอร์ม Edge Compute ของ Cloudflare ล้วนทำงานบน WebAssembly34Chrome Platform Status รายงานว่า WASM อยู่ที่ประมาณ 5.5% ของการโหลดหน้าเว็บทั้งหมดบน Chrome ณ ต้นปี 2026 เพิ่มขึ้นจาก 4.5% ในปีก่อนหน้า เมื่อ WASM 3.0 กลายเป็นมาตรฐาน W3C และ WASI เติบโตมุ่งสู่เวอร์ชัน 1.0 ระบบนิเวศได้มาถึงจุดเปลี่ยนสำคัญแล้ว56คู่มือนี้ครอบคลุมทุกสิ่งที่คุณจำเป็นต้องรู้เพื่อเริ่มต้นสร้างด้วย WebAssembly78## WebAssembly คืออะไร?910WebAssembly เป็นรูปแบบคำสั่งแบบไบนารีที่ออกแบบมาเป็นเป้าหมายการคอมไพล์ คุณเขียนโค้ดด้วยภาษาระดับสูง (Rust, C, C++, Go, Kotlin) คอมไพล์เป็น `.wasm` แล้วรันในสภาพแวดล้อมใดก็ได้ที่มี WASM Runtime - เบราว์เซอร์, Node.js, Cloudflare Workers, Wasmtime หรือ Wasmer1112```mermaid13graph LR14 Rust[Rust / C / C++] --> Compiler[Compiler]15 Compiler --> WASM[.wasm Binary]16 WASM --> Browser[Browser V8/SpiderMonkey]17 WASM --> Server[Server Wasmtime]18 WASM --> Edge[Edge Cloudflare Workers]19 WASM --> Embedded[Embedded WAMR]20```2122### มันทำงานอย่างไร2324WASM เป็น**เครื่องเสมือนแบบ Stack-based** ฟังก์ชันจะ push และ pop ค่าบน Operand Stack Host Runtime (V8 ใน Chrome, SpiderMonkey ใน Firefox) จะ JIT-compile WASM Bytecode เป็น Native Machine Code ซึ่งเป็นเหตุผลที่ประสิทธิภาพใกล้เคียงกับ Native2526คุณสมบัติสำคัญ:2728- **การทำงานแบบ Sandbox**: โมดูล WASM สามารถเข้าถึงทรัพยากรได้เฉพาะที่ Host อนุญาตอย่างชัดเจนเท่านั้น ไม่มีการเข้าถึงระบบไฟล์ เครือข่าย หรือ OS เว้นแต่ได้รับอนุญาต สิ่งนี้แตกต่างจาก Native Code โดยพื้นฐาน29- **Linear Memory**: `ArrayBuffer` ต่อเนื่องเดียวที่ใช้ร่วมกันระหว่าง WASM และ Host ข้อมูลที่ซับซ้อน (สตริง, โครงสร้าง) จะถูกส่งผ่านโดยการเขียนลงในหน่วยความจำและแชร์ Pointer30- **จำกัดด้านประเภทข้อมูล**: WASM รองรับเฉพาะสี่ประเภทโดย Native: `i32`, `i64`, `f32`, `f64` ทุกอย่างอื่น (สตริง, อาร์เรย์, อ็อบเจกต์) ต้องมีการเข้ารหัสผ่าน Linear Memory หรือ Component Model31- **พกพาได้**: ไบนารี `.wasm` เดียวกันรันได้บนทุกแพลตฟอร์มที่มี WASM Runtime โดยไม่ต้องคอมไพล์ใหม่3233### WASM vs JavaScript3435WASM ไม่ได้มาแทนที่ JavaScript แต่มาเสริมมัน3637| ด้าน | JavaScript | WebAssembly |38|--------|-----------|-------------|39| **การ Parse** | Parse + Compile ตอน Runtime | ไบนารีที่คอมไพล์ล่วงหน้า, Decode เท่านั้น |40| **ความเร็วในการทำงาน** | JIT-optimized, ผันแปร | ใกล้เคียง Native, คงที่ |41| **การเริ่มต้น** | เร็วสำหรับสคริปต์ขนาดเล็ก | Decode เร็ว, คาดเดาได้ |42| **การเข้าถึง DOM** | โดยตรง | โดยอ้อม (ผ่าน JS Glue) |43| **เหมาะสำหรับ** | UI, การจัดการ DOM, Event Handling | การคำนวณที่ใช้ CPU มาก |44| **Garbage Collection** | มีในตัว | WasmGC (ใหม่) หรือจัดการเอง |4546ใช้ JavaScript สำหรับ UI และงาน DOM ใช้ WASM สำหรับการคำนวณหนัก: การประมวลผลภาพ, การเข้ารหัสวิดีโอ, การจำลองฟิสิกส์, การเข้ารหัสลับ, การแยกวิเคราะห์ข้อมูล4748## WASM 3.0: มีอะไรใหม่4950WebAssembly 3.0 กลายเป็นมาตรฐาน W3C ในเดือนกันยายน 2025 โดยมาตรฐานนี้รวมเก้าฟีเจอร์ที่อยู่ในระหว่างพัฒนามาหลายปี5152| ฟีเจอร์ | สิ่งที่เปิดใช้งาน |53|---------|----------------|54| **WasmGC** | Garbage Collection แบบ Native ใน WASM ภาษาที่มี Managed Memory (Java, Kotlin, Dart) สามารถคอมไพล์เป็น WASM ได้โดยไม่ต้องส่ง GC Runtime ของตัวเองมาด้วย รองรับใน Chrome 119+, Firefox 120+, Safari 18.2+ |55| **Exception Handling** | `try`/`catch` แบบ Native ใน WASM ก่อนหน้านี้ Exception ต้องใช้ Roundtrip ไปยัง JavaScript ที่มีค่าใช้จ่ายสูง |56| **Tail Calls** | เปิดใช้งาน Recursion ที่มีประสิทธิภาพโดยไม่เกิด Stack Overflow สำคัญสำหรับภาษา Functional |57| **Relaxed SIMD** | คำสั่งเวกเตอร์ 128 บิตสำหรับการประมวลผลข้อมูลแบบขนาน เปิดใช้งานการปรับแต่งเฉพาะฮาร์ดแวร์ |58| **Memory64** | ทำลายขีดจำกัด Linear Memory 4GB จำเป็นสำหรับการประมวลผลข้อมูลขนาดใหญ่ |59| **Multi-memory** | หลายพื้นที่หน่วยความจำอิสระในโมดูลเดียว |6061สิ่งที่มีผลกระทบมากที่สุดคือ **WasmGC** ก่อนหน้านี้ การคอมไพล์ Java หรือ Kotlin เป็น WASM หมายถึงการส่ง Garbage Collector ทั้งตัวเป็นส่วนหนึ่งของไบนารี ทำให้ขนาดไฟล์บวมขึ้น ตอนนี้ GC ของเบราว์เซอร์เองจัดการหน่วยความจำให้กับโมดูล WASM เหมือนกับที่ทำกับ JavaScript6263## WASI: WebAssembly นอกเบราว์เซอร์6465WASM ในเบราว์เซอร์มีพลัง แต่ **WASI (WebAssembly System Interface)** คือสิ่งที่ทำให้ WASM เป็น Runtime สากล WASI ให้อินเทอร์เฟซมาตรฐานสำหรับทรัพยากรระบบ - ไฟล์ เครือข่าย นาฬิกา ตัวเลขสุ่ม - ทำให้โมดูล WASM รันนอกเบราว์เซอร์ได้6667```mermaid68graph TD69 subgraph "Browser"70 B[WASM Module] --> Web[Web APIs\nDOM, Fetch, Canvas]71 end7273 subgraph "Server / Edge / Embedded"74 S[WASM Module] --> WASI[WASI Interfaces]75 WASI --> FS[wasi:filesystem]76 WASI --> Net[wasi:sockets]77 WASI --> HTTP[wasi:http]78 WASI --> Clock[wasi:clocks]79 WASI --> Rand[wasi:random]80 end81```8283WASI Preview 2 (รุ่นเสถียรปัจจุบัน) กำหนดอินเทอร์เฟซเหล่านี้:8485- `wasi:filesystem` - การดำเนินงานกับไฟล์ผ่าน Capability Handle (ไม่ใช่ File Descriptor แบบดั้งเดิม)86- `wasi:sockets` - เครือข่าย TCP/UDP87- `wasi:http` - การจัดการ HTTP Request/Response88- `wasi:clocks` - Wall Clock, Monotonic Clock89- `wasi:random` - ตัวเลขสุ่มเชิงเข้ารหัสลับ90- `wasi:cli` - อาร์กิวเมนต์บรรทัดคำสั่ง, ตัวแปรสภาพแวดล้อม, Standard I/O9192หลักการสำคัญคือ **ความปลอดภัยแบบ Capability-based**: โมดูล WASM ไม่สามารถเข้าถึงระบบไฟล์ได้ เว้นแต่ Host จะให้ Handle ไปยังไดเรกทอรีเฉพาะอย่างชัดเจน สิ่งนี้ทำให้ WASI มีความปลอดภัยมากกว่าการรัน Native Executable โดยพื้นฐาน9394### เส้นทางสู่ WASI 1.09596WASI 0.3.0 (เพิ่ม Async/Concurrency Primitive) คาดว่าจะมาในปี 2026 ตามด้วย WASI 1.0 สิ่งที่เพิ่มเข้ามาหลักคือ Async แบบรวมกับภาษาพร้อม Zero-copy Streaming I/O9798## Component Model99100โมดูล WASM หลักสามารถแลกเปลี่ยนได้เฉพาะตัวเลข **Component Model** แก้ข้อจำกัดนี้โดยเพิ่มระบบประเภทข้อมูลที่หลากหลายและเลเยอร์ Composability ด้านบนของ WASM101102### WIT (WebAssembly Interface Types)103104WIT เป็นภาษากำหนดอินเทอร์เฟซที่ให้ Component ประกาศ Import และ Export ด้วยประเภทข้อมูลที่หลากหลาย - สตริง, Record, รายการ, Variant, Enum - ไม่ใช่แค่ `i32` และ `f64`105106```wit107// calculator.wit108package myorg:calculator@1.0.0;109110interface operations {111 record calculation {112 expression: string,113 result: f64,114 timestamp: u64,115 }116117 add: func(a: f64, b: f64) -> f64;118 multiply: func(a: f64, b: f64) -> f64;119 history: func() -> list<calculation>;120}121122world calculator {123 export operations;124}125```126127Toolchain อย่าง `wit-bindgen` สร้าง Binding เฉพาะภาษาจากไฟล์ WIT Component ของ Rust และ Component ของ Python สามารถแลกเปลี่ยนสตริง Record และรายการผ่าน WIT Contract ได้โดยไม่ต้องรู้ภาษาของอีกฝ่าย128129## สร้างโมดูล WASM แรกของคุณด้วย Rust130131Rust มีเครื่องมือ WASM ที่เติบโตที่สุด มาสร้างตัวอย่างที่ใช้งานจริง: โมดูลประมวลผลภาพที่รันในเบราว์เซอร์132133### การตั้งค่า134135```bash136# Install the WASM target for Rust137rustup target add wasm32-unknown-unknown138139# Install wasm-pack (builds Rust to WASM + generates JS bindings)140cargo install wasm-pack141142# Create a new library project143cargo new --lib image-processor144cd image-processor145```146147### ตั้งค่า Cargo.toml148149```toml150[package]151name = "image-processor"152version = "0.1.0"153edition = "2021"154155[lib]156crate-type = ["cdylib"]157158[dependencies]159wasm-bindgen = "0.2"160```161162### เขียนโค้ด Rust163164```rust165// src/lib.rs166use wasm_bindgen::prelude::*;167168/// Convert an image buffer to grayscale.169/// Input: RGBA pixel data as a flat u8 array (4 bytes per pixel).170/// Output: Modified in place for zero-copy performance.171#[wasm_bindgen]172pub fn grayscale(pixels: &mut [u8]) {173 for chunk in pixels.chunks_exact_mut(4) {174 let r = chunk[0] as f32;175 let g = chunk[1] as f32;176 let b = chunk[2] as f32;177 // ITU-R BT.709 luminance coefficients178 let gray = (0.2126 * r + 0.7152 * g + 0.0722 * b) as u8;179 chunk[0] = gray;180 chunk[1] = gray;181 chunk[2] = gray;182 // chunk[3] is alpha, leave unchanged183 }184}185186/// Adjust brightness of an image.187/// factor > 1.0 brightens, < 1.0 darkens.188#[wasm_bindgen]189pub fn adjust_brightness(pixels: &mut [u8], factor: f32) {190 for chunk in pixels.chunks_exact_mut(4) {191 chunk[0] = ((chunk[0] as f32 * factor).min(255.0)) as u8;192 chunk[1] = ((chunk[1] as f32 * factor).min(255.0)) as u8;193 chunk[2] = ((chunk[2] as f32 * factor).min(255.0)) as u8;194 }195}196197/// Invert all colors in the image.198#[wasm_bindgen]199pub fn invert(pixels: &mut [u8]) {200 for chunk in pixels.chunks_exact_mut(4) {201 chunk[0] = 255 - chunk[0];202 chunk[1] = 255 - chunk[1];203 chunk[2] = 255 - chunk[2];204 }205}206207/// Calculate the average brightness of an image (0-255).208#[wasm_bindgen]209pub fn average_brightness(pixels: &[u8]) -> f32 {210 let mut total: f64 = 0.0;211 let pixel_count = pixels.len() / 4;212 for chunk in pixels.chunks_exact(4) {213 let luminance = 0.2126 * chunk[0] as f64214 + 0.7152 * chunk[1] as f64215 + 0.0722 * chunk[2] as f64;216 total += luminance;217 }218 (total / pixel_count as f64) as f32219}220```221222### Build223224```bash225wasm-pack build --target web226```227228สิ่งนี้สร้างไดเรกทอรี `pkg/` ที่มี:229- `image_processor_bg.wasm` - ไบนารี WASM ที่คอมไพล์แล้ว230- `image_processor.js` - โค้ด JavaScript Glue พร้อมคำจำกัดความ TypeScript231- `package.json` - พร้อมเผยแพร่ไปยัง npm232233### ใช้ใน JavaScript234235```html236<!DOCTYPE html>237<html>238<head><title>WASM Image Processor</title></head>239<body>240 <canvas id="canvas" width="800" height="600"></canvas>241 <button onclick="applyGrayscale()">Grayscale</button>242 <button onclick="applyBrightness()">Brighten</button>243 <button onclick="applyInvert()">Invert</button>244245 <script type="module">246 import init, { grayscale, adjust_brightness, invert } from "./pkg/image_processor.js";247248 let ctx;249 let imageData;250251 async function setup() {252 await init();253 const canvas = document.getElementById("canvas");254 ctx = canvas.getContext("2d");255256 // Load an image onto the canvas257 const img = new Image();258 img.onload = () => {259 ctx.drawImage(img, 0, 0);260 imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);261 };262 img.src = "photo.jpg";263 }264265 window.applyGrayscale = () => {266 grayscale(imageData.data);267 ctx.putImageData(imageData, 0, 0);268 };269270 window.applyBrightness = () => {271 adjust_brightness(imageData.data, 1.3);272 ctx.putImageData(imageData, 0, 0);273 };274275 window.applyInvert = () => {276 invert(imageData.data);277 ctx.putImageData(imageData, 0, 0);278 };279280 setup();281 </script>282</body>283</html>284```285286ประเด็นสำคัญ: `imageData.data` เป็น `Uint8ClampedArray` ที่มี `ArrayBuffer` อยู่เบื้องหลัง เมื่อส่งไปยัง WASM มันจะแชร์หน่วยความจำเดียวกัน - ไม่มีการคัดลอก ฟังก์ชัน Rust แก้ไขพิกเซลแบบ In-place และฝั่ง JavaScript จะเห็นการเปลี่ยนแปลงทันที287288## ระดับต่ำ: การ Instantiate WASM แบบ Manual289290ถ้าคุณไม่ต้องการใช้ `wasm-bindgen` คุณสามารถ Instantiate โมดูล WASM โดยตรง:291292```javascript293const response = await fetch("calculator.wasm");294const { instance } = await WebAssembly.instantiateStreaming(response, {295 env: {296 // Functions the WASM module can call297 log_result: (value) => console.log("Result:", value),298 },299});300301// Call exported functions302const { add, multiply } = instance.exports;303console.log(add(5, 3)); // 8304console.log(multiply(4, 7)); // 28305```306307วิธีนี้มีประโยชน์เมื่อคุณต้องการ Overhead น้อยที่สุดและไม่ต้องการ Rich Type Interop308309## ประสิทธิภาพ: WASM vs JavaScript310311Benchmark ในโลกจริงแสดงการเร่งความเร็วอย่างมีนัยสำคัญสำหรับงานที่ใช้ CPU มาก:312313| งาน | JavaScript | WASM | เร็วขึ้น |314|------|-----------|------|---------|315| การประมวลผลภาพ 4K | 180ms | 8ms (พร้อม SIMD) | 22 เท่า |316| ปรับขนาดภาพ (4K) | 250ms | 45ms | 5.5 เท่า |317| การจำลองฟิสิกส์ (1 หมื่น Entity) | เฟรมตก | 60fps ลื่นไหล | ประมาณ 10 เท่า |318| การ Parse JSON (Payload ขนาดใหญ่) | 12ms | 3ms | 4 เท่า |319| การ Hash เชิงเข้ารหัสลับ | 45ms | 6ms | 7.5 เท่า |320321WASM ทำงานที่ประมาณ 95% ของความเร็ว Native Code ข้อได้เปรียบที่ใหญ่ที่สุดมาจาก:322- ประสิทธิภาพที่คาดเดาได้ (ไม่มี JIT Warmup, ไม่มี GC Pause)323- คำสั่ง SIMD สำหรับการประมวลผลข้อมูลแบบขนาน324- การเข้าถึงหน่วยความจำโดยตรงโดยไม่มีการแทรกแซงจาก Garbage Collector325326จุดที่ WASM ไม่เร็วกว่า: การจัดการ DOM, การคำนวณขนาดเล็ก, งานที่มี I/O เป็นคอขวด JavaScript ถูกปรับแต่งมาเป็นอย่างดีสำหรับสิ่งเหล่านี้แล้ว327328## กรณีการใช้งานจริง329330### Figma: การเรนเดอร์เวกเตอร์แบบเรียลไทม์331332เอนจิ้นเรนเดอร์หลักของ Figma เป็น C++ ที่คอมไพล์เป็น WASM ทุกรูปทรง, Gradient และเอฟเฟกต์ถูกคำนวณใน WASM และวาดลงบน Canvas Element สิ่งนี้ทำให้ Figma สามารถจัดการดีไซน์ที่ซับซ้อนที่มีหลายพัน Layer ที่ 60fps ในเบราว์เซอร์ได้ - ประสิทธิภาพที่เป็นไปไม่ได้ด้วย JavaScript ล้วน333334### Adobe Photoshop บนเว็บ335336Adobe ย้ายฟิลเตอร์และเครื่องมือสำคัญของ Photoshop มาเป็น WASM โดยใช้ Rust Benchmark ของพวกเขาแสดงการประมวลผลภาพ 4K ใน 22ms ด้วย WASM SIMD เทียบกับ 180ms ใน JavaScript - เร็วขึ้น 8 เท่าที่ทำให้การดูตัวอย่างฟิลเตอร์แบบเรียลไทม์เป็นไปได้337338### Cloudflare Workers339340Cloudflare รันโมดูล WASM ใน V8 Isolate ข้ามกว่า 330 Edge Location Cold Start ใช้เวลา 1-5ms (เทียบกับ 100-500ms สำหรับ Serverless แบบ Container) ในเดือนกุมภาพันธ์ 2026 พวกเขาได้ Deploy การ Inference ของ Llama-3-8b ข้ามเครือข่าย Edge ด้วย WASM341342### Google Meet343344Background Blur และ Virtual Background ใน Google Meet ใช้ WASM กับ SIMD สำหรับการประมวลผลวิดีโอแบบเรียลไทม์ โมดูล WASM ประมวลผลแต่ละเฟรมวิดีโอเร็วพอที่จะรักษาวิดีโอที่ลื่นไหลที่ 30fps345346## การรองรับเบราว์เซอร์ (2026)347348| ฟีเจอร์ | Chrome | Firefox | Safari | Edge |349|---------|--------|---------|--------|------|350| Core WASM | เต็มรูปแบบ | เต็มรูปแบบ | เต็มรูปแบบ | เต็มรูปแบบ |351| Threads | รองรับ | รองรับ | รองรับ | รองรับ |352| SIMD (128 บิต) | รองรับ | รองรับ | รองรับ | รองรับ |353| WasmGC | 119+ | 120+ | 18.2+ | รองรับ |354| Exception Handling | รองรับ | รองรับ | รองรับ | รองรับ |355| Memory64 | รองรับ | รองรับ | บางส่วน | รองรับ |356357เบราว์เซอร์หลักทุกตัวรองรับ WASM อย่างเต็มรูปแบบ ฟีเจอร์ที่ใหม่กว่า (WasmGC, Exception Handling) ได้รับการรองรับอย่างกว้างขวางแล้ว358359## เครื่องมืออ้างอิง360361| เครื่องมือ | วัตถุประสงค์ | การติดตั้ง |362|------|---------|---------|363| **wasm-pack** | Build Rust เป็น WASM, สร้างแพ็กเกจ npm | `cargo install wasm-pack` |364| **wasm-bindgen** | Rust/JS Interop Binding (ใช้โดย wasm-pack) | Dependency ใน Cargo.toml |365| **wasm-opt** | ปรับแต่งขนาดไบนารี (ลดได้ 50% ขึ้นไป) | ส่วนหนึ่งของ Binaryen: `brew install binaryen` |366| **wit-bindgen** | สร้าง Binding จากไฟล์ WIT | `cargo install wit-bindgen-cli` |367| **Wasmtime** | WASM Runtime ฝั่งเซิร์ฟเวอร์ (WASI Reference Implementation) | `brew install wasmtime` |368| **Wasmer** | WASM Runtime ทางเลือกที่รองรับ WASI | `curl https://get.wasmer.io -sSfL \| sh` |369| **wasm-feature-detect** | ตรวจจับฟีเจอร์เบราว์เซอร์ตอน Runtime | `npm install wasm-feature-detect` |370371### ปรับแต่งขนาดไบนารี372373ไบนารี WASM อาจมีขนาดใหญ่ นี่คือวิธีลดขนาด:374375```toml376# Cargo.toml377[profile.release]378opt-level = "z" # Optimize for size379lto = true # Link-time optimization380codegen-units = 1 # Better optimization, slower compile381strip = true # Strip debug symbols382```383384```bash385# Build in release mode386wasm-pack build --release --target web387388# Further optimize with wasm-opt389wasm-opt -Oz pkg/image_processor_bg.wasm -o pkg/image_processor_bg.wasm390```391392โมดูล Rust WASM ทั่วไปจะลดจาก 500KB เหลือต่ำกว่า 50KB ด้วยการปรับแต่งเหล่านี้393394## แผนงานเริ่มต้น395396```mermaid397flowchart TD398 A[Week 1: Basics] --> B[Week 2: Real Project]399 B --> C[Week 3: WASI and Server-side]400 C --> D[Month 2+: Production]401402 A --> A1[Install Rust + wasm-pack]403 A --> A2[Build hello-world WASM module]404 A --> A3[Call WASM functions from JavaScript]405406 B --> B1[Build image processor or game physics]407 B --> B2[Use wasm-bindgen for rich types]408 B --> B3[Benchmark against pure JS]409410 C --> C1[Run WASM with Wasmtime]411 C --> C2[Explore WASI interfaces]412 C --> C3[Try Component Model with WIT]413414 D --> D1[Optimize binary size]415 D --> D2[Use SIMD for parallelism]416 D --> D3[Deploy to Cloudflare Workers or browser]417```418419## สรุป420421WebAssembly ไม่ใช่เทคโนโลยีทดลองอีกต่อไป มันเป็นเทคโนโลยีที่ใช้ในโปรดักชันโดยแอปพลิเคชันที่ต้องการประสิทธิภาพสูงสุดบนเว็บ ประสิทธิภาพใกล้เคียง Native, ความปลอดภัยแบบ Sandbox และความสามารถในการพกพาที่เป็นสากล - ไม่มี Compilation Target อื่นใดที่ให้ทั้งสามสิ่งนี้422423คุณไม่จำเป็นต้องเขียนแอปพลิเคชันทั้งหมดใหม่ด้วย WASM เริ่มจากฟังก์ชันที่ใช้ CPU มากเพียงหนึ่งฟังก์ชัน - ฟิลเตอร์ภาพ, ตัวแยกวิเคราะห์ข้อมูล, การคำนวณฟิสิกส์ - คอมไพล์เป็น WASM แล้วเรียกจาก JavaScript วัดความแตกต่าง จากนั้นตัดสินใจว่า WASM จะช่วยตรงไหนอีก424425เครื่องมือมีความเติบโตแล้ว การรองรับเบราว์เซอร์เป็นสากล และระบบนิเวศกำลังเติบโต ถ้าคุณเขียน Rust อยู่แล้ว คุณอยู่ห่างจากเบราว์เซอร์เพียงคำสั่งเดียว426427> **รายการตรวจสอบเริ่มต้น:**428>429> - [x] ติดตั้ง Rust และ wasm-pack แล้ว430> - [x] Build โมดูล WASM แรกและรันในเบราว์เซอร์ได้431> - [x] การเชื่อมต่อ JavaScript ทำงาน (เรียก WASM จาก JS)432> - [x] Release Build พร้อมการปรับแต่งขนาดถูกนำไปใช้433> - [x] Benchmark ประสิทธิภาพเทียบกับ JavaScript ล้วน434> - [x] สำรวจ WASI ด้วย Wasmtime สำหรับการใช้งานฝั่งเซิร์ฟเวอร์435
:WebAssembly สำหรับนักพัฒนาเว็บ - จากศูนย์สู่โปรดักชันlines 1-435 (END) — press q to close