WebAssembly (WASM) की शुरुआत ब्राउज़र में C++ चलाने के एक तरीके के रूप में हुई थी। 2026 में, यह हर जगह चलता है - ब्राउज़र, सर्वर, एज नेटवर्क, एम्बेडेड डिवाइस - और वेब पर सबसे अधिक मांग वाले कुछ एप्लिकेशन को शक्ति प्रदान करता है। Figma का रेंडरिंग इंजन, वेब पर Adobe Photoshop, Google Meet की वीडियो प्रोसेसिंग, और Cloudflare का एज कंप्यूट प्लेटफॉर्म सभी WebAssembly पर चलते हैं।
Chrome Platform Status के अनुसार 2026 की शुरुआत में WASM सभी Chrome पेज लोड का लगभग 5.5% है, जो पिछले वर्ष 4.5% से बढ़ा है। WASM 3.0 के W3C मानक बनने और WASI के 1.0 की ओर परिपक्व होने के साथ, पारिस्थितिकी तंत्र एक निर्णायक मोड़ पर पहुंच गया है।
यह गाइड WebAssembly के साथ निर्माण शुरू करने के लिए आपको जो कुछ भी जानने की आवश्यकता है उसे कवर करती है।
WebAssembly क्या है?
WebAssembly एक बाइनरी इंस्ट्रक्शन फॉर्मेट है जिसे एक compilation target के रूप में डिज़ाइन किया गया है। आप एक उच्च-स्तरीय भाषा (Rust, C, C++, Go, Kotlin) में कोड लिखते हैं, इसे .wasm में कंपाइल करते हैं, और इसे किसी भी ऐसे वातावरण में चलाते हैं जिसमें WASM रनटाइम है - ब्राउज़र, Node.js, Cloudflare Workers, Wasmtime, या Wasmer।
यह कैसे काम करता है
WASM एक stack-based virtual machine है। फंक्शन एक operand stack पर वैल्यू push और pop करते हैं। होस्ट रनटाइम (Chrome में V8, Firefox में SpiderMonkey) WASM बाइटकोड को नेटिव मशीन कोड में JIT-कंपाइल करता है, यही कारण है कि प्रदर्शन लगभग नेटिव स्तर का होता है।
मुख्य विशेषताएं:
- Sandboxed execution: WASM मॉड्यूल केवल उन संसाधनों तक पहुंच सकते हैं जो होस्ट स्पष्ट रूप से प्रदान करता है। बिना अनुमति के कोई फाइलसिस्टम एक्सेस नहीं, कोई नेटवर्क नहीं, कोई OS एक्सेस नहीं। यह नेटिव कोड से मौलिक रूप से अलग है।
- Linear memory: WASM और होस्ट के बीच साझा एक एकल सतत
ArrayBuffer। जटिल डेटा (स्ट्रिंग्स, स्ट्रक्ट्स) मेमोरी में लिखकर और पॉइंटर साझा करके पास किया जाता है। - Type-limited: WASM मूल रूप से केवल चार प्रकारों का समर्थन करता है:
i32,i64,f32,f64। बाकी सब कुछ (स्ट्रिंग्स, ऐरे, ऑब्जेक्ट्स) को linear memory या Component Model के माध्यम से एन्कोडिंग की आवश्यकता होती है। - Portable: वही
.wasmबाइनरी WASM रनटाइम वाले किसी भी प्लेटफॉर्म पर बिना पुनः कंपाइलेशन के चलती है।
WASM बनाम JavaScript
WASM JavaScript को प्रतिस्थापित नहीं करता। यह इसका पूरक है।
| पहलू | JavaScript | WebAssembly |
|---|---|---|
| Parsing | रनटाइम पर Parse + compile | पूर्व-संकलित बाइनरी, केवल decode |
| Execution speed | JIT-अनुकूलित, परिवर्तनशील | लगभग-नेटिव, सुसंगत |
| Startup | छोटी स्क्रिप्ट के लिए तेज़ | तेज़ decode, अनुमानित |
| DOM access | प्रत्यक्ष | अप्रत्यक्ष (JS ग्लू के माध्यम से) |
| Best for | UI, DOM manipulation, event handling | CPU-गहन गणना |
| Garbage collection | बिल्ट-इन | WasmGC (नया), या मैनुअल |
UI और DOM कार्य के लिए JavaScript का उपयोग करें। भारी गणना के लिए WASM का उपयोग करें: इमेज प्रोसेसिंग, वीडियो एन्कोडिंग, फिजिक्स सिमुलेशन, क्रिप्टोग्राफी, डेटा पार्सिंग।
WASM 3.0: नया क्या है
WebAssembly 3.0 सितंबर 2025 में W3C मानक बना, जिसने नौ ऐसी सुविधाओं को मानकीकृत किया जो वर्षों से विकास में थीं।
| सुविधा | यह क्या सक्षम करती है |
|---|---|
| WasmGC | WASM में नेटिव garbage collection। मैनेज्ड भाषाएं (Java, Kotlin, Dart) अपना खुद का GC रनटाइम शिप किए बिना WASM में कंपाइल हो सकती हैं। Chrome 119+, Firefox 120+, Safari 18.2+ में समर्थित। |
| Exception Handling | WASM में नेटिव try/catch। पहले, exceptions के लिए JavaScript तक महंगे roundtrips की आवश्यकता होती थी। |
| Tail Calls | स्टैक ओवरफ्लो के बिना कुशल recursion को सक्षम करता है। फंक्शनल भाषाओं के लिए महत्वपूर्ण। |
| Relaxed SIMD | समानांतर डेटा प्रोसेसिंग के लिए 128-बिट वेक्टर इंस्ट्रक्शन। हार्डवेयर-विशिष्ट अनुकूलन को सक्षम करता है। |
| Memory64 | 4GB linear memory सीमा को तोड़ता है। बड़े पैमाने के डेटा प्रोसेसिंग के लिए आवश्यक। |
| Multi-memory | एक मॉड्यूल में कई स्वतंत्र मेमोरी क्षेत्र। |
सबसे प्रभावशाली WasmGC है। इससे पहले, Java या Kotlin को WASM में कंपाइल करने का मतलब था बाइनरी के हिस्से के रूप में एक पूरे garbage collector को शिप करना, जो फाइल साइज़ को बढ़ा देता था। अब ब्राउज़र का अपना GC WASM मॉड्यूल के लिए मेमोरी प्रबंधन संभालता है, ठीक वैसे ही जैसे यह JavaScript के लिए करता है।
WASI: ब्राउज़र से परे WebAssembly
ब्राउज़र में WASM शक्तिशाली है, लेकिन WASI (WebAssembly System Interface) वह है जो WASM को एक सार्वभौमिक रनटाइम बनाता है। WASI सिस्टम संसाधनों - फाइलें, नेटवर्किंग, घड़ियां, रैंडम नंबर - के लिए मानकीकृत इंटरफेस प्रदान करता है, जो WASM मॉड्यूल को ब्राउज़र के बाहर चलने की अनुमति देता है।
WASI Preview 2 (वर्तमान स्थिर रिलीज़) इन इंटरफेस को परिभाषित करता है:
wasi:filesystem- capability handles के माध्यम से फाइल ऑपरेशन (पारंपरिक file descriptors नहीं)wasi:sockets- TCP/UDP नेटवर्किंगwasi:http- HTTP request/response हैंडलिंगwasi:clocks- wall clock, monotonic clockwasi:random- क्रिप्टोग्राफिक रैंडमनेसwasi:cli- कमांड-लाइन आर्ग्यूमेंट्स, एनवायरनमेंट वेरिएबल्स, stdio
मुख्य सिद्धांत capability-based security है: एक WASM मॉड्यूल फाइलसिस्टम तक तब तक नहीं पहुंच सकता जब तक कि होस्ट स्पष्ट रूप से किसी विशिष्ट डायरेक्टरी के लिए हैंडल प्रदान नहीं करता। यह WASI को नेटिव executables चलाने की तुलना में मौलिक रूप से अधिक सुरक्षित बनाता है।
WASI 1.0 का मार्ग
WASI 0.3.0 (async/concurrency primitives जोड़ना) 2026 में अपेक्षित है, जिसके बाद WASI 1.0 आएगा। मुख्य अतिरिक्त सुविधा language-integrated async है जिसमें zero-copy streaming I/O है।
Component Model
कोर WASM मॉड्यूल केवल संख्याओं का आदान-प्रदान कर सकते हैं। Component Model WASM के ऊपर एक समृद्ध type system और composability परत जोड़कर इस सीमा को हल करता है।
WIT (WebAssembly Interface Types)
WIT एक Interface Definition Language है जो components को अपने imports और exports को समृद्ध प्रकारों के साथ घोषित करने देता है - strings, records, lists, variants, enums - न कि केवल i32 और f64।
// calculator.wit package myorg:calculator@1.0.0; interface operations { record calculation { expression: string, result: f64, timestamp: u64, } add: func(a: f64, b: f64) -> f64; multiply: func(a: f64, b: f64) -> f64; history: func() -> list<calculation>; } world calculator { export operations; }
wit-bindgen जैसे टूलचेन WIT फाइलों से भाषा-विशिष्ट बाइंडिंग्स जनरेट करते हैं। एक Rust component और एक Python component WIT अनुबंधों के माध्यम से strings, records, और lists का आदान-प्रदान कर सकते हैं बिना किसी पक्ष को दूसरे की implementation भाषा जाने।
Rust के साथ अपना पहला WASM मॉड्यूल बनाना
Rust में सबसे परिपक्व WASM टूलिंग है। आइए एक व्यावहारिक उदाहरण बनाएं: एक इमेज प्रोसेसिंग मॉड्यूल जो ब्राउज़र में चलता है।
सेटअप
# Install the WASM target for Rust rustup target add wasm32-unknown-unknown # Install wasm-pack (builds Rust to WASM + generates JS bindings) cargo install wasm-pack # Create a new library project cargo new --lib image-processor cd image-processor
Cargo.toml कॉन्फ़िगर करें
[package] name = "image-processor" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] wasm-bindgen = "0.2"
Rust कोड लिखें
// src/lib.rs use wasm_bindgen::prelude::*; /// Convert an image buffer to grayscale. /// Input: RGBA pixel data as a flat u8 array (4 bytes per pixel). /// Output: Modified in place for zero-copy performance. #[wasm_bindgen] pub fn grayscale(pixels: &mut [u8]) { for chunk in pixels.chunks_exact_mut(4) { let r = chunk[0] as f32; let g = chunk[1] as f32; let b = chunk[2] as f32; // ITU-R BT.709 luminance coefficients let gray = (0.2126 * r + 0.7152 * g + 0.0722 * b) as u8; chunk[0] = gray; chunk[1] = gray; chunk[2] = gray; // chunk[3] is alpha, leave unchanged } } /// Adjust brightness of an image. /// factor > 1.0 brightens, < 1.0 darkens. #[wasm_bindgen] pub fn adjust_brightness(pixels: &mut [u8], factor: f32) { for chunk in pixels.chunks_exact_mut(4) { chunk[0] = ((chunk[0] as f32 * factor).min(255.0)) as u8; chunk[1] = ((chunk[1] as f32 * factor).min(255.0)) as u8; chunk[2] = ((chunk[2] as f32 * factor).min(255.0)) as u8; } } /// Invert all colors in the image. #[wasm_bindgen] pub fn invert(pixels: &mut [u8]) { for chunk in pixels.chunks_exact_mut(4) { chunk[0] = 255 - chunk[0]; chunk[1] = 255 - chunk[1]; chunk[2] = 255 - chunk[2]; } } /// Calculate the average brightness of an image (0-255). #[wasm_bindgen] pub fn average_brightness(pixels: &[u8]) -> f32 { let mut total: f64 = 0.0; let pixel_count = pixels.len() / 4; for chunk in pixels.chunks_exact(4) { let luminance = 0.2126 * chunk[0] as f64 + 0.7152 * chunk[1] as f64 + 0.0722 * chunk[2] as f64; total += luminance; } (total / pixel_count as f64) as f32 }
बिल्ड
wasm-pack build --target web
यह एक pkg/ डायरेक्टरी बनाता है जिसमें:
image_processor_bg.wasm- कंपाइल्ड WASM बाइनरीimage_processor.js- TypeScript definitions के साथ JavaScript ग्लू कोडpackage.json- npm पर प्रकाशित करने के लिए तैयार
JavaScript में उपयोग करें
<!DOCTYPE html> <html> <head><title>WASM Image Processor</title></head> <body> <canvas id="canvas" width="800" height="600"></canvas> <button onclick="applyGrayscale()">Grayscale</button> <button onclick="applyBrightness()">Brighten</button> <button onclick="applyInvert()">Invert</button> <script type="module"> import init, { grayscale, adjust_brightness, invert } from "./pkg/image_processor.js"; let ctx; let imageData; async function setup() { await init(); const canvas = document.getElementById("canvas"); ctx = canvas.getContext("2d"); // Load an image onto the canvas const img = new Image(); img.onload = () => { ctx.drawImage(img, 0, 0); imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); }; img.src = "photo.jpg"; } window.applyGrayscale = () => { grayscale(imageData.data); ctx.putImageData(imageData, 0, 0); }; window.applyBrightness = () => { adjust_brightness(imageData.data, 1.3); ctx.putImageData(imageData, 0, 0); }; window.applyInvert = () => { invert(imageData.data); ctx.putImageData(imageData, 0, 0); }; setup(); </script> </body> </html>
मुख्य अंतर्दृष्टि: imageData.data एक Uint8ClampedArray है जो एक ArrayBuffer द्वारा समर्थित है। जब WASM को पास किया जाता है, तो यह एक ही मेमोरी साझा करता है - कोई कॉपी नहीं। Rust फंक्शन पिक्सेल को in place संशोधित करता है, और JavaScript पक्ष तुरंत परिवर्तन देखता है।
निचला स्तर: मैनुअल WASM Instantiation
यदि आप wasm-bindgen का उपयोग नहीं करना चाहते, तो आप सीधे WASM मॉड्यूल को instantiate कर सकते हैं:
const response = await fetch("calculator.wasm"); const { instance } = await WebAssembly.instantiateStreaming(response, { env: { // Functions the WASM module can call log_result: (value) => console.log("Result:", value), }, }); // Call exported functions const { add, multiply } = instance.exports; console.log(add(5, 3)); // 8 console.log(multiply(4, 7)); // 28
यह तब उपयोगी है जब आप न्यूनतम ओवरहेड चाहते हैं और समृद्ध type interop की आवश्यकता नहीं है।
प्रदर्शन: WASM बनाम JavaScript
वास्तविक बेंचमार्क CPU-गहन कार्यों के लिए महत्वपूर्ण स्पीडअप दिखाते हैं:
| कार्य | JavaScript | WASM | स्पीडअप |
|---|---|---|---|
| 4K इमेज प्रोसेसिंग | 180ms | 8ms (SIMD के साथ) | 22x |
| इमेज resize (4K) | 250ms | 45ms | 5.5x |
| फिजिक्स सिमुलेशन (10K entities) | फ्रेम ड्रॉप | स्मूथ 60fps | ~10x |
| JSON पार्सिंग (बड़ा payload) | 12ms | 3ms | 4x |
| क्रिप्टोग्राफिक हैशिंग | 45ms | 6ms | 7.5x |
WASM नेटिव कोड की लगभग 95% गति पर चलता है। सबसे बड़े लाभ इनसे आते हैं:
- अनुमानित प्रदर्शन (कोई JIT warmup नहीं, कोई GC pauses नहीं)
- समानांतर डेटा प्रोसेसिंग के लिए SIMD instructions
- garbage collector हस्तक्षेप के बिना direct memory access
जहां WASM तेज़ नहीं है: DOM manipulation, छोटी गणनाएं, I/O-bound कार्य। इनके लिए JavaScript पहले से अनुकूलित है।
प्रोडक्शन उपयोग के मामले
Figma: रियल-टाइम वेक्टर रेंडरिंग
Figma का कोर रेंडरिंग इंजन C++ है जो WASM में कंपाइल किया गया है। हर shape, gradient, और effect WASM में गणना किया जाता है और एक Canvas element पर ड्रॉ किया जाता है। यह Figma को ब्राउज़र में हजारों layers वाले जटिल डिज़ाइनों को 60fps पर संभालने की अनुमति देता है - एक ऐसा प्रदर्शन जो शुद्ध JavaScript में असंभव होगा।
वेब पर Adobe Photoshop
Adobe ने Rust का उपयोग करके प्रमुख Photoshop फिल्टर और टूल्स को WASM में पोर्ट किया। उनके बेंचमार्क WASM SIMD के साथ 22ms में 4K इमेज प्रोसेसिंग दिखाते हैं बनाम JavaScript में 180ms - 8x सुधार जो रियल-टाइम फिल्टर प्रीव्यू को संभव बनाता है।
Cloudflare Workers
Cloudflare 330+ एज लोकेशनों पर V8 isolates में WASM मॉड्यूल चलाता है। Cold starts 1-5ms हैं (container-based serverless के लिए 100-500ms की तुलना में)। फरवरी 2026 में, उन्होंने WASM का उपयोग करके अपने एज नेटवर्क पर Llama-3-8b inference को तैनात किया।
Google Meet
Google Meet में बैकग्राउंड ब्लर और वर्चुअल बैकग्राउंड रियल-टाइम वीडियो प्रोसेसिंग के लिए SIMD के साथ WASM का उपयोग करते हैं। WASM मॉड्यूल प्रत्येक वीडियो फ्रेम को इतनी तेज़ी से प्रोसेस करता है कि 30fps पर स्मूथ वीडियो बनाए रखा जा सके।
ब्राउज़र समर्थन (2026)
| सुविधा | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
| Core WASM | पूर्ण | पूर्ण | पूर्ण | पूर्ण |
| Threads | हां | हां | हां | हां |
| SIMD (128-bit) | हां | हां | हां | हां |
| WasmGC | 119+ | 120+ | 18.2+ | हां |
| Exception Handling | हां | हां | हां | हां |
| Memory64 | हां | हां | आंशिक | हां |
सभी प्रमुख ब्राउज़र WASM को पूरी तरह से सपोर्ट करते हैं। नई सुविधाएं (WasmGC, Exception Handling) व्यापक उपलब्धता तक पहुंच चुकी हैं।
टूलिंग संदर्भ
| टूल | उद्देश्य | इंस्टॉल |
|---|---|---|
| wasm-pack | Rust को WASM में बिल्ड करें, npm पैकेज जनरेट करें | cargo install wasm-pack |
| wasm-bindgen | Rust/JS interop bindings (wasm-pack द्वारा उपयोग) | Cargo.toml में Dependency |
| wasm-opt | बाइनरी साइज़ अनुकूलन (50%+ कमी) | Binaryen का हिस्सा: brew install binaryen |
| wit-bindgen | WIT फाइलों से bindings जनरेट करें | cargo install wit-bindgen-cli |
| Wasmtime | सर्वर-साइड WASM रनटाइम (संदर्भ WASI implementation) | brew install wasmtime |
| Wasmer | WASI समर्थन के साथ वैकल्पिक WASM रनटाइम | curl https://get.wasmer.io -sSfL | sh |
| wasm-feature-detect | रनटाइम ब्राउज़र फीचर डिटेक्शन | npm install wasm-feature-detect |
बाइनरी साइज़ का अनुकूलन
WASM बाइनरी बड़ी हो सकती हैं। इन्हें छोटा करने का तरीका:
# Cargo.toml [profile.release] opt-level = "z" # Optimize for size lto = true # Link-time optimization codegen-units = 1 # Better optimization, slower compile strip = true # Strip debug symbols
# Build in release mode wasm-pack build --release --target web # Further optimize with wasm-opt wasm-opt -Oz pkg/image_processor_bg.wasm -o pkg/image_processor_bg.wasm
एक सामान्य Rust WASM मॉड्यूल इन अनुकूलन के साथ 500KB से 50KB से कम हो जाता है।
शुरू करने का रोडमैप
निष्कर्ष
WebAssembly अब प्रयोगात्मक नहीं है। यह एक प्रोडक्शन तकनीक है जिसका उपयोग वेब पर सबसे अधिक मांग वाले कुछ एप्लिकेशन करते हैं। लगभग-नेटिव प्रदर्शन, sandboxed सुरक्षा, और सार्वभौमिक पोर्टेबिलिटी - कोई अन्य compilation target आपको ये तीनों नहीं देता।
आपको WASM में अपना पूरा एप्लिकेशन फिर से लिखने की आवश्यकता नहीं है। एक एकल CPU-गहन फंक्शन से शुरू करें - एक इमेज फिल्टर, एक डेटा पार्सर, एक फिजिक्स कैलकुलेशन - इसे WASM में कंपाइल करें, और JavaScript से कॉल करें। अंतर मापें। फिर तय करें कि WASM और कहां मदद कर सकता है।
टूलिंग परिपक्व है, ब्राउज़र समर्थन सार्वभौमिक है, और पारिस्थितिकी तंत्र बढ़ रहा है। यदि आप Rust लिखते हैं, तो आप पहले से ही ब्राउज़र से एक कमांड दूर हैं।
शुरुआत करने की चेकलिस्ट:
- Rust और wasm-pack इंस्टॉल किए गए
- पहला WASM मॉड्यूल बनाया और ब्राउज़र में चल रहा है
- JavaScript interop काम कर रहा है (JS से WASM कॉल करना)
- साइज़ अनुकूलन के साथ release build लागू
- शुद्ध JavaScript समकक्ष के विरुद्ध प्रदर्शन बेंचमार्क किया
- सर्वर-साइड उपयोग के मामलों के लिए Wasmtime के साथ WASI खोजा