[{"data":1,"prerenderedAt":1069},["ShallowReactive",2],{"page:\u002Ffa\u002Flogs\u002Fwork-with-wasm\u002Fintro-wasm":3,"mdc--625ani-key":111},{"title":4,"thumbnail":5,"description":6,"date":7,"cat":8,"intro":9,"comments":10,"newsletter":10,"toc":10,"path":11,"body":12,"tocData":13,"type":110},"آشنایی با WASM","\u002Fcontent\u002Fweb-assembly-logo.webp","وب‌اسمبلی (WebAssembly) یک استاندارد باز است که امکان اجرای کدهای باینری بهینه را در محیط‌های جاوا اسکریپت فراهم می‌کند. هدف اصلی آن افزایش سرعت و کارایی برنامه‌های وب است، اما می‌توان آن را در محیط‌های دیگر نیز اجرا کرد.","2023-09-12T16:33:46.294Z","tuts",false,true,"\u002Ffa\u002Flogs\u002Fwork-with-wasm\u002Fintro-wasm","## دوره آموزشی WebAssembly: ساخت برنامه‌های سریع وب با Go و TinyGo\n\n### معرفی WebAssembly (WASM): آینده برنامه‌های وب\n\nوب امروزی پر از برنامه‌های پیچیده است: از بازی‌های آنلاین مثل **Krunker** تا ویرایشگرهای بلادرنگ مثل **Figma**. جاوااسکریپت، با وجود انعطاف‌پذیری‌اش، گاهی تو تأمین عملکرد لازم برای این برنامه‌ها کم میاره. اینجا **WebAssembly (WASM)** وارد می‌شه، یه فناوری انقلابی که عملکرد برنامه‌های وب رو به سطح جدیدی می‌بره.\n\n**WASM** یه استاندارد باز و فرمت باینریه که به توسعه‌دهندگان اجازه می‌ده کدهای نوشته‌شده با زبان‌هایی مثل **C**، **C++**، **Rust** و **Go** رو به‌صورت بهینه تو مرورگرها اجرا کنن. این کدها تو محیطی ایزوله با امنیت بالا اجرا می‌شن و سرعتشون گاهی تا چند برابر جاوااسکریپته. WASM از سال 2017، که به‌صورت رسمی پشتیبانی مرورگرها رو به دست آورد، توسط غول‌هایی مثل **گوگل**، **مایکروسافت**، **موزیلا** و **اپل** حمایت شده و حالا تو پروژه‌های واقعی، از Adobe Premiere Web تا بازی‌های AAA، نقش کلیدی داره.\n\n### چرا WebAssembly؟\n\n- **سرعت بالا**: کدهای باینری WASM نزدیک به عملکرد زبان‌های بومی اجرا می‌شن.\n- **امنیت قوی**: محیط سندباکس از دسترسی غیرمجاز جلوگیری می‌کنه.\n- **چندزبانه بودن**: از C++ تا Go، هر زبانی رو به وب بیارید.\n- **حجم کم**: فایل‌های WASM فشرده‌تر از جاوااسکریپت مشابهن.\n- **پشتیبانی گسترده**: همه مرورگرهای مدرن (کروم، فایرفاکس، سافاری) WASM رو اجرا می‌کنن.\n\nمثال عملی: یه ویرایشگر عکس آنلاین رو تصور کن. با WASM، می‌تونی پردازش تصویر رو با سرعت C++ تو مرورگر انجام بدی، بدون اینکه کاربر چیزی نصب کنه.\n\n### پیش‌نیازها\n\nبرای شروع این دوره، به این موارد نیاز دارید:\n\n- آشنایی اولیه با **جاوااسکریپت** و **HTML**.\n- نصب **Go** (نسخه 1.21 یا بالاتر) و **TinyGo** (ابزار سبک برای WASM).\n- یه ویرایشگر کد مثل **VS Code**.\n- مرورگر مدرن (کروم یا فایرفاکس پیشنهاد می‌شه).\n\nبیایید اولین پروژه WASM رو بسازیم و قدرت این فناوری رو از نزدیک ببینیم!\n\n## بخش 1: ساخت اولین پروژه WASM با Go و TinyGo\n\n### 1.1 نصب ابزارهای موردنیاز\n\nبرای کار با Go در WASM، از **TinyGo** استفاده می‌کنیم، نسخه‌ای سبک‌تر از Go که برای محیط‌های محدود مثل مرورگرها بهینه شده.\n\n#### نصب TinyGo\n\nاگر از **Homebrew** استفاده می‌کنید (مک\u002Fلینوکس):\n\n```bash\nbrew install tinygo\n```\n\nبرای ویندوز یا روش‌های دیگه، به [tinygo.org](https:\u002F\u002Ftinygo.org\u002Fgetting-started\u002Finstall\u002F) سر بزنید.\n\n#### بررسی نصب\n\nاین دستورات رو اجرا کنید تا مطمئن بشید همه‌چیز آماده است:\n\n```bash\ngo version\ntinygo version\n```\n\nخروجی باید چیزی شبیه این باشه:\n\n```\ngo version go1.21.5\ntinygo version 0.31.0\n```\n\n### 1.2 نوشتن اولین برنامه Go برای WASM\n\nیه پوشه پروژه بسازید و فایل `main.go` رو با این کد پر کنید:\n\n```go\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n    fmt.Println(\"سلام از WebAssembly و Go!\")\n}\n```\n\nاین کد ساده یه پیام رو تو کنسول مرورگر چاپ می‌کنه.\n\n### 1.3 کامپایل به فرمت WASM\n\nبرای تبدیل کد Go به WASM، این دستور رو اجرا کنید:\n\n```bash\ntinygo build -o main.wasm -target wasm -no-debug -opt=2 main.go\n```\n\n- `-target wasm`: خروجی رو برای مرورگرها تنظیم می‌کنه.\n- `-no-debug`: اندازه فایل رو کوچیک‌تر می‌کنه.\n- `-opt=2`: بهینه‌سازی حداکثری اعمال می‌شه.\n\nفایل `main.wasm` تولید می‌شه که کد باینری شماست.\n\n### 1.4 آماده‌سازی فایل‌های جاوااسکریپت و HTML\n\nبرای اجرای WASM تو مرورگر، به یه فایل جاوااسکریپت کمکی به اسم `wasm_exec.js` نیاز دارید. این فایل رو از [مخزن Go](https:\u002F\u002Fgithub.com\u002Fgolang\u002Fgo\u002Fblob\u002Fmaster\u002Fmisc\u002Fwasm\u002Fwasm_exec.js) دانلود کنید و کنار پروژه بذارید.\n\nحالا فایل `index.html` رو با این کد بسازید:\n\n```html\n\u003C!DOCTYPE html>\n\u003Chtml lang=\"fa\">\n  \u003Chead>\n    \u003Cmeta charset=\"UTF-8\" \u002F>\n    \u003Ctitle>اولین پروژه WebAssembly\u003C\u002Ftitle>\n    \u003Cscript src=\"wasm_exec.js\">\u003C\u002Fscript>\n  \u003C\u002Fhead>\n  \u003Cbody>\n    \u003Ch1>سلام از WebAssembly و Go!\u003C\u002Fh1>\n    \u003Cscript>\n      const go = new Go();\n      WebAssembly.instantiateStreaming(fetch(\"main.wasm\"), go.importObject)\n        .then((result) => {\n          go.run(result.instance);\n        })\n        .catch((err) => console.error(\"خطا:\", err));\n    \u003C\u002Fscript>\n  \u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\n### 1.5 اجرای پروژه\n\nیه سرور محلی راه بندازید (چون مرورگرها فایل‌های WASM رو مستقیم از سیستم نمی‌خونن):\n\n```bash\npython -m http.server 8080\n```\n\nحالا به `http:\u002F\u002Flocalhost:8080` برید. تو کنسول مرورگر (F12 > Console)، باید پیام **\"سلام از WebAssembly و Go!\"** رو ببینید.\n\n## بخش 2: تعامل جاوااسکریپت و WebAssembly\n\nحالا بیایید WASM و جاوااسکریپت رو به هم وصل کنیم تا یه ماشین‌حساب ساده بسازیم که جمع دو عدد رو انجام بده.\n\n### 2.1 تعریف تابع در Go\n\nفایل `main.go` رو با این کد جایگزین کنید:\n\n```go\npackage main\n\nimport \"syscall\u002Fjs\"\n\n\u002F\u002Fexport add\nfunc add(a, b int) int {\n    return a + b\n}\n\nfunc main() {\n    js.Global().Set(\"add\", js.FuncOf(func(this js.Value, args []js.Value) interface{} {\n        return add(args[0].Int(), args[1].Int())\n    }))\n    select {} \u002F\u002F برنامه رو در حال اجرا نگه می‌داریم\n}\n```\n\n- `\u002F\u002Fexport add`: تابع `add` رو برای جاوااسکریپت قابل دسترسی می‌کنه.\n- `select {}`: از خروج برنامه جلوگیری می‌کنه.\n\n### 2.2 کامپایل دوباره\n\n```bash\ntinygo build -o main.wasm -target wasm -no-debug main.go\n```\n\n### 2.3 به‌روزرسانی HTML\n\nفایل `index.html` رو به این شکل تغییر بدید:\n\n```html\n\u003C!DOCTYPE html>\n\u003Chtml lang=\"fa\">\n  \u003Chead>\n    \u003Cmeta charset=\"UTF-8\" \u002F>\n    \u003Ctitle>ماشین‌حساب با WebAssembly\u003C\u002Ftitle>\n    \u003Cscript src=\"wasm_exec.js\">\u003C\u002Fscript>\n  \u003C\u002Fhead>\n  \u003Cbody>\n    \u003Ch1>ماشین‌حساب ساده با Go و WASM\u003C\u002Fh1>\n    \u003Cinput type=\"number\" id=\"a\" placeholder=\"عدد اول\" \u002F>\n    \u003Cinput type=\"number\" id=\"b\" placeholder=\"عدد دوم\" \u002F>\n    \u003Cbutton id=\"calc\">محاسبه\u003C\u002Fbutton>\n    \u003Cp>نتیجه: \u003Cspan id=\"result\">0\u003C\u002Fspan>\u003C\u002Fp>\n    \u003Cscript>\n      const go = new Go();\n      WebAssembly.instantiateStreaming(fetch(\"main.wasm\"), go.importObject)\n        .then((result) => {\n          go.run(result.instance);\n          document.getElementById(\"calc\").addEventListener(\"click\", () => {\n            const a = parseInt(document.getElementById(\"a\").value);\n            const b = parseInt(document.getElementById(\"b\").value);\n            const res = window.add(a, b);\n            document.getElementById(\"result\").textContent = res;\n          });\n        })\n        .catch((err) => console.error(\"خطا:\", err));\n    \u003C\u002Fscript>\n  \u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\n### 2.4 تست پروژه\n\nسرور رو دوباره اجرا کنید (`python -m http.server 8080`) و به `localhost:8080` برید. دو عدد وارد کنید، روی **محاسبه** کلیک کنید و نتیجه جمع رو ببینید. این تعامل نشون می‌ده چطور WASM و جاوااسکریپت می‌تونن باهم کار کنن.\n\n## بخش 3: تغییر DOM با WebAssembly\n\nحالا بیایید مستقیماً از Go به DOM مرورگر دسترسی پیدا کنیم و یه پیام پویا اضافه کنیم.\n\n### 3.1 کد Go برای تغییر DOM\n\nفایل `main.go` رو با این کد به‌روزرسانی کنید:\n\n```go\npackage main\n\nimport \"syscall\u002Fjs\"\n\nfunc main() {\n    document := js.Global().Get(\"document\")\n    div := document.Call(\"createElement\", \"div\")\n    div.Set(\"innerHTML\", \"این پیام از Go و WebAssembly اومده!\")\n    div.Set(\"style\", \"color: blue; font-size: 18px; margin-top: 10px;\")\n    document.Get(\"body\").Call(\"appendChild\", div)\n\n    select {} \u002F\u002F برنامه رو فعال نگه می‌داریم\n}\n```\n\n- `syscall\u002Fjs`: به Go اجازه می‌ده با DOM و جاوااسکریپت تعامل کنه.\n- کد بالا یه `div` جدید می‌سازه و پیامی رو تو صفحه نمایش می‌ده.\n\n### 3.2 کامپایل و اجرا\n\n```bash\ntinygo build -o main.wasm -target wasm -no-debug main.go\n```\n\nفایل `index.html` رو به حالت ساده برگردونید:\n\n```html\n\u003C!DOCTYPE html>\n\u003Chtml lang=\"fa\">\n  \u003Chead>\n    \u003Cmeta charset=\"UTF-8\" \u002F>\n    \u003Ctitle>تغییر DOM با WebAssembly\u003C\u002Ftitle>\n    \u003Cscript src=\"wasm_exec.js\">\u003C\u002Fscript>\n  \u003C\u002Fhead>\n  \u003Cbody>\n    \u003Ch1>تغییر DOM با Go و WASM\u003C\u002Fh1>\n    \u003Cscript>\n      const go = new Go();\n      WebAssembly.instantiateStreaming(fetch(\"main.wasm\"), go.importObject)\n        .then((result) => {\n          go.run(result.instance);\n        })\n        .catch((err) => console.error(\"خطا:\", err));\n    \u003C\u002Fscript>\n  \u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\n### 3.3 تست پروژه\n\nسرور رو اجرا کنید و به `localhost:8080` برید. باید یه پیام آبی‌رنگ با متن **\"این پیام از Go و WebAssembly اومده!\"** زیر عنوان ببینید. این نشون می‌ده WASM می‌تونه مستقیماً DOM رو دستکاری کنه.\n\n## نتیجه‌گیری: قدم اول به سوی WASM\n\nتو این ماژول، با **WebAssembly** آشنا شدید و یاد گرفتید چطور با **Go** و **TinyGo** برنامه‌های وب سریع و امن بسازید. از چاپ یه پیام ساده تو کنسول تا ساخت یه ماشین‌حساب تعاملی و تغییر DOM، قدم‌های اولیه رو برداشتید. WASM دنیایی از امکاناته: از اجرای بازی‌های سنگین تو مرورگر تا اپلیکیشن‌های ابری پیچیده. تو ماژول‌های بعدی، سراغ موضوعات پیشرفته‌تر می‌ریم، مثل بهینه‌سازی عملکرد، کار با کتابخونه‌های C++ و ادغام با فریم‌ورک‌های مدرن.\n\n### نکات کلیدی\n\n- WASM سرعت و امنیت رو به برنامه‌های وب میاره.\n- TinyGo ابزار سبک و قدرتمندیه برای پروژه‌های WASM.\n- تعامل جاوااسکریپت و WASM امکانات بی‌نهایتی فراهم می‌کنه.\n- تغییر DOM با Go نشون‌دهنده انعطاف‌پذیری WASMه.\n\n## منابع برای ادامه یادگیری\n\n- **وب‌سایت رسمی WebAssembly**: [webassembly.org](https:\u002F\u002Fwebassembly.org) برای مفاهیم پایه.\n- **مستندات TinyGo**: [tinygo.org\u002Fdocs](https:\u002F\u002Ftinygo.org\u002Fdocs) برای راهنمای کامل.\n- **مخزن GitHub TinyGo**: [github.com\u002Ftinygo-org](https:\u002F\u002Fgithub.com\u002Ftinygo-org) برای مثال‌های بیشتر.\n- **MDN WebAssembly**: [developer.mozilla.org\u002Fen-US\u002Fdocs\u002FWebAssembly](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWebAssembly) برای نکات جاوااسکریپت.\n- **انجمن WebAssembly**: [reddit.com\u002Fr\u002FWebAssembly](https:\u002F\u002Freddit.com\u002Fr\u002FWebAssembly) برای بحث و پشتیبانی.\n\nبیایید تو ماژول بعدی، WASM رو به پروژه‌های بزرگ‌تر ببریم و وب رو سریع‌تر کنیم!",[14,30,62,82,98,106],{"title":15,"url":16,"items":17},"دوره آموزشی WebAssembly: ساخت برنامه‌های سریع وب با Go و TinyGo","#دوره-آموزشی-webassembly-ساخت-برنامههای-سریع-وب-با-go-و-tinygo",[18,22,26],{"title":19,"url":20,"items":21},"معرفی WebAssembly (WASM): آینده برنامه‌های وب","#معرفی-webassembly-wasm-آینده-برنامههای-وب",[],{"title":23,"url":24,"items":25},"چرا WebAssembly؟","#چرا-webassembly",[],{"title":27,"url":28,"items":29},"پیش‌نیازها","#پیشنیازها",[],{"title":31,"url":32,"items":33},"بخش 1: ساخت اولین پروژه WASM با Go و TinyGo","#بخش-1-ساخت-اولین-پروژه-wasm-با-go-و-tinygo",[34,46,50,54,58],{"title":35,"url":36,"items":37},"1.1 نصب ابزارهای موردنیاز","#11-نصب-ابزارهای-موردنیاز",[38,42],{"title":39,"url":40,"items":41},"نصب TinyGo","#نصب-tinygo",[],{"title":43,"url":44,"items":45},"بررسی نصب","#بررسی-نصب",[],{"title":47,"url":48,"items":49},"1.2 نوشتن اولین برنامه Go برای WASM","#12-نوشتن-اولین-برنامه-go-برای-wasm",[],{"title":51,"url":52,"items":53},"1.3 کامپایل به فرمت WASM","#13-کامپایل-به-فرمت-wasm",[],{"title":55,"url":56,"items":57},"1.4 آماده‌سازی فایل‌های جاوااسکریپت و HTML","#14-آمادهسازی-فایلهای-جاوااسکریپت-و-html",[],{"title":59,"url":60,"items":61},"1.5 اجرای پروژه","#15-اجرای-پروژه",[],{"title":63,"url":64,"items":65},"بخش 2: تعامل جاوااسکریپت و WebAssembly","#بخش-2-تعامل-جاوااسکریپت-و-webassembly",[66,70,74,78],{"title":67,"url":68,"items":69},"2.1 تعریف تابع در Go","#21-تعریف-تابع-در-go",[],{"title":71,"url":72,"items":73},"2.2 کامپایل دوباره","#22-کامپایل-دوباره",[],{"title":75,"url":76,"items":77},"2.3 به‌روزرسانی HTML","#23-بهروزرسانی-html",[],{"title":79,"url":80,"items":81},"2.4 تست پروژه","#24-تست-پروژه",[],{"title":83,"url":84,"items":85},"بخش 3: تغییر DOM با WebAssembly","#بخش-3-تغییر-dom-با-webassembly",[86,90,94],{"title":87,"url":88,"items":89},"3.1 کد Go برای تغییر DOM","#31-کد-go-برای-تغییر-dom",[],{"title":91,"url":92,"items":93},"3.2 کامپایل و اجرا","#32-کامپایل-و-اجرا",[],{"title":95,"url":96,"items":97},"3.3 تست پروژه","#33-تست-پروژه",[],{"title":99,"url":100,"items":101},"نتیجه‌گیری: قدم اول به سوی WASM","#نتیجهگیری-قدم-اول-به-سوی-wasm",[102],{"title":103,"url":104,"items":105},"نکات کلیدی","#نکات-کلیدی",[],{"title":107,"url":108,"items":109},"منابع برای ادامه یادگیری","#منابع-برای-ادامه-یادگیری",[],"page",{"data":112,"body":113},{},{"type":114,"children":115},"root",[116,124,130,158,220,225,280,285,290,295,350,355,360,365,376,382,394,408,424,429,434,443,448,458,463,476,487,492,497,502,511,547,560,565,587,600,611,616,621,630,650,655,660,665,676,685,718,723,732,737,748,757,762,790,795,800,805,816,825,852,857,865,876,885,890,909,914,937,942,965,970,1064],{"type":117,"tag":118,"props":119,"children":121},"element","h2",{"id":120},"دوره-آموزشی-webassembly-ساخت-برنامههای-سریع-وب-با-go-و-tinygo",[122],{"type":123,"value":15},"text",{"type":117,"tag":125,"props":126,"children":128},"h3",{"id":127},"معرفی-webassembly-wasm-آینده-برنامههای-وب",[129],{"type":123,"value":19},{"type":117,"tag":131,"props":132,"children":133},"p",{},[134,136,142,144,149,151,156],{"type":123,"value":135},"وب امروزی پر از برنامه‌های پیچیده است: از بازی‌های آنلاین مثل ",{"type":117,"tag":137,"props":138,"children":139},"strong",{},[140],{"type":123,"value":141},"Krunker",{"type":123,"value":143}," تا ویرایشگرهای بلادرنگ مثل ",{"type":117,"tag":137,"props":145,"children":146},{},[147],{"type":123,"value":148},"Figma",{"type":123,"value":150},". جاوااسکریپت، با وجود انعطاف‌پذیری‌اش، گاهی تو تأمین عملکرد لازم برای این برنامه‌ها کم میاره. اینجا ",{"type":117,"tag":137,"props":152,"children":153},{},[154],{"type":123,"value":155},"WebAssembly (WASM)",{"type":123,"value":157}," وارد می‌شه، یه فناوری انقلابی که عملکرد برنامه‌های وب رو به سطح جدیدی می‌بره.",{"type":117,"tag":131,"props":159,"children":160},{},[161,166,168,173,175,180,181,186,188,193,195,200,201,206,207,212,213,218],{"type":117,"tag":137,"props":162,"children":163},{},[164],{"type":123,"value":165},"WASM",{"type":123,"value":167}," یه استاندارد باز و فرمت باینریه که به توسعه‌دهندگان اجازه می‌ده کدهای نوشته‌شده با زبان‌هایی مثل ",{"type":117,"tag":137,"props":169,"children":170},{},[171],{"type":123,"value":172},"C",{"type":123,"value":174},"، ",{"type":117,"tag":137,"props":176,"children":177},{},[178],{"type":123,"value":179},"C++",{"type":123,"value":174},{"type":117,"tag":137,"props":182,"children":183},{},[184],{"type":123,"value":185},"Rust",{"type":123,"value":187}," و ",{"type":117,"tag":137,"props":189,"children":190},{},[191],{"type":123,"value":192},"Go",{"type":123,"value":194}," رو به‌صورت بهینه تو مرورگرها اجرا کنن. این کدها تو محیطی ایزوله با امنیت بالا اجرا می‌شن و سرعتشون گاهی تا چند برابر جاوااسکریپته. WASM از سال 2017، که به‌صورت رسمی پشتیبانی مرورگرها رو به دست آورد، توسط غول‌هایی مثل ",{"type":117,"tag":137,"props":196,"children":197},{},[198],{"type":123,"value":199},"گوگل",{"type":123,"value":174},{"type":117,"tag":137,"props":202,"children":203},{},[204],{"type":123,"value":205},"مایکروسافت",{"type":123,"value":174},{"type":117,"tag":137,"props":208,"children":209},{},[210],{"type":123,"value":211},"موزیلا",{"type":123,"value":187},{"type":117,"tag":137,"props":214,"children":215},{},[216],{"type":123,"value":217},"اپل",{"type":123,"value":219}," حمایت شده و حالا تو پروژه‌های واقعی، از Adobe Premiere Web تا بازی‌های AAA، نقش کلیدی داره.",{"type":117,"tag":125,"props":221,"children":223},{"id":222},"چرا-webassembly",[224],{"type":123,"value":23},{"type":117,"tag":226,"props":227,"children":228},"ul",{},[229,240,250,260,270],{"type":117,"tag":230,"props":231,"children":232},"li",{},[233,238],{"type":117,"tag":137,"props":234,"children":235},{},[236],{"type":123,"value":237},"سرعت بالا",{"type":123,"value":239},": کدهای باینری WASM نزدیک به عملکرد زبان‌های بومی اجرا می‌شن.",{"type":117,"tag":230,"props":241,"children":242},{},[243,248],{"type":117,"tag":137,"props":244,"children":245},{},[246],{"type":123,"value":247},"امنیت قوی",{"type":123,"value":249},": محیط سندباکس از دسترسی غیرمجاز جلوگیری می‌کنه.",{"type":117,"tag":230,"props":251,"children":252},{},[253,258],{"type":117,"tag":137,"props":254,"children":255},{},[256],{"type":123,"value":257},"چندزبانه بودن",{"type":123,"value":259},": از C++ تا Go، هر زبانی رو به وب بیارید.",{"type":117,"tag":230,"props":261,"children":262},{},[263,268],{"type":117,"tag":137,"props":264,"children":265},{},[266],{"type":123,"value":267},"حجم کم",{"type":123,"value":269},": فایل‌های WASM فشرده‌تر از جاوااسکریپت مشابهن.",{"type":117,"tag":230,"props":271,"children":272},{},[273,278],{"type":117,"tag":137,"props":274,"children":275},{},[276],{"type":123,"value":277},"پشتیبانی گسترده",{"type":123,"value":279},": همه مرورگرهای مدرن (کروم، فایرفاکس، سافاری) WASM رو اجرا می‌کنن.",{"type":117,"tag":131,"props":281,"children":282},{},[283],{"type":123,"value":284},"مثال عملی: یه ویرایشگر عکس آنلاین رو تصور کن. با WASM، می‌تونی پردازش تصویر رو با سرعت C++ تو مرورگر انجام بدی، بدون اینکه کاربر چیزی نصب کنه.",{"type":117,"tag":125,"props":286,"children":288},{"id":287},"پیشنیازها",[289],{"type":123,"value":27},{"type":117,"tag":131,"props":291,"children":292},{},[293],{"type":123,"value":294},"برای شروع این دوره، به این موارد نیاز دارید:",{"type":117,"tag":226,"props":296,"children":297},{},[298,316,334,345],{"type":117,"tag":230,"props":299,"children":300},{},[301,303,308,309,314],{"type":123,"value":302},"آشنایی اولیه با ",{"type":117,"tag":137,"props":304,"children":305},{},[306],{"type":123,"value":307},"جاوااسکریپت",{"type":123,"value":187},{"type":117,"tag":137,"props":310,"children":311},{},[312],{"type":123,"value":313},"HTML",{"type":123,"value":315},".",{"type":117,"tag":230,"props":317,"children":318},{},[319,321,325,327,332],{"type":123,"value":320},"نصب ",{"type":117,"tag":137,"props":322,"children":323},{},[324],{"type":123,"value":192},{"type":123,"value":326}," (نسخه 1.21 یا بالاتر) و ",{"type":117,"tag":137,"props":328,"children":329},{},[330],{"type":123,"value":331},"TinyGo",{"type":123,"value":333}," (ابزار سبک برای WASM).",{"type":117,"tag":230,"props":335,"children":336},{},[337,339,344],{"type":123,"value":338},"یه ویرایشگر کد مثل ",{"type":117,"tag":137,"props":340,"children":341},{},[342],{"type":123,"value":343},"VS Code",{"type":123,"value":315},{"type":117,"tag":230,"props":346,"children":347},{},[348],{"type":123,"value":349},"مرورگر مدرن (کروم یا فایرفاکس پیشنهاد می‌شه).",{"type":117,"tag":131,"props":351,"children":352},{},[353],{"type":123,"value":354},"بیایید اولین پروژه WASM رو بسازیم و قدرت این فناوری رو از نزدیک ببینیم!",{"type":117,"tag":118,"props":356,"children":358},{"id":357},"بخش-1-ساخت-اولین-پروژه-wasm-با-go-و-tinygo",[359],{"type":123,"value":31},{"type":117,"tag":125,"props":361,"children":363},{"id":362},"_11-نصب-ابزارهای-موردنیاز",[364],{"type":123,"value":35},{"type":117,"tag":131,"props":366,"children":367},{},[368,370,374],{"type":123,"value":369},"برای کار با Go در WASM، از ",{"type":117,"tag":137,"props":371,"children":372},{},[373],{"type":123,"value":331},{"type":123,"value":375}," استفاده می‌کنیم، نسخه‌ای سبک‌تر از Go که برای محیط‌های محدود مثل مرورگرها بهینه شده.",{"type":117,"tag":377,"props":378,"children":380},"h4",{"id":379},"نصب-tinygo",[381],{"type":123,"value":39},{"type":117,"tag":131,"props":383,"children":384},{},[385,387,392],{"type":123,"value":386},"اگر از ",{"type":117,"tag":137,"props":388,"children":389},{},[390],{"type":123,"value":391},"Homebrew",{"type":123,"value":393}," استفاده می‌کنید (مک\u002Fلینوکس):",{"type":117,"tag":395,"props":396,"children":402},"pre",{"className":397,"code":399,"language":400,"meta":401},[398],"language-bash","brew install tinygo\n","bash","",[403],{"type":117,"tag":404,"props":405,"children":406},"code",{"__ignoreMap":401},[407],{"type":123,"value":399},{"type":117,"tag":131,"props":409,"children":410},{},[411,413,422],{"type":123,"value":412},"برای ویندوز یا روش‌های دیگه، به ",{"type":117,"tag":414,"props":415,"children":419},"a",{"href":416,"rel":417},"https:\u002F\u002Ftinygo.org\u002Fgetting-started\u002Finstall\u002F",[418],"nofollow",[420],{"type":123,"value":421},"tinygo.org",{"type":123,"value":423}," سر بزنید.",{"type":117,"tag":377,"props":425,"children":427},{"id":426},"بررسی-نصب",[428],{"type":123,"value":43},{"type":117,"tag":131,"props":430,"children":431},{},[432],{"type":123,"value":433},"این دستورات رو اجرا کنید تا مطمئن بشید همه‌چیز آماده است:",{"type":117,"tag":395,"props":435,"children":438},{"className":436,"code":437,"language":400,"meta":401},[398],"go version\ntinygo version\n",[439],{"type":117,"tag":404,"props":440,"children":441},{"__ignoreMap":401},[442],{"type":123,"value":437},{"type":117,"tag":131,"props":444,"children":445},{},[446],{"type":123,"value":447},"خروجی باید چیزی شبیه این باشه:",{"type":117,"tag":395,"props":449,"children":453},{"className":450,"code":452,"language":123},[451],"language-text","go version go1.21.5\ntinygo version 0.31.0\n",[454],{"type":117,"tag":404,"props":455,"children":456},{"__ignoreMap":401},[457],{"type":123,"value":452},{"type":117,"tag":125,"props":459,"children":461},{"id":460},"_12-نوشتن-اولین-برنامه-go-برای-wasm",[462],{"type":123,"value":47},{"type":117,"tag":131,"props":464,"children":465},{},[466,468,474],{"type":123,"value":467},"یه پوشه پروژه بسازید و فایل ",{"type":117,"tag":404,"props":469,"children":471},{"className":470},[],[472],{"type":123,"value":473},"main.go",{"type":123,"value":475}," رو با این کد پر کنید:",{"type":117,"tag":395,"props":477,"children":482},{"className":478,"code":480,"language":481,"meta":401},[479],"language-go","package main\n\nimport \"fmt\"\n\nfunc main() {\n    fmt.Println(\"سلام از WebAssembly و Go!\")\n}\n","go",[483],{"type":117,"tag":404,"props":484,"children":485},{"__ignoreMap":401},[486],{"type":123,"value":480},{"type":117,"tag":131,"props":488,"children":489},{},[490],{"type":123,"value":491},"این کد ساده یه پیام رو تو کنسول مرورگر چاپ می‌کنه.",{"type":117,"tag":125,"props":493,"children":495},{"id":494},"_13-کامپایل-به-فرمت-wasm",[496],{"type":123,"value":51},{"type":117,"tag":131,"props":498,"children":499},{},[500],{"type":123,"value":501},"برای تبدیل کد Go به WASM، این دستور رو اجرا کنید:",{"type":117,"tag":395,"props":503,"children":506},{"className":504,"code":505,"language":400,"meta":401},[398],"tinygo build -o main.wasm -target wasm -no-debug -opt=2 main.go\n",[507],{"type":117,"tag":404,"props":508,"children":509},{"__ignoreMap":401},[510],{"type":123,"value":505},{"type":117,"tag":226,"props":512,"children":513},{},[514,525,536],{"type":117,"tag":230,"props":515,"children":516},{},[517,523],{"type":117,"tag":404,"props":518,"children":520},{"className":519},[],[521],{"type":123,"value":522},"-target wasm",{"type":123,"value":524},": خروجی رو برای مرورگرها تنظیم می‌کنه.",{"type":117,"tag":230,"props":526,"children":527},{},[528,534],{"type":117,"tag":404,"props":529,"children":531},{"className":530},[],[532],{"type":123,"value":533},"-no-debug",{"type":123,"value":535},": اندازه فایل رو کوچیک‌تر می‌کنه.",{"type":117,"tag":230,"props":537,"children":538},{},[539,545],{"type":117,"tag":404,"props":540,"children":542},{"className":541},[],[543],{"type":123,"value":544},"-opt=2",{"type":123,"value":546},": بهینه‌سازی حداکثری اعمال می‌شه.",{"type":117,"tag":131,"props":548,"children":549},{},[550,552,558],{"type":123,"value":551},"فایل ",{"type":117,"tag":404,"props":553,"children":555},{"className":554},[],[556],{"type":123,"value":557},"main.wasm",{"type":123,"value":559}," تولید می‌شه که کد باینری شماست.",{"type":117,"tag":125,"props":561,"children":563},{"id":562},"_14-آمادهسازی-فایلهای-جاوااسکریپت-و-html",[564],{"type":123,"value":55},{"type":117,"tag":131,"props":566,"children":567},{},[568,570,576,578,585],{"type":123,"value":569},"برای اجرای WASM تو مرورگر، به یه فایل جاوااسکریپت کمکی به اسم ",{"type":117,"tag":404,"props":571,"children":573},{"className":572},[],[574],{"type":123,"value":575},"wasm_exec.js",{"type":123,"value":577}," نیاز دارید. این فایل رو از ",{"type":117,"tag":414,"props":579,"children":582},{"href":580,"rel":581},"https:\u002F\u002Fgithub.com\u002Fgolang\u002Fgo\u002Fblob\u002Fmaster\u002Fmisc\u002Fwasm\u002Fwasm_exec.js",[418],[583],{"type":123,"value":584},"مخزن Go",{"type":123,"value":586}," دانلود کنید و کنار پروژه بذارید.",{"type":117,"tag":131,"props":588,"children":589},{},[590,592,598],{"type":123,"value":591},"حالا فایل ",{"type":117,"tag":404,"props":593,"children":595},{"className":594},[],[596],{"type":123,"value":597},"index.html",{"type":123,"value":599}," رو با این کد بسازید:",{"type":117,"tag":395,"props":601,"children":606},{"className":602,"code":604,"language":605,"meta":401},[603],"language-html","\u003C!DOCTYPE html>\n\u003Chtml lang=\"fa\">\n  \u003Chead>\n    \u003Cmeta charset=\"UTF-8\" \u002F>\n    \u003Ctitle>اولین پروژه WebAssembly\u003C\u002Ftitle>\n    \u003Cscript src=\"wasm_exec.js\">\u003C\u002Fscript>\n  \u003C\u002Fhead>\n  \u003Cbody>\n    \u003Ch1>سلام از WebAssembly و Go!\u003C\u002Fh1>\n    \u003Cscript>\n      const go = new Go();\n      WebAssembly.instantiateStreaming(fetch(\"main.wasm\"), go.importObject)\n        .then((result) => {\n          go.run(result.instance);\n        })\n        .catch((err) => console.error(\"خطا:\", err));\n    \u003C\u002Fscript>\n  \u003C\u002Fbody>\n\u003C\u002Fhtml>\n","html",[607],{"type":117,"tag":404,"props":608,"children":609},{"__ignoreMap":401},[610],{"type":123,"value":604},{"type":117,"tag":125,"props":612,"children":614},{"id":613},"_15-اجرای-پروژه",[615],{"type":123,"value":59},{"type":117,"tag":131,"props":617,"children":618},{},[619],{"type":123,"value":620},"یه سرور محلی راه بندازید (چون مرورگرها فایل‌های WASM رو مستقیم از سیستم نمی‌خونن):",{"type":117,"tag":395,"props":622,"children":625},{"className":623,"code":624,"language":400,"meta":401},[398],"python -m http.server 8080\n",[626],{"type":117,"tag":404,"props":627,"children":628},{"__ignoreMap":401},[629],{"type":123,"value":624},{"type":117,"tag":131,"props":631,"children":632},{},[633,635,641,643,648],{"type":123,"value":634},"حالا به ",{"type":117,"tag":404,"props":636,"children":638},{"className":637},[],[639],{"type":123,"value":640},"http:\u002F\u002Flocalhost:8080",{"type":123,"value":642}," برید. تو کنسول مرورگر (F12 > Console)، باید پیام ",{"type":117,"tag":137,"props":644,"children":645},{},[646],{"type":123,"value":647},"\"سلام از WebAssembly و Go!\"",{"type":123,"value":649}," رو ببینید.",{"type":117,"tag":118,"props":651,"children":653},{"id":652},"بخش-2-تعامل-جاوااسکریپت-و-webassembly",[654],{"type":123,"value":63},{"type":117,"tag":131,"props":656,"children":657},{},[658],{"type":123,"value":659},"حالا بیایید WASM و جاوااسکریپت رو به هم وصل کنیم تا یه ماشین‌حساب ساده بسازیم که جمع دو عدد رو انجام بده.",{"type":117,"tag":125,"props":661,"children":663},{"id":662},"_21-تعریف-تابع-در-go",[664],{"type":123,"value":67},{"type":117,"tag":131,"props":666,"children":667},{},[668,669,674],{"type":123,"value":551},{"type":117,"tag":404,"props":670,"children":672},{"className":671},[],[673],{"type":123,"value":473},{"type":123,"value":675}," رو با این کد جایگزین کنید:",{"type":117,"tag":395,"props":677,"children":680},{"className":678,"code":679,"language":481,"meta":401},[479],"package main\n\nimport \"syscall\u002Fjs\"\n\n\u002F\u002Fexport add\nfunc add(a, b int) int {\n    return a + b\n}\n\nfunc main() {\n    js.Global().Set(\"add\", js.FuncOf(func(this js.Value, args []js.Value) interface{} {\n        return add(args[0].Int(), args[1].Int())\n    }))\n    select {} \u002F\u002F برنامه رو در حال اجرا نگه می‌داریم\n}\n",[681],{"type":117,"tag":404,"props":682,"children":683},{"__ignoreMap":401},[684],{"type":123,"value":679},{"type":117,"tag":226,"props":686,"children":687},{},[688,707],{"type":117,"tag":230,"props":689,"children":690},{},[691,697,699,705],{"type":117,"tag":404,"props":692,"children":694},{"className":693},[],[695],{"type":123,"value":696},"\u002F\u002Fexport add",{"type":123,"value":698},": تابع ",{"type":117,"tag":404,"props":700,"children":702},{"className":701},[],[703],{"type":123,"value":704},"add",{"type":123,"value":706}," رو برای جاوااسکریپت قابل دسترسی می‌کنه.",{"type":117,"tag":230,"props":708,"children":709},{},[710,716],{"type":117,"tag":404,"props":711,"children":713},{"className":712},[],[714],{"type":123,"value":715},"select {}",{"type":123,"value":717},": از خروج برنامه جلوگیری می‌کنه.",{"type":117,"tag":125,"props":719,"children":721},{"id":720},"_22-کامپایل-دوباره",[722],{"type":123,"value":71},{"type":117,"tag":395,"props":724,"children":727},{"className":725,"code":726,"language":400,"meta":401},[398],"tinygo build -o main.wasm -target wasm -no-debug main.go\n",[728],{"type":117,"tag":404,"props":729,"children":730},{"__ignoreMap":401},[731],{"type":123,"value":726},{"type":117,"tag":125,"props":733,"children":735},{"id":734},"_23-بهروزرسانی-html",[736],{"type":123,"value":75},{"type":117,"tag":131,"props":738,"children":739},{},[740,741,746],{"type":123,"value":551},{"type":117,"tag":404,"props":742,"children":744},{"className":743},[],[745],{"type":123,"value":597},{"type":123,"value":747}," رو به این شکل تغییر بدید:",{"type":117,"tag":395,"props":749,"children":752},{"className":750,"code":751,"language":605,"meta":401},[603],"\u003C!DOCTYPE html>\n\u003Chtml lang=\"fa\">\n  \u003Chead>\n    \u003Cmeta charset=\"UTF-8\" \u002F>\n    \u003Ctitle>ماشین‌حساب با WebAssembly\u003C\u002Ftitle>\n    \u003Cscript src=\"wasm_exec.js\">\u003C\u002Fscript>\n  \u003C\u002Fhead>\n  \u003Cbody>\n    \u003Ch1>ماشین‌حساب ساده با Go و WASM\u003C\u002Fh1>\n    \u003Cinput type=\"number\" id=\"a\" placeholder=\"عدد اول\" \u002F>\n    \u003Cinput type=\"number\" id=\"b\" placeholder=\"عدد دوم\" \u002F>\n    \u003Cbutton id=\"calc\">محاسبه\u003C\u002Fbutton>\n    \u003Cp>نتیجه: \u003Cspan id=\"result\">0\u003C\u002Fspan>\u003C\u002Fp>\n    \u003Cscript>\n      const go = new Go();\n      WebAssembly.instantiateStreaming(fetch(\"main.wasm\"), go.importObject)\n        .then((result) => {\n          go.run(result.instance);\n          document.getElementById(\"calc\").addEventListener(\"click\", () => {\n            const a = parseInt(document.getElementById(\"a\").value);\n            const b = parseInt(document.getElementById(\"b\").value);\n            const res = window.add(a, b);\n            document.getElementById(\"result\").textContent = res;\n          });\n        })\n        .catch((err) => console.error(\"خطا:\", err));\n    \u003C\u002Fscript>\n  \u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[753],{"type":117,"tag":404,"props":754,"children":755},{"__ignoreMap":401},[756],{"type":123,"value":751},{"type":117,"tag":125,"props":758,"children":760},{"id":759},"_24-تست-پروژه",[761],{"type":123,"value":79},{"type":117,"tag":131,"props":763,"children":764},{},[765,767,773,775,781,783,788],{"type":123,"value":766},"سرور رو دوباره اجرا کنید (",{"type":117,"tag":404,"props":768,"children":770},{"className":769},[],[771],{"type":123,"value":772},"python -m http.server 8080",{"type":123,"value":774},") و به ",{"type":117,"tag":404,"props":776,"children":778},{"className":777},[],[779],{"type":123,"value":780},"localhost:8080",{"type":123,"value":782}," برید. دو عدد وارد کنید، روی ",{"type":117,"tag":137,"props":784,"children":785},{},[786],{"type":123,"value":787},"محاسبه",{"type":123,"value":789}," کلیک کنید و نتیجه جمع رو ببینید. این تعامل نشون می‌ده چطور WASM و جاوااسکریپت می‌تونن باهم کار کنن.",{"type":117,"tag":118,"props":791,"children":793},{"id":792},"بخش-3-تغییر-dom-با-webassembly",[794],{"type":123,"value":83},{"type":117,"tag":131,"props":796,"children":797},{},[798],{"type":123,"value":799},"حالا بیایید مستقیماً از Go به DOM مرورگر دسترسی پیدا کنیم و یه پیام پویا اضافه کنیم.",{"type":117,"tag":125,"props":801,"children":803},{"id":802},"_31-کد-go-برای-تغییر-dom",[804],{"type":123,"value":87},{"type":117,"tag":131,"props":806,"children":807},{},[808,809,814],{"type":123,"value":551},{"type":117,"tag":404,"props":810,"children":812},{"className":811},[],[813],{"type":123,"value":473},{"type":123,"value":815}," رو با این کد به‌روزرسانی کنید:",{"type":117,"tag":395,"props":817,"children":820},{"className":818,"code":819,"language":481,"meta":401},[479],"package main\n\nimport \"syscall\u002Fjs\"\n\nfunc main() {\n    document := js.Global().Get(\"document\")\n    div := document.Call(\"createElement\", \"div\")\n    div.Set(\"innerHTML\", \"این پیام از Go و WebAssembly اومده!\")\n    div.Set(\"style\", \"color: blue; font-size: 18px; margin-top: 10px;\")\n    document.Get(\"body\").Call(\"appendChild\", div)\n\n    select {} \u002F\u002F برنامه رو فعال نگه می‌داریم\n}\n",[821],{"type":117,"tag":404,"props":822,"children":823},{"__ignoreMap":401},[824],{"type":123,"value":819},{"type":117,"tag":226,"props":826,"children":827},{},[828,839],{"type":117,"tag":230,"props":829,"children":830},{},[831,837],{"type":117,"tag":404,"props":832,"children":834},{"className":833},[],[835],{"type":123,"value":836},"syscall\u002Fjs",{"type":123,"value":838},": به Go اجازه می‌ده با DOM و جاوااسکریپت تعامل کنه.",{"type":117,"tag":230,"props":840,"children":841},{},[842,844,850],{"type":123,"value":843},"کد بالا یه ",{"type":117,"tag":404,"props":845,"children":847},{"className":846},[],[848],{"type":123,"value":849},"div",{"type":123,"value":851}," جدید می‌سازه و پیامی رو تو صفحه نمایش می‌ده.",{"type":117,"tag":125,"props":853,"children":855},{"id":854},"_32-کامپایل-و-اجرا",[856],{"type":123,"value":91},{"type":117,"tag":395,"props":858,"children":860},{"className":859,"code":726,"language":400,"meta":401},[398],[861],{"type":117,"tag":404,"props":862,"children":863},{"__ignoreMap":401},[864],{"type":123,"value":726},{"type":117,"tag":131,"props":866,"children":867},{},[868,869,874],{"type":123,"value":551},{"type":117,"tag":404,"props":870,"children":872},{"className":871},[],[873],{"type":123,"value":597},{"type":123,"value":875}," رو به حالت ساده برگردونید:",{"type":117,"tag":395,"props":877,"children":880},{"className":878,"code":879,"language":605,"meta":401},[603],"\u003C!DOCTYPE html>\n\u003Chtml lang=\"fa\">\n  \u003Chead>\n    \u003Cmeta charset=\"UTF-8\" \u002F>\n    \u003Ctitle>تغییر DOM با WebAssembly\u003C\u002Ftitle>\n    \u003Cscript src=\"wasm_exec.js\">\u003C\u002Fscript>\n  \u003C\u002Fhead>\n  \u003Cbody>\n    \u003Ch1>تغییر DOM با Go و WASM\u003C\u002Fh1>\n    \u003Cscript>\n      const go = new Go();\n      WebAssembly.instantiateStreaming(fetch(\"main.wasm\"), go.importObject)\n        .then((result) => {\n          go.run(result.instance);\n        })\n        .catch((err) => console.error(\"خطا:\", err));\n    \u003C\u002Fscript>\n  \u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[881],{"type":117,"tag":404,"props":882,"children":883},{"__ignoreMap":401},[884],{"type":123,"value":879},{"type":117,"tag":125,"props":886,"children":888},{"id":887},"_33-تست-پروژه",[889],{"type":123,"value":95},{"type":117,"tag":131,"props":891,"children":892},{},[893,895,900,902,907],{"type":123,"value":894},"سرور رو اجرا کنید و به ",{"type":117,"tag":404,"props":896,"children":898},{"className":897},[],[899],{"type":123,"value":780},{"type":123,"value":901}," برید. باید یه پیام آبی‌رنگ با متن ",{"type":117,"tag":137,"props":903,"children":904},{},[905],{"type":123,"value":906},"\"این پیام از Go و WebAssembly اومده!\"",{"type":123,"value":908}," زیر عنوان ببینید. این نشون می‌ده WASM می‌تونه مستقیماً DOM رو دستکاری کنه.",{"type":117,"tag":118,"props":910,"children":912},{"id":911},"نتیجهگیری-قدم-اول-به-سوی-wasm",[913],{"type":123,"value":99},{"type":117,"tag":131,"props":915,"children":916},{},[917,919,924,926,930,931,935],{"type":123,"value":918},"تو این ماژول، با ",{"type":117,"tag":137,"props":920,"children":921},{},[922],{"type":123,"value":923},"WebAssembly",{"type":123,"value":925}," آشنا شدید و یاد گرفتید چطور با ",{"type":117,"tag":137,"props":927,"children":928},{},[929],{"type":123,"value":192},{"type":123,"value":187},{"type":117,"tag":137,"props":932,"children":933},{},[934],{"type":123,"value":331},{"type":123,"value":936}," برنامه‌های وب سریع و امن بسازید. از چاپ یه پیام ساده تو کنسول تا ساخت یه ماشین‌حساب تعاملی و تغییر DOM، قدم‌های اولیه رو برداشتید. WASM دنیایی از امکاناته: از اجرای بازی‌های سنگین تو مرورگر تا اپلیکیشن‌های ابری پیچیده. تو ماژول‌های بعدی، سراغ موضوعات پیشرفته‌تر می‌ریم، مثل بهینه‌سازی عملکرد، کار با کتابخونه‌های C++ و ادغام با فریم‌ورک‌های مدرن.",{"type":117,"tag":125,"props":938,"children":940},{"id":939},"نکات-کلیدی",[941],{"type":123,"value":103},{"type":117,"tag":226,"props":943,"children":944},{},[945,950,955,960],{"type":117,"tag":230,"props":946,"children":947},{},[948],{"type":123,"value":949},"WASM سرعت و امنیت رو به برنامه‌های وب میاره.",{"type":117,"tag":230,"props":951,"children":952},{},[953],{"type":123,"value":954},"TinyGo ابزار سبک و قدرتمندیه برای پروژه‌های WASM.",{"type":117,"tag":230,"props":956,"children":957},{},[958],{"type":123,"value":959},"تعامل جاوااسکریپت و WASM امکانات بی‌نهایتی فراهم می‌کنه.",{"type":117,"tag":230,"props":961,"children":962},{},[963],{"type":123,"value":964},"تغییر DOM با Go نشون‌دهنده انعطاف‌پذیری WASMه.",{"type":117,"tag":118,"props":966,"children":968},{"id":967},"منابع-برای-ادامه-یادگیری",[969],{"type":123,"value":107},{"type":117,"tag":226,"props":971,"children":972},{},[973,992,1010,1028,1046],{"type":117,"tag":230,"props":974,"children":975},{},[976,981,983,990],{"type":117,"tag":137,"props":977,"children":978},{},[979],{"type":123,"value":980},"وب‌سایت رسمی WebAssembly",{"type":123,"value":982},": ",{"type":117,"tag":414,"props":984,"children":987},{"href":985,"rel":986},"https:\u002F\u002Fwebassembly.org",[418],[988],{"type":123,"value":989},"webassembly.org",{"type":123,"value":991}," برای مفاهیم پایه.",{"type":117,"tag":230,"props":993,"children":994},{},[995,1000,1001,1008],{"type":117,"tag":137,"props":996,"children":997},{},[998],{"type":123,"value":999},"مستندات TinyGo",{"type":123,"value":982},{"type":117,"tag":414,"props":1002,"children":1005},{"href":1003,"rel":1004},"https:\u002F\u002Ftinygo.org\u002Fdocs",[418],[1006],{"type":123,"value":1007},"tinygo.org\u002Fdocs",{"type":123,"value":1009}," برای راهنمای کامل.",{"type":117,"tag":230,"props":1011,"children":1012},{},[1013,1018,1019,1026],{"type":117,"tag":137,"props":1014,"children":1015},{},[1016],{"type":123,"value":1017},"مخزن GitHub TinyGo",{"type":123,"value":982},{"type":117,"tag":414,"props":1020,"children":1023},{"href":1021,"rel":1022},"https:\u002F\u002Fgithub.com\u002Ftinygo-org",[418],[1024],{"type":123,"value":1025},"github.com\u002Ftinygo-org",{"type":123,"value":1027}," برای مثال‌های بیشتر.",{"type":117,"tag":230,"props":1029,"children":1030},{},[1031,1036,1037,1044],{"type":117,"tag":137,"props":1032,"children":1033},{},[1034],{"type":123,"value":1035},"MDN WebAssembly",{"type":123,"value":982},{"type":117,"tag":414,"props":1038,"children":1041},{"href":1039,"rel":1040},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWebAssembly",[418],[1042],{"type":123,"value":1043},"developer.mozilla.org\u002Fen-US\u002Fdocs\u002FWebAssembly",{"type":123,"value":1045}," برای نکات جاوااسکریپت.",{"type":117,"tag":230,"props":1047,"children":1048},{},[1049,1054,1055,1062],{"type":117,"tag":137,"props":1050,"children":1051},{},[1052],{"type":123,"value":1053},"انجمن WebAssembly",{"type":123,"value":982},{"type":117,"tag":414,"props":1056,"children":1059},{"href":1057,"rel":1058},"https:\u002F\u002Freddit.com\u002Fr\u002FWebAssembly",[418],[1060],{"type":123,"value":1061},"reddit.com\u002Fr\u002FWebAssembly",{"type":123,"value":1063}," برای بحث و پشتیبانی.",{"type":117,"tag":131,"props":1065,"children":1066},{},[1067],{"type":123,"value":1068},"بیایید تو ماژول بعدی، WASM رو به پروژه‌های بزرگ‌تر ببریم و وب رو سریع‌تر کنیم!",1781786496206]