จากรัสต์สู่ WASM ด้วย wasm-pack และรีแอ็กต์
คอมไพล์โค้ดรัสต์เป็น WebAssembly ด้วย wasm-pack และเรียกใช้การผูก JS ที่สร้างขึ้นในแอปรีแอ็กต์
จากรัสต์สู่ WASM ด้วย wasm-pack และรีแอ็กต์ เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
ชุดเครื่องมือ Rust สำหรับ WASM
กระบวนการทำงานมาตรฐานจาก Rust ไปยัง WASM ใช้เครื่องมือสองรายการ ได้แก่ wasm-pack ซึ่งประสานงานกระบวนการสร้าง (คอมไพล์ Rust เป็น WASM เรียกใช้ wasm-bindgen และสร้างแพ็กเกจ npm) และ wasm-bindgen ซึ่งสร้างการเชื่อมโยง JavaScript ที่ทำให้สามารถเรียกใช้ฟังก์ชัน Rust ได้เหมือนฟังก์ชัน JavaScript ทั่วไป พร้อมจัดการชนิดข้อมูลอย่างถูกต้อง
แอตทริบิวต์ wasm-bindgen
แอตทริบิวต์ #[wasm_bindgen] ใช้กำกับฟังก์ชัน โครงสร้าง และเมธอดของ Rust เพื่อส่งออกไปยัง JavaScript หากไม่มีแอตทริบิวต์นี้ ฟังก์ชันจะถูกคอมไพล์เป็น WASM แต่ไม่สามารถเข้าถึงจาก JavaScript ได้ เมื่อคุณใส่แอตทริบิวต์ #[wasm_bindgen] ให้กับฟังก์ชัน wasm-bindgen จะสร้างโค้ดเชื่อม JavaScript ที่จัดการการแปลงอาร์กิวเมนต์และค่าที่ส่งคืน
ฟังก์ชัน Rust อย่างง่าย
ฟังก์ชัน Rust ที่ส่งออกอย่างง่ายที่สุดคือ use wasm_bindgen::prelude::*; #[wasm_bindgen] pub fn add(a: u32, b: u32) -> u32 { a + b } ฟังก์ชันนี้รับจำนวนเต็มไม่ติดเครื่องหมายขนาด 32 บิตสองจำนวนและส่งคืนหนึ่งจำนวน wasm-bindgen จะสร้าง JavaScript ที่เรียกใช้ฟังก์ชันนี้ด้วยอาร์กิวเมนต์ชนิดตัวเลขและส่งคืนผลลัพธ์ชนิดตัวเลข
การสร้างด้วย wasm-pack
เรียกใช้ wasm-pack build --target web ในไดเรกทอรีของครейт Rust คำสั่งนี้จะคอมไพล์โค้ด Rust เป็น WASM เรียกใช้ wasm-bindgen เพื่อสร้างการเชื่อมโยง JavaScript และส่งออกไดเรกทอรี pkg/ ที่มีไบนารี .wasm โมดูลโค้ดเชื่อม JavaScript และคำจำกัดความชนิดข้อมูล TypeScript
การนำเข้าใน React
นำเข้าโมดูลที่สร้างขึ้นในคอมโพเนนต์ React: import init, { add } from '../pkg/my_lib' ฟังก์ชัน init จะโหลดและสร้างอินสแตนซ์ของไบนารี WASM (ให้เรียกใช้ครั้งเดียวใน useEffect) หลังจากเริ่มต้นแล้ว ให้เรียกใช้ฟังก์ชันที่ส่งออกโดยตรง: const result = add(2, 3)
การส่งข้อมูลซับซ้อน: js_sys และ JsValue
สำหรับข้อมูลซับซ้อนที่นอกเหนือจากจำนวนพื้นฐาน wasm-bindgen มี js_sys::Array (อาร์เรย์ JavaScript), js_sys::Object (ออบเจ็กต์ JavaScript) และ wasm_bindgen::JsValue (ค่า JavaScript ใด ๆ) ชนิดข้อมูลเหล่านี้ช่วยให้ฟังก์ชัน Rust รับและส่งคืนอาร์เรย์กับออบเจ็กต์ JavaScript ได้ แต่มีค่าใช้จ่ายในการทำอนุกรมสูงกว่าชนิดข้อมูลพื้นฐาน
การลดค่าใช้จ่ายในการจัดรูปข้อมูล
หลักการสำคัญด้านประสิทธิภาพคือ ให้ข้อมูลอยู่ในหน่วยความจำของ WASM และทำการคำนวณทั้งหมดที่นั่น ส่งข้อมูลเข้าไปครั้งเดียว คำนวณ แล้วส่งกลับเฉพาะผลลัพธ์สุดท้าย หลีกเลี่ยงรูปแบบที่ถ่ายโอนข้อมูลข้ามขอบเขตของ WASM ซ้ำ ๆ ในแต่ละขั้นตอน ค่าใช้จ่ายในการข้ามขอบเขตแต่ละครั้งมีเพียงเล็กน้อย แต่จะสะสมขึ้นในลูปที่ทำงานถี่ ๆ
serde-wasm-bindgen สำหรับโครงสร้าง
แพ็กเกจ serde-wasm-bindgen ช่วยให้สามารถซีเรียลไลซ์โครงสร้าง Rust ไปเป็นออบเจ็กต์ JavaScript และแปลงกลับได้โดยใช้ Serde ให้ใส่แอตทริบิวต์ #[derive(Serialize, Deserialize)] ที่โครงสร้าง แล้วใช้ serde_wasm_bindgen::to_value() และ from_value() วิธีนี้เป็นแนวทางมาตรฐานสำหรับส่งข้อมูลที่มีโครงสร้างซับซ้อน
การเรียกใช้ WASM ในเว็บเวิร์กเกอร์
การคำนวณด้วย WASM ที่ใช้เวลานานจะบล็อกเธรดที่กำลังทำงานอยู่ ให้เรียกใช้ WASM ใน Web Worker เพื่อให้เธรดหลักของ React ทำงานได้อย่างอิสระ สร้างไฟล์ Worker ที่เริ่มต้นโมดูล WASM และจัดการข้อความ ส่งข้อมูลไปยังเวิร์กเกอร์ผ่าน postMessage รับผลลัพธ์ผ่านเหตุการณ์ message จากนั้นอัปเดตสถานะของ React ด้วยผลลัพธ์ที่ได้
ชนิดข้อมูล TypeScript จาก wasm-pack
wasm-pack จะสร้างไฟล์ประกาศ TypeScript (.d.ts) ให้โดยอัตโนมัติสำหรับฟังก์ชันและชนิดข้อมูลที่ส่งออกทั้งหมด ทำให้โครงการ React TypeScript ของคุณมีการตรวจสอบชนิดข้อมูลอย่างครบถ้วนเมื่อเรียกใช้ฟังก์ชัน Rust ชนิดข้อมูลที่สร้างขึ้นจะสะท้อนลายเซ็นของฟังก์ชัน Rust — add(a: number, b: number): number — ทำให้การเติมข้อความอัตโนมัติใน IDE ทำงานได้อย่างถูกต้อง
ข้อควรพิจารณาสำหรับการใช้งานจริง
ไบนารี WASM โดยทั่วไปมีขนาด 100kb-2MB หลังการเพิ่มประสิทธิภาพ เปิดใช้ wasm-opt ในการสร้างด้วย wasm-pack โดยกำหนด opt-level = "z" ในโปรไฟล์การเผยแพร่ของ Cargo.toml เพื่อเพิ่มประสิทธิภาพขนาดอย่างเข้มงวด ให้บริการไฟล์ WASM ด้วย Content-Type: application/wasm และเปิดใช้ HTTP/2 เพื่อให้เบราว์เซอร์สตรีมไบนารีได้อย่างมีประสิทธิภาพ
แอตทริบิวต์ wasm-bindgen
แอตทริบิวต์ #[wasm_bindgen] ในโค้ด Rust มีจุดประสงค์อะไร
ทบทวนบทเรียน
wasm-pack build --target web จะคอมไพล์ Rust เป็น WASM และสร้างการเชื่อมโยง JavaScript ผ่าน wasm-bindgen ใส่แอตทริบิวต์ #[wasm_bindgen] ให้กับฟังก์ชันที่ส่งออก นำเข้า init และฟังก์ชันที่ส่งออกใน React เรียก init() ภายใน useEffect จากนั้นเรียกใช้ฟังก์ชันเหล่านั้นเหมือน JavaScript ทั่วไป ใช้ serde-wasm-bindgen สำหรับการซีเรียลไลซ์โครงสร้างที่ซับซ้อน เรียกใช้ WASM ใน Web Worker เมื่อต้องคำนวณเป็นเวลานาน เพื่อให้เธรดหลักของ React ทำงานได้อย่างอิสระ
คำถามที่พบบ่อย
บทเรียน “จากรัสต์สู่ WASM ด้วย wasm-pack และรีแอ็กต์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “จากรัสต์สู่ WASM ด้วย wasm-pack และรีแอ็กต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “จากรัสต์สู่ WASM ด้วย wasm-pack และรีแอ็กต์”
คอมไพล์โค้ดรัสต์เป็น WebAssembly ด้วย wasm-pack และเรียกใช้การผูก JS ที่สร้างขึ้นในแอปรีแอ็กต์ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “จากรัสต์สู่ WASM ด้วย wasm-pack และรีแอ็กต์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- WebAssembly คืออะไรและรีแอ็กต์เกี่ยวข้องอย่างไร
- การโหลดโมดูล WASM ในรีแอ็กต์
- จากรัสต์สู่ WASM ด้วย wasm-pack และรีแอ็กต์
- กรณีใช้งาน WASM: การประมวลผลภาพและการคำนวณ