معماری Event Loop در جاوااسکریپت : مدیریت همروندی پشت صحنه
جاوااسکریپت Single-threaded (تکنخی) هست یعنی فقط یک Call Stack داره و در هر لحظه میتونه دقیقا یک خط کد رو پردازش کنه. اما چطور بدون قفل شدن رابط کاربری، همزمان ریکوئستهای شبکه رو ارسال میکنیم، تایمر میزاریم و انیمیشنها رو اجرا میکنیم؟ این جادوی همروندی، وظیفه فرآیندی به اسم Event Loop عه
برای درک مهندسی این سیستم، باید محیط اجرای جاوااسکریپت (Runtime) رو به ۴ قطعهی اصلی تقسیم کنیم :
⚙️ اجزای اصلی معماری سیستم
Call Stack :
پردازنده اصلی کدهای همگام (Sync) که خط به خط و به ترتیب لایفو (LIFO) اجرا میشن
Web APIs :
این بخش جزو موتور جاوااسکریپت نیست، بلکه مرورگر یا Node.js این نخهای جداگانه را در پسزمینه فراهم میکنه تا کارهایی مثل تایمرها یا ریکوئستهای شبکه رو اونجا پردازش کنه.
Microtask Queue (صف VIP) :
صفِ نگهداری کالبکهای با اولویت بالا مثل
Task Queue (صف عادی) یا Macrotasks ها هم بهش میگن :
صفِ نگهداری کالبکهای معمولی مثل
🔄 الگوریتم Event Loop چطور کار میکنه ؟
حلقه رویداد یک مکانیزم مداوم هست که پشت صحنه این مراحل رو طی میکنه :
بررسی استک : اول چک میکنه که آیا کدهای همگام (Call Stack) کاملا خالی شدهاند یا نه. تا استک خالی نشه، کار جدیدی رو شروع نمیکنه
تخلیه صف VIP : به محض خالی شدن استک، سراغ Microtask Queue میره و تمام کالبکهای داخل اون رو یکییکی اجرا میکنه تا این صف کاملا صفر بشه
اجرای صف عادی : در نهایت سراغ Task Queue میره و فقط یک کالبک را برمیداره، به استک میفرستد تا اجرا بشه و دوباره به مرحله اول برمیگرده
یک تست مهندسی معروف
به ترتیب خروجی این کد دقت کنین
با اینکه تایمر روی صفر میلیثانیه تنظیم شده اما خروجی به این ترتیبه :
1 => 4 => 3 => 2
علتش چیه ؟
اعداد
کالبکِ
کالبکِ
بعد از اتمام کدهای همگام، Event Loop اول صف VIP را خالی میکند (چاپ عدد
اینم نحوه Event Loop توی موتور js که خیلی مبحث مهمی برای درک ترتیب اجرای کدهاتون هست و توی سوالات مصاحبه ای پرسیده میشه 😉
#Labs_js
جاوااسکریپت Single-threaded (تکنخی) هست یعنی فقط یک Call Stack داره و در هر لحظه میتونه دقیقا یک خط کد رو پردازش کنه. اما چطور بدون قفل شدن رابط کاربری، همزمان ریکوئستهای شبکه رو ارسال میکنیم، تایمر میزاریم و انیمیشنها رو اجرا میکنیم؟ این جادوی همروندی، وظیفه فرآیندی به اسم Event Loop عه
برای درک مهندسی این سیستم، باید محیط اجرای جاوااسکریپت (Runtime) رو به ۴ قطعهی اصلی تقسیم کنیم :
⚙️ اجزای اصلی معماری سیستم
Call Stack :
پردازنده اصلی کدهای همگام (Sync) که خط به خط و به ترتیب لایفو (LIFO) اجرا میشن
Web APIs :
این بخش جزو موتور جاوااسکریپت نیست، بلکه مرورگر یا Node.js این نخهای جداگانه را در پسزمینه فراهم میکنه تا کارهایی مثل تایمرها یا ریکوئستهای شبکه رو اونجا پردازش کنه.
Microtask Queue (صف VIP) :
صفِ نگهداری کالبکهای با اولویت بالا مثل
Promise.then و async/await.Task Queue (صف عادی) یا Macrotasks ها هم بهش میگن :
صفِ نگهداری کالبکهای معمولی مثل
setTimeout و رویدادهای کلیک🔄 الگوریتم Event Loop چطور کار میکنه ؟
حلقه رویداد یک مکانیزم مداوم هست که پشت صحنه این مراحل رو طی میکنه :
بررسی استک : اول چک میکنه که آیا کدهای همگام (Call Stack) کاملا خالی شدهاند یا نه. تا استک خالی نشه، کار جدیدی رو شروع نمیکنه
تخلیه صف VIP : به محض خالی شدن استک، سراغ Microtask Queue میره و تمام کالبکهای داخل اون رو یکییکی اجرا میکنه تا این صف کاملا صفر بشه
اجرای صف عادی : در نهایت سراغ Task Queue میره و فقط یک کالبک را برمیداره، به استک میفرستد تا اجرا بشه و دوباره به مرحله اول برمیگرده
یک تست مهندسی معروف
به ترتیب خروجی این کد دقت کنین
console.log('1');
setTimeout(() => {
console.log('2');
}, 0);
Promise.resolve().then(() => {
console.log('3');
});
console.log('4');با اینکه تایمر روی صفر میلیثانیه تنظیم شده اما خروجی به این ترتیبه :
1 => 4 => 3 => 2
علتش چیه ؟
اعداد
1 و 4 کدهای همگام هستن و مستقیم توی استک اجرا میشنکالبکِ
setTimeout به صف عادی (Task Queue) میرهکالبکِ
Promise به صف VIP (Microtask Queue) میرهبعد از اتمام کدهای همگام، Event Loop اول صف VIP را خالی میکند (چاپ عدد
3) و در آخر سراغ صف عادی (چاپ عدد 2) میرهاینم نحوه Event Loop توی موتور js که خیلی مبحث مهمی برای درک ترتیب اجرای کدهاتون هست و توی سوالات مصاحبه ای پرسیده میشه 😉
#Labs_js
❤6🔥2
از قوی ترین مدل حال حاضر که رقابت با کلاد داره برید استفاده کنین
روزانه 5 میلیون توکن رایگان هم بهتون میده
https://chat.z.ai/
روزانه 5 میلیون توکن رایگان هم بهتون میده
https://chat.z.ai/
chat.z.ai
Z.ai - Advanced AI Chatbot & Agent powered by GLM-5.2
Meet Z.ai, the AI assistant powered by GLM-5.2. Build websites, write code, handle long-horizon tasks, and get instant answers. Fast, smart, and reliable.
❤4
Foad Labs
از قوی ترین مدل حال حاضر که رقابت با کلاد داره برید استفاده کنین روزانه 5 میلیون توکن رایگان هم بهتون میده https://chat.z.ai/
با استفاده از این ادیتور هوش مصنوعی که بهتون دسترسی به glm-5.2 و نسخه توربو میده دارم یه نیاز رو تبدیل به محصول میکنم
امیدوارم توی ماه آینده یا شایدم زودتر یه نسخه اولیه ازش بتونم بدم بیرون
شما ازش برای چه کاری استفاده کردین ؟ یا اصلا نگاهشم نکردین ؟
امیدوارم توی ماه آینده یا شایدم زودتر یه نسخه اولیه ازش بتونم بدم بیرون
شما ازش برای چه کاری استفاده کردین ؟ یا اصلا نگاهشم نکردین ؟
❤1
تصمیم گرفتم کتابهای مربوط به برنامه نویسی رو شروع کنم و از کتاب React_Modern_Patterns_for_Developing_React_Apps شروع کردم
❤4
براتون روزانه آپدیت و مطالبی که یاد گرفتم رو در قالب پست های بهم پیوسته میزارم ❤️
❤3👍2
📕کتاب React Modern Patterns for Developing React Apps
〽️ ریاکت چطوری ساخته و وارد بازار برنامه نویسی شد؟
ریاکت توسط یه مهندس نرم افزار به اسم Jordan Walk که توی Facebook کار میکرد برپا شد و در سال 2011 در بخش خبری فیسبوک و بعد از اینکه توسط فیسبوک خریداری شد در سال 2012 در اینستاگرام هم گنجانده شد این برنامه.
توی سال 2013 ریاکت توسط جامعه JSConf به صورت اپن سورس ارائه شد و به دسته بندی هزاران کتابخونه دیگه مثل Angular, Dojo و ... پیوست.
ریاکت خودش رو به عنوان کلمه V در عبارت MVP که بیانگر View هست توصیف کرد که یعنی با استفاده از کامپوننتهای ساخته شده توسط اون به عنوان رابط کاربری javascript شما دیده میشن.
از همونجا بود که استفاده ازش بین کامیونیتی شروع کرد به پخش شدن. تو ژانویه 2015 نتفلیکس اعلام کرد که داره از React برای ساختن UI خودش استفاده میکنه. اواخر همون ماه هم React Native منتشر شد که یه کتابخونه برای ساخت اپلیکیشنهای موبایل با همون React بود. فیسبوک هم ReactVR رو منتشر کرد، یه ابزار دیگه که React رو به هدفهای رندرینگ گستردهتری میبرد. تو سالهای 2015 و 2016 هم یه تعداد خیلی زیاد از ابزارهای معروف مثل React Router، Redux و MobX اومدن روی کار تا کارهایی مثل Routing و State Management رو هندل کنن. آخرش هم React به عنوان یه کتابخونه شناخته میشد: یعنی فقط حواسش به پیادهسازی یه سری ویژگیهای خاص بود، نه اینکه بخواد برای هر کیس و استفادهای یه ابزار ارائه بده.
یه اتفاق خیلی بزرگ دیگه تو این تایملاین، انتشار React Fiber تو سال 2017 بود. فایبر یه بازنویسی از الگوریتم رندرینگ React بود که تو اجراش یه جورایی جادویی بود. این یه بازنویسی کامل از بخشهای داخلی React بود که تقریباً هیچ تغییری تو API عمومیش ایجاد نکرد. در واقع یه راهی بود برای اینکه React رو مدرنتر و سریعتر کنه بدون اینکه روی کاربران و برنامهنویسا تاثیری بذاره.
#RMP_ep1
〽️ ریاکت چطوری ساخته و وارد بازار برنامه نویسی شد؟
ریاکت توسط یه مهندس نرم افزار به اسم Jordan Walk که توی Facebook کار میکرد برپا شد و در سال 2011 در بخش خبری فیسبوک و بعد از اینکه توسط فیسبوک خریداری شد در سال 2012 در اینستاگرام هم گنجانده شد این برنامه.
توی سال 2013 ریاکت توسط جامعه JSConf به صورت اپن سورس ارائه شد و به دسته بندی هزاران کتابخونه دیگه مثل Angular, Dojo و ... پیوست.
ریاکت خودش رو به عنوان کلمه V در عبارت MVP که بیانگر View هست توصیف کرد که یعنی با استفاده از کامپوننتهای ساخته شده توسط اون به عنوان رابط کاربری javascript شما دیده میشن.
از همونجا بود که استفاده ازش بین کامیونیتی شروع کرد به پخش شدن. تو ژانویه 2015 نتفلیکس اعلام کرد که داره از React برای ساختن UI خودش استفاده میکنه. اواخر همون ماه هم React Native منتشر شد که یه کتابخونه برای ساخت اپلیکیشنهای موبایل با همون React بود. فیسبوک هم ReactVR رو منتشر کرد، یه ابزار دیگه که React رو به هدفهای رندرینگ گستردهتری میبرد. تو سالهای 2015 و 2016 هم یه تعداد خیلی زیاد از ابزارهای معروف مثل React Router، Redux و MobX اومدن روی کار تا کارهایی مثل Routing و State Management رو هندل کنن. آخرش هم React به عنوان یه کتابخونه شناخته میشد: یعنی فقط حواسش به پیادهسازی یه سری ویژگیهای خاص بود، نه اینکه بخواد برای هر کیس و استفادهای یه ابزار ارائه بده.
یه اتفاق خیلی بزرگ دیگه تو این تایملاین، انتشار React Fiber تو سال 2017 بود. فایبر یه بازنویسی از الگوریتم رندرینگ React بود که تو اجراش یه جورایی جادویی بود. این یه بازنویسی کامل از بخشهای داخلی React بود که تقریباً هیچ تغییری تو API عمومیش ایجاد نکرد. در واقع یه راهی بود برای اینکه React رو مدرنتر و سریعتر کنه بدون اینکه روی کاربران و برنامهنویسا تاثیری بذاره.
#RMP_ep1
❤4
یکم ناخوش احوالم نتونستم کتاب بخونم و براتون مطالبش رو بزارم
فردا جبرانش انشالا ❤️
فردا جبرانش انشالا ❤️
🔥1
🎫 ایونت معرفی ۴ ماه کارورزی فشرده توی آوینوکس
که دیروز برگزار شد و به نسبت ایونت جالب و مفیدی بود
اصل موضوع یک دوره ۴ ماهه کارورزی توی کارخونه نوآوری آوینوکس بود که تحت نظر شرکت مادر یعنی آواپرداز قرار داشت
و به ۶ تا آزمایشگاه مختلف و تخصصی تقسیم میشد این دوره و طی نظر منتور های متخصص شما مباحث تئوری رو یاد میگرفتین و بعد توی آزمایشگاه به صورت تیمی و عملی روی پروژههای شبیه سازی شده واقعی کار میکردین
و اینم بگم که تمام مراحلشون از ثبت نام بگیر تا پایان دوره یک شبیه سازی کامل از استخدام بود یعنی شما در طول هفته باید ۴۵ ساعت توی کاخونه مثل شرکتها حضور داشته باشی و غیب های موجه میتونی داشته باشی و همینطور
مرخصی و ...
درکل دوره کارورزی خوب و تمیزیه برای افرادی که میخان حوضه مورد علاقشونو پیدا کنن و توی یه فیلد خاص با افراد هم هدف خودشون ارتباط بگیرن و جلو برن.
که دیروز برگزار شد و به نسبت ایونت جالب و مفیدی بود
اصل موضوع یک دوره ۴ ماهه کارورزی توی کارخونه نوآوری آوینوکس بود که تحت نظر شرکت مادر یعنی آواپرداز قرار داشت
و به ۶ تا آزمایشگاه مختلف و تخصصی تقسیم میشد این دوره و طی نظر منتور های متخصص شما مباحث تئوری رو یاد میگرفتین و بعد توی آزمایشگاه به صورت تیمی و عملی روی پروژههای شبیه سازی شده واقعی کار میکردین
و اینم بگم که تمام مراحلشون از ثبت نام بگیر تا پایان دوره یک شبیه سازی کامل از استخدام بود یعنی شما در طول هفته باید ۴۵ ساعت توی کاخونه مثل شرکتها حضور داشته باشی و غیب های موجه میتونی داشته باشی و همینطور
مرخصی و ...
درکل دوره کارورزی خوب و تمیزیه برای افرادی که میخان حوضه مورد علاقشونو پیدا کنن و توی یه فیلد خاص با افراد هم هدف خودشون ارتباط بگیرن و جلو برن.
❤1🔥1
🚀 TypeScript 7
منتشر شد؛ بزرگترین تغییر تاریخ TypeScript!
مایکروسافت در TypeScript 7، کامپایلر و Language Server را از پایهی قبلی به Go پورت کرده تا بهصورت Native اجرا شوند. نتیجه؟ عملکردی که در بسیاری از پروژهها تا ۱۰ برابر سریعتر از TypeScript 6 است.
✨ مهمترین تغییرات:
- ⚡ کامپایلر Native مبتنی بر Go
- 🚀 تا ۱۰ برابر افزایش سرعت Type Checking و Build
- 🧠 IntelliSense و Autocomplete سریعتر در VS Code
- 💾 مصرف حافظه کمتر در پروژههای بزرگ
- 🔄 استفاده از Parallelism برای پردازش همزمان و عملکرد بهتر
نکته جالب اینجاست که تیم TypeScript این پروژه را بازنویسی کامل نکرده؛ بلکه منطق کامپایلر فعلی را به Go پورت کرده تا سازگاری حفظ شود و در عین حال از سرعت اجرای Native بهره ببرد.
اگر روی پروژههای بزرگ React، Next.js یا Node.js کار میکنید، این نسخه میتواند زمان Build و Type Checking را به شکل محسوسی کاهش دهد.
💬 شما بعد از انتشار TypeScript 7 مهاجرت میکنید یا فعلاً روی نسخههای قبلی میمونین؟
منتشر شد؛ بزرگترین تغییر تاریخ TypeScript!
مایکروسافت در TypeScript 7، کامپایلر و Language Server را از پایهی قبلی به Go پورت کرده تا بهصورت Native اجرا شوند. نتیجه؟ عملکردی که در بسیاری از پروژهها تا ۱۰ برابر سریعتر از TypeScript 6 است.
✨ مهمترین تغییرات:
- ⚡ کامپایلر Native مبتنی بر Go
- 🚀 تا ۱۰ برابر افزایش سرعت Type Checking و Build
- 🧠 IntelliSense و Autocomplete سریعتر در VS Code
- 💾 مصرف حافظه کمتر در پروژههای بزرگ
- 🔄 استفاده از Parallelism برای پردازش همزمان و عملکرد بهتر
نکته جالب اینجاست که تیم TypeScript این پروژه را بازنویسی کامل نکرده؛ بلکه منطق کامپایلر فعلی را به Go پورت کرده تا سازگاری حفظ شود و در عین حال از سرعت اجرای Native بهره ببرد.
اگر روی پروژههای بزرگ React، Next.js یا Node.js کار میکنید، این نسخه میتواند زمان Build و Type Checking را به شکل محسوسی کاهش دهد.
💬 شما بعد از انتشار TypeScript 7 مهاجرت میکنید یا فعلاً روی نسخههای قبلی میمونین؟
حتما یکی از پروژهامو انتقال میدم به تایپ ۷ و نتیجه بیلد قبل و بعدش رو میزارم براتون
❤2
👀 یه سوال ساده :
اگه یه کامپوننت رو با
جواب کوتاه : نه همیشه.
نتیجه؟ memo هیچ کاری نمیکنه و کامپوننت بازم رندر میشه.
راهحلش اینه که خود رفرنس رو ثابت نگه دارین، نه اینکه فقط فرزند رو memoize کنین. برای function از
منبع رسمی
اگه یه کامپوننت رو با
React.memo بپیچونید، مطمئنین دیگه بیخودی رندر نمیشه؟جواب کوتاه : نه همیشه.
React.memo فقط پراپها رو با === مقایسه میکنه. حالا اگه یکی از پراپهاتون یه object یا function باشه که هر بار توی parent از نو ساخته میشه، از نظر رفرنس با دفعه قبل فرق داره — حتی اگه محتواش عین هم باشه.نتیجه؟ memo هیچ کاری نمیکنه و کامپوننت بازم رندر میشه.
راهحلش اینه که خود رفرنس رو ثابت نگه دارین، نه اینکه فقط فرزند رو memoize کنین. برای function از
useCallback و برای object/array از useMemo کمک بگیرین.منبع رسمی
👍2🔥1