# Rust และ WebAssembly ในปี 2026: คู่มือ Wasm, wasm-bindgen และคำถามสัมภาษณ์ > บทเรียน Rust WebAssembly พร้อม wasm-pack และ wasm-bindgen เรียนรู้การสร้าง ปรับแต่ง และทดสอบ Wasm module ด้วยตัวอย่างจริง - Published: 2026-08-07 - Updated: 2026-08-07 - Author: SharpSkill - Reading time: 5 min --- Rust WebAssembly (Wasm) นำประสิทธิภาพระดับ native มาสู่แอปพลิเคชันเว็บโดยการคอมไพล์โค้ด Rust ให้เป็นรูปแบบไบนารีที่สามารถทำงานได้ในเบราว์เซอร์และสภาพแวดล้อมเซิร์ฟเวอร์ การผสมผสานการรับประกันความปลอดภัยของหน่วยความจำของ Rust กับการทำงานแบบ sandbox ของ WebAssembly สร้างรากฐานที่แข็งแกร่งสำหรับคอมโพเนนต์เว็บประสิทธิภาพสูง ตั้งแต่การประมวลผลภาพไปจนถึงการดำเนินการเข้ารหัส > **ประเด็นสำคัญ** > > Rust คอมไพล์เป็น WebAssembly ผ่าน `wasm-pack` และ `wasm-bindgen` สร้างโมดูลที่ JavaScript สามารถ import และเรียกใช้ได้โดยตรง เวิร์กโฟลว์ประกอบด้วยการเขียนฟังก์ชัน Rust เพิ่ม annotation `#[wasm_bindgen]` คอมไพล์เป็น `.wasm` และ import โค้ด glue JavaScript ที่สร้างขึ้นเข้าสู่แอปพลิเคชันเว็บใดก็ได้ ## การตั้งค่า Rust สำหรับการพัฒนา WebAssembly Toolchain ของ Rust ต้องการ target `wasm32-unknown-unknown` และ `wasm-pack` สำหรับการสร้างโมดูล WebAssembly เครื่องมือเหล่านี้จัดการการคอมไพล์ การปรับแต่ง และการสร้าง binding JavaScript โดยอัตโนมัติ ```bash # install-wasm-tools.sh # Add the WebAssembly target to rustup rustup target add wasm32-unknown-unknown # Install wasm-pack for building and packaging cargo install wasm-pack # Verify installation wasm-pack --version ``` หลังจากติดตั้ง ให้สร้าง library crate ใหม่ที่กำหนดค่าสำหรับเอาต์พุต WebAssembly ไฟล์ `Cargo.toml` ต้องมีการตั้งค่าเฉพาะสำหรับความเข้ากันได้กับ Wasm ```toml # Cargo.toml [package] name = "wasm-calculator" version = "0.1.0" edition = "2024" [lib] crate-type = ["cdylib", "rlib"] [dependencies] wasm-bindgen = "0.2.100" [profile.release] opt-level = "z" # Optimize for size lto = true # Link-time optimization ``` ประเภท crate `cdylib` สร้าง dynamic library ที่เหมาะสำหรับ WebAssembly การปรับแต่ง release profile ลดขนาดไฟล์ `.wasm` สุดท้ายได้อย่างมีนัยสำคัญ—มักจะลดได้ถึง 50% หรือมากกว่าเมื่อเทียบกับ build ที่ไม่ได้ปรับแต่ง ## ทำความเข้าใจ wasm-bindgen และการทำงานร่วมกับ JavaScript Crate [wasm-bindgen](https://rustwasm.github.io/docs/wasm-bindgen/) เชื่อมต่อ Rust และ JavaScript โดยสร้าง binding แบบ type-safe โดยอัตโนมัติ ฟังก์ชันที่มี annotation `#[wasm_bindgen]` สามารถเรียกใช้ได้จาก JavaScript ในขณะที่ฟังก์ชัน JavaScript สามารถ import เข้าสู่ Rust ได้ ```rust // src/lib.rs use wasm_bindgen::prelude::*; // Export this function to JavaScript #[wasm_bindgen] pub fn fibonacci(n: u32) -> u32 { // Base cases for recursion match n { 0 => 0, 1 => 1, // Recursive calculation with tail-call optimization _ => fibonacci(n - 1) + fibonacci(n - 2), } } // Import console.log from JavaScript #[wasm_bindgen] extern "C" { #[wasm_bindgen(js_namespace = console)] fn log(s: &str); } // Export a function that uses console.log #[wasm_bindgen] pub fn greet(name: &str) { log(&format!("Hello, {}!", name)); } ``` บล็อก `extern "C"` ประกาศฟังก์ชัน JavaScript ที่โค้ด Rust สามารถเรียกใช้ได้ แอตทริบิวต์ `js_namespace` ระบุออบเจกต์ JavaScript ที่มีฟังก์ชันนั้น binding สองทิศทางนี้ช่วยให้สามารถผสานรวมระหว่างลอจิก Rust และ API ของ JavaScript ได้อย่างราบรื่น ## การสร้างและรวม WebAssembly Module คำสั่ง `wasm-pack build` คอมไพล์ Rust เป็น WebAssembly และสร้างโค้ด wrapper JavaScript target ที่แตกต่างกันเหมาะสำหรับสภาพแวดล้อม JavaScript ที่แตกต่างกัน ```bash # build-wasm.sh # Build for bundlers like webpack, Vite, or Rollup wasm-pack build --target bundler --release # Build for native ES modules (browser) wasm-pack build --target web --release # Build for Node.js wasm-pack build --target nodejs --release ``` แต่ละ target สร้างเอาต์พุตที่แตกต่างกันในไดเรกทอรี `pkg/` target bundler ทำงานกับ JavaScript bundler สมัยใหม่ที่รองรับ ES modules และการ import WebAssembly target web สร้างโค้ดที่โหลดได้โดยตรงในเบราว์เซอร์ผ่าน `