جاوااسکریپت | JavaScript
php-node یک ماژول بومی برای Node است که امکان اجرای برنامههای PHP را در محیط Node فراهم میکند. چرا باید چنین کاری کرد؟ برای مهاجرت دادن برنامههای قدیمی، ساخت اپلیکیشنهای ترکیبی PHP و JavaScript، یا حتی اپلیکیشنهای Nodeای که به هر دلیلی نیاز دارند بخشهایی…
لاراول و Node.js: اجرای PHP در محیط Watt Runtime
[مطالعه در وبلاگ Platformatic](https://blog.platformatic.dev/laravel-nodejs-php-in-watt-runtime)
در ماه ژوئن، پروژهای با نام php-node معرفی شد که روشی نوین برای *پر کردن فاصله بین PHP و Node.js* ارائه میداد؛ بهطوریکه میتوانستیم کدهای PHP را درون برنامههای Node اجرا کنیم.
اکنون این رویکرد یک گام فراتر رفته است: با بهرهگیری از php-node و سرور برنامهای Watt**، امکان **اجرای برنامههای لاراول (Laravel) نیز فراهم شده است.
این پروژه، پیوندی جالب و نوآورانه میان دو اکوسیستم محبوب یعنی PHP و Node.js ایجاد کرده و راهی تازه برای همزیستی آنها در یک پروژه واحد فراهم میسازد.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
[مطالعه در وبلاگ Platformatic](https://blog.platformatic.dev/laravel-nodejs-php-in-watt-runtime)
در ماه ژوئن، پروژهای با نام php-node معرفی شد که روشی نوین برای *پر کردن فاصله بین PHP و Node.js* ارائه میداد؛ بهطوریکه میتوانستیم کدهای PHP را درون برنامههای Node اجرا کنیم.
اکنون این رویکرد یک گام فراتر رفته است: با بهرهگیری از php-node و سرور برنامهای Watt**، امکان **اجرای برنامههای لاراول (Laravel) نیز فراهم شده است.
این پروژه، پیوندی جالب و نوآورانه میان دو اکوسیستم محبوب یعنی PHP و Node.js ایجاد کرده و راهی تازه برای همزیستی آنها در یک پروژه واحد فراهم میسازد.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
❤4
### انواع رشتهای قالبدار (Template Literal Types) در TypeScript: چرا به آنها نیاز داریم؟ 🤨
با آنکه این قابلیتها بهطور مکرر استفاده نمیشوند، اما میتوانند حل برخی مسائل خاص را بسیار سادهتر کنند — مسائلی مانند تولید کلیدها یا مدیریت مسیرها.
---
### ❓ این قابلیت چیست؟
انواع رشتهای قالبدار در TypeScript این امکان را میدهند که رشتههایی با ساختار پویا بسازیم، با استفاده از ساختار
#### نمونه:
در اینجا، نوع
---
### 🧑💻 این ویژگی چه زمانی مفید است؟
#### ✔️ تولید کلیدها:
زمانی که نیاز است چندین کلید با ساختار یکسان تولید شود، میتوان با استفاده از رشتههای قالبدار، از تکرار و خطاهای احتمالی جلوگیری کرد.
---
#### ✔️ کار با مسیرها و URLها:
در مواردی که نیاز است مسیرهایی با بخشهای پویا تعریف شوند — مانند مسیرهای کاربری یا API.
---
#### ✔️ تولید مقادیر خاص و کنترلشده:
زمانی که بخواهیم رشتههایی با الگوهای خاص و پیشوندهای مشخص داشته باشیم و سایر مقادیر را مجاز ندانیم.
---
### ✅ جمعبندی:
استفاده از رشتههای قالبدار در TypeScript این امکان را فراهم میکند که رشتههایی با ساختار مشخص و الگوهای ثابت را با دقت و ایمنی بالا نوعدهی کنیم. این ویژگی بهویژه در پروژههایی که نیاز به کار با دادههای پویا اما ساختاریافته دارند، بسیار کاربردی است و خطاهای رایج را به حداقل میرساند. 👍
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
با آنکه این قابلیتها بهطور مکرر استفاده نمیشوند، اما میتوانند حل برخی مسائل خاص را بسیار سادهتر کنند — مسائلی مانند تولید کلیدها یا مدیریت مسیرها.
---
### ❓ این قابلیت چیست؟
انواع رشتهای قالبدار در TypeScript این امکان را میدهند که رشتههایی با ساختار پویا بسازیم، با استفاده از ساختار
${}
برای ترکیب بخشهای مختلف. این کار به تعریف انواع دقیقتر، ایمنتر و انعطافپذیرتر کمک میکند.#### نمونه:
type Key = `${string}_action`;
در اینجا، نوع
Key
میتواند هر رشتهای باشد که با _action
پایان مییابد.---
### 🧑💻 این ویژگی چه زمانی مفید است؟
#### ✔️ تولید کلیدها:
زمانی که نیاز است چندین کلید با ساختار یکسان تولید شود، میتوان با استفاده از رشتههای قالبدار، از تکرار و خطاهای احتمالی جلوگیری کرد.
type Prefix = 'user' | 'admin';
type Action = 'create' | 'edit' | 'delete';
type ActionKey = `${Prefix}_${Action}`;
// 'user_create' | 'admin_edit' | و مانند آنها
---
#### ✔️ کار با مسیرها و URLها:
در مواردی که نیاز است مسیرهایی با بخشهای پویا تعریف شوند — مانند مسیرهای کاربری یا API.
type UserProfileUrl = `users/${string}/profile`;
// 'users/۱۲۳/profile' | 'users/john/profile' و غیره
---
#### ✔️ تولید مقادیر خاص و کنترلشده:
زمانی که بخواهیم رشتههایی با الگوهای خاص و پیشوندهای مشخص داشته باشیم و سایر مقادیر را مجاز ندانیم.
---
### ✅ جمعبندی:
استفاده از رشتههای قالبدار در TypeScript این امکان را فراهم میکند که رشتههایی با ساختار مشخص و الگوهای ثابت را با دقت و ایمنی بالا نوعدهی کنیم. این ویژگی بهویژه در پروژههایی که نیاز به کار با دادههای پویا اما ساختاریافته دارند، بسیار کاربردی است و خطاهای رایج را به حداقل میرساند. 👍
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
### Visual Viewport API: ردیابی بزرگنمایی و تغییرات ناحیهی دید 🤩
اگر تا به حال به این فکر کردهاید که چطور میتوان تغییرات در بزرگنمایی (zoom) صفحه یا واکنش به تغییر ابعاد پنجره در دستگاههای موبایل را شناسایی کرد، خبر خوبی برایتان دارم — من بهتازگی با API جالبی به نام Visual Viewport API آشنا شدم! 🎉
**Visual Viewport API** ابزاری است که به شما امکان میدهد بفهمید کاربر در حال حاضر سایت شما را *چگونه میبیند* و بتوانید رابط کاربری را متناسب با اقدامات او تنظیم کنید.
این API به شما دسترسی میدهد به ناحیهی دید بصری — یعنی آن بخش از صفحه که در لحظه روی نمایشگر دیده میشود، نه کل محتوای صفحه.
---
### با Visual Viewport API چه اطلاعاتی میتوان بهدست آورد؟
#### 🔍 ردیابی بزرگنمایی (Zoom)
از طریق ویژگی
---
#### 📏 تغییر اندازهی ناحیهی دید
زمانیکه اندازهی بخش قابلمشاهدهی صفحه تغییر میکند (برای مثال، هنگام بزرگنمایی یا چرخش صفحهنمایش)، میتوان از
---
#### ➡️ تشخیص جابهجایی ناحیهی دید
با استفاده از
---
### پشتیبانی از رویدادهای
این API از رویدادهای
---
### ✅ جمعبندی
با استفاده از Visual Viewport API میتوانید رابطهایی طراحی کنید که نسبت به رفتارهای کاربر مانند بزرگنمایی یا پیمایش (scroll) واکنش نشان دهند. این ویژگی بهویژه برای طراحی رابطهای موبایل بسیار ارزشمند است. 🙂
—
دموی این قابلیت را میتوانید در این لینک مشاهده کنید:
🔗 مشاهده کد در CodePen
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
اگر تا به حال به این فکر کردهاید که چطور میتوان تغییرات در بزرگنمایی (zoom) صفحه یا واکنش به تغییر ابعاد پنجره در دستگاههای موبایل را شناسایی کرد، خبر خوبی برایتان دارم — من بهتازگی با API جالبی به نام Visual Viewport API آشنا شدم! 🎉
**Visual Viewport API** ابزاری است که به شما امکان میدهد بفهمید کاربر در حال حاضر سایت شما را *چگونه میبیند* و بتوانید رابط کاربری را متناسب با اقدامات او تنظیم کنید.
این API به شما دسترسی میدهد به ناحیهی دید بصری — یعنی آن بخش از صفحه که در لحظه روی نمایشگر دیده میشود، نه کل محتوای صفحه.
---
### با Visual Viewport API چه اطلاعاتی میتوان بهدست آورد؟
#### 🔍 ردیابی بزرگنمایی (Zoom)
از طریق ویژگی
window.visualViewport.scale
میتوان تغییرات در سطح بزرگنمایی صفحه را شناسایی کرد. هر زمان کاربر صفحه را بزرگتر یا کوچکتر کند، این مقدار بهروز میشود.---
#### 📏 تغییر اندازهی ناحیهی دید
زمانیکه اندازهی بخش قابلمشاهدهی صفحه تغییر میکند (برای مثال، هنگام بزرگنمایی یا چرخش صفحهنمایش)، میتوان از
window.visualViewport.width
و window.visualViewport.height
برای دریافت ابعاد جدید استفاده کرد. این کار به تطبیق بهتر رابط کاربری با اندازههای مختلف کمک میکند.---
#### ➡️ تشخیص جابهجایی ناحیهی دید
با استفاده از
window.visualViewport.offsetLeft
و window.visualViewport.offsetTop
میتوان جابهجایی ناحیهی دید را نسبت به ابتدای صفحه پیگیری کرد. این قابلیت برای جایگذاری دقیق عناصر روی صفحه بسیار کاربردی است.---
### پشتیبانی از رویدادهای
resize
و scroll
این API از رویدادهای
resize
و scroll
نیز پشتیبانی میکند، که هنگام تغییر وضعیت ناحیهی دید فعال میشوند. این موضوع به شما امکان میدهد محتوای رابط کاربری را *بهصورت لحظهای* بهروزرسانی کنید — قابلیتی ایدهآل برای رابطهای پویا و تعاملی.---
### ✅ جمعبندی
با استفاده از Visual Viewport API میتوانید رابطهایی طراحی کنید که نسبت به رفتارهای کاربر مانند بزرگنمایی یا پیمایش (scroll) واکنش نشان دهند. این ویژگی بهویژه برای طراحی رابطهای موبایل بسیار ارزشمند است. 🙂
—
دموی این قابلیت را میتوانید در این لینک مشاهده کنید:
🔗 مشاهده کد در CodePen
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
codepen.io
Untitled
...
آیا راهی برای فشردهسازی کدهای SVG میخواهید؟
معمولاً SVGها کد نسبتاً تمیزی دارند، ولی بعضی فایلها حجم زیادی کد اضافی و غیرضروری تولید میکنند.
ابزار فوقالعادهای به نام SVGO (مخفف SVG Optimizer) وجود دارد که اگر SVGها را به صورت inline در HTML استفاده میکنید، واقعاً به کارتان میآید.
با SVGO میتوانید:
✔️ دقت غیرضروری منحنیها را کاهش دهید
✔️ استایلهای درونخطی را به کلاسها منتقل کنید
✔️ عناصر و ویژگیها را مرتب و گروهبندی کنید
---
🔗https://jakearchibald.github.io/svgomg/
#️⃣ #tool
👥@IR_javascript_group
🆔@IR_javascript
معمولاً SVGها کد نسبتاً تمیزی دارند، ولی بعضی فایلها حجم زیادی کد اضافی و غیرضروری تولید میکنند.
ابزار فوقالعادهای به نام SVGO (مخفف SVG Optimizer) وجود دارد که اگر SVGها را به صورت inline در HTML استفاده میکنید، واقعاً به کارتان میآید.
با SVGO میتوانید:
✔️ دقت غیرضروری منحنیها را کاهش دهید
✔️ استایلهای درونخطی را به کلاسها منتقل کنید
✔️ عناصر و ویژگیها را مرتب و گروهبندی کنید
---
🔗https://jakearchibald.github.io/svgomg/
#️⃣ #tool
👥@IR_javascript_group
🆔@IR_javascript
یکی از ویژگیهای CSS برای جدولها که اغلب نادیده گرفته میشود، اما میتواند بهطور چشمگیری کار شما را سادهتر کند:
##
این ویژگی تعیین میکند مرورگر چگونه ابعاد ستونها و سطرهای یک جدول را محاسبه کند.
###
با استفاده از این ویژگی، میتوان سرعت رندر جدول را افزایش داد و ظاهر آن را تحت کنترل قرار داد.
در حالت پیشفرض، مرورگر اندازهی ستونها را بر اساس محتوای درون آنها محاسبه میکند. این کار ممکن است مخصوصاً در جدولهای بزرگ، فرآیند رندر را کند کند.
اما با کمک
---
### مقادیر قابل استفاده برای
✔️
ابعاد ستونها بهصورت خودکار و بر اساس محتوای آنها تعیین میشود.
مناسب برای جدولهایی با محتوای پویا، اما ممکن است باعث کاهش سرعت رندر شود.
✔️
همهی ستونها دارای عرض ثابت خواهند بود، بدون توجه به محتوای داخلی آنها.
این گزینه رندر جدول را سریعتر کرده و کارایی را بهبود میبخشد، زیرا مرورگر از ابتدا از اندازههای تعیینشده استفاده میکند.
---
اگر جدول شما شامل دادههای زیادی است یا به ستونهایی با عرض یکسان نیاز دارید، استفاده از
🔗 [نمونه در CodePen](https://codepen.io/katrin_profrontend/pen/zxvKRPo)
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
##
table-layout
— کلیدی برای بهینهسازی جدولهااین ویژگی تعیین میکند مرورگر چگونه ابعاد ستونها و سطرهای یک جدول را محاسبه کند.
###
table-layout
دقیقاً چه میکند؟با استفاده از این ویژگی، میتوان سرعت رندر جدول را افزایش داد و ظاهر آن را تحت کنترل قرار داد.
در حالت پیشفرض، مرورگر اندازهی ستونها را بر اساس محتوای درون آنها محاسبه میکند. این کار ممکن است مخصوصاً در جدولهای بزرگ، فرآیند رندر را کند کند.
اما با کمک
table-layout
میتوان ابعاد ستونها را بهصورت ثابت تعیین کرد تا مرورگر دیگر نیازی به محاسبهی آنها نداشته باشد و از همان ابتدا، از اندازههای مشخصشده استفاده کند.---
### مقادیر قابل استفاده برای
table-layout
:✔️
auto
(مقدار پیشفرض):ابعاد ستونها بهصورت خودکار و بر اساس محتوای آنها تعیین میشود.
مناسب برای جدولهایی با محتوای پویا، اما ممکن است باعث کاهش سرعت رندر شود.
✔️
fixed
:همهی ستونها دارای عرض ثابت خواهند بود، بدون توجه به محتوای داخلی آنها.
این گزینه رندر جدول را سریعتر کرده و کارایی را بهبود میبخشد، زیرا مرورگر از ابتدا از اندازههای تعیینشده استفاده میکند.
---
اگر جدول شما شامل دادههای زیادی است یا به ستونهایی با عرض یکسان نیاز دارید، استفاده از
table-layout: fixed
بهترین انتخاب خواهد بود. 👍🔗 [نمونه در CodePen](https://codepen.io/katrin_profrontend/pen/zxvKRPo)
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
codepen.io
table-layout
...
❤3
### بهبود عملکرد رویدادهای پیمایش (Scroll) 👨🏫
بهتازگی با این هشدار مواجه شدم:
> "\[Violation] Added non-passive event listener to a scroll-blocking 'wheel' event. Consider marking event handler as 'passive' to make the page more responsive."
این پیام باعث شد رویکردم به مدیریت رویدادهای پیمایش را بازبینی کنم.
زمانی که با رویدادهایی مانند پیمایش با ماوس (
بهطور پیشفرض، مرورگرها میتوانند رفتار استاندارد (مانند پیمایش) را مسدود کنند، بهویژه اگر در تابع پردازشگر از
این مسأله ممکن است باعث تأخیر در واکنش رابط کاربری**، خصوصاً در دستگاههای همراه شود. 😔
---
### راهحل: استفاده از گزینهی `{ passive: true }` 🤨
با افزودن گزینهی `{ passive: true }` هنگام افزودن شنوندهی رویداد (Event Listener)، به مرورگر اطلاع میدهیم که قرار نیست رفتار پیشفرض را لغو کنیم.
در نتیجه، مرورگر میتواند بلافاصله اقدام به انجام رفتار استاندارد (مثل پیمایش) کند و منتظر اجرای کامل کد شما نماند.
```javascript
element.addEventListener('wheel', (event) => {
// کد مربوطه
}, { passive: true });
```
---
### چرا این موضوع اهمیت دارد؟
✔️ **افزایش سرعت واکنش رویدادها
مرورگر بلافاصله پیمایش را آغاز میکند و این باعث بهبود پاسخگویی رابط کاربری میشود — خصوصاً در تلفنهای هوشمند و تبلتها.
✔️ عدم انسداد رندر شدن صفحه
با استفاده از
---
### چند نکتهی مهم:
۱️⃣ مقدار پیشفرض `passive` برابر با false است
یعنی در حالت عادی میتوان از
اما مرورگرها در مورد برخی رویدادها مانند
۲️⃣ اگر شما `passive: true` را صراحتاً تعیین کنید و در تابع مربوطه از
---
### جمعبندی:
استفاده از گزینهی
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
بهتازگی با این هشدار مواجه شدم:
> "\[Violation] Added non-passive event listener to a scroll-blocking 'wheel' event. Consider marking event handler as 'passive' to make the page more responsive."
این پیام باعث شد رویکردم به مدیریت رویدادهای پیمایش را بازبینی کنم.
زمانی که با رویدادهایی مانند پیمایش با ماوس (
wheel
) یا حرکت لمسی (touchmove
) سروکار داریم، معمولاً چالشهایی در زمینهی عملکرد (Performance) به وجود میآید.بهطور پیشفرض، مرورگرها میتوانند رفتار استاندارد (مانند پیمایش) را مسدود کنند، بهویژه اگر در تابع پردازشگر از
event.preventDefault()
استفاده شود.این مسأله ممکن است باعث تأخیر در واکنش رابط کاربری**، خصوصاً در دستگاههای همراه شود. 😔
---
### راهحل: استفاده از گزینهی `{ passive: true }` 🤨
با افزودن گزینهی `{ passive: true }` هنگام افزودن شنوندهی رویداد (Event Listener)، به مرورگر اطلاع میدهیم که قرار نیست رفتار پیشفرض را لغو کنیم.
در نتیجه، مرورگر میتواند بلافاصله اقدام به انجام رفتار استاندارد (مثل پیمایش) کند و منتظر اجرای کامل کد شما نماند.
```javascript
element.addEventListener('wheel', (event) => {
// کد مربوطه
}, { passive: true });
```
---
### چرا این موضوع اهمیت دارد؟
✔️ **افزایش سرعت واکنش رویدادها
مرورگر بلافاصله پیمایش را آغاز میکند و این باعث بهبود پاسخگویی رابط کاربری میشود — خصوصاً در تلفنهای هوشمند و تبلتها.
✔️ عدم انسداد رندر شدن صفحه
با استفاده از
{ passive: true }
مرورگر دیگر منتظر اجرای کامل تابع پردازشگر نمیماند، که این موضوع باعث کاهش تأخیر و افزایش روانی حرکت صفحه میشود.---
### چند نکتهی مهم:
۱️⃣ مقدار پیشفرض `passive` برابر با false است
یعنی در حالت عادی میتوان از
event.preventDefault()
برای لغو رفتار پیشفرض استفاده کرد.اما مرورگرها در مورد برخی رویدادها مانند
wheel`، `touchmove
و touchstart
در سطوحی مثل window`، `document
و `document.body`، بهصورت خودکار passive را برابر با true قرار میدهند تا از ایجاد تاخیر جلوگیری شود.۲️⃣ اگر شما `passive: true` را صراحتاً تعیین کنید و در تابع مربوطه از
event.preventDefault()
استفاده نمایید، مرورگر این دستور را نادیده خواهد گرفت.---
### جمعبندی:
استفاده از گزینهی
{ passive: true }
یک تغییر ساده اما مؤثر برای بهبود روانی و واکنشپذیری اپلیکیشن است — بهویژه در سناریوهایی که با پیمایش و تعامل لمسی سروکار داریم. ✅#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
🔥1
Moveable
دادن قابلیت جابجایی و تغییر اندازهی دستی به عناصر کار سادهای نیست. کتابخانه منطق پیچیده را در قالبی قابل استفاده بستهبندی کرده و ابزارهای آمادهای برای دستکاری اشیاء در زمان واقعی ارائه میدهد. این ابزار برای ساخت ویرایشگرهای تعاملی، داشبوردهای قابل سفارشیسازی یا هر برنامهای با رابط کاربری کشیدن و رها کردن بسیار مناسب است.
🔗https://github.com/daybrush/moveable?tab=readme-ov-file
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
دادن قابلیت جابجایی و تغییر اندازهی دستی به عناصر کار سادهای نیست. کتابخانه منطق پیچیده را در قالبی قابل استفاده بستهبندی کرده و ابزارهای آمادهای برای دستکاری اشیاء در زمان واقعی ارائه میدهد. این ابزار برای ساخت ویرایشگرهای تعاملی، داشبوردهای قابل سفارشیسازی یا هر برنامهای با رابط کاربری کشیدن و رها کردن بسیار مناسب است.
🔗https://github.com/daybrush/moveable?tab=readme-ov-file
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
👍1🔥1
اگر از معنای یک خطا مطمئن نیستید، گوگل اخیراً قابلیتی به نام AI Console Insights در کنسول به مرورگر کروم افزوده است.
برای استفاده از این قابلیت، ابتدا باید آن را از طریق تنظیمات فعال کنید.
هنگامی که برای توضیح یک پیام درخواست میدهید، کروم متن پیام، پشتهی خطا (stack trace) و کد مرتبط را به سرورهای گوگل ارسال میکند تا تحلیل آن از طریق هوش مصنوعی انجام شود.
فعالسازی بینشهای هوش مصنوعی در کروم
پس از فعالسازی این قابلیت، میتوانید نشانگر ماوس را روی هر خطا یا هشدار نگه دارید تا پیامی با عنوان
«درک این خطا» یا «درک این هشدار» مشاهده کنید
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
برای استفاده از این قابلیت، ابتدا باید آن را از طریق تنظیمات فعال کنید.
هنگامی که برای توضیح یک پیام درخواست میدهید، کروم متن پیام، پشتهی خطا (stack trace) و کد مرتبط را به سرورهای گوگل ارسال میکند تا تحلیل آن از طریق هوش مصنوعی انجام شود.
فعالسازی بینشهای هوش مصنوعی در کروم
پس از فعالسازی این قابلیت، میتوانید نشانگر ماوس را روی هر خطا یا هشدار نگه دارید تا پیامی با عنوان
«درک این خطا» یا «درک این هشدار» مشاهده کنید
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
❤2👍1👎1🤯1
اگر وبسایت شما از iframe یا Service Worker استفاده میکند، لازم است بررسی کنید که کدی که در کنسول اجرا میکنید، در زمینهٔ (Context) درست اجرا میشود.
مرورگر کروم یک گزینشگر زمینهٔ جاوااسکریپت در بالای سمت چپ زبانهٔ کنسول (Console Tab) فراهم کرده است. بهصورت پیشفرض، این زمینه روی «فریم اصلی» صفحه قرار دارد.
💡 نکته:
افزونههای کروم (Chrome Extensions) نیز دارای زمینهٔ جاوااسکریپت مستقل خود هستند.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
مرورگر کروم یک گزینشگر زمینهٔ جاوااسکریپت در بالای سمت چپ زبانهٔ کنسول (Console Tab) فراهم کرده است. بهصورت پیشفرض، این زمینه روی «فریم اصلی» صفحه قرار دارد.
💡 نکته:
افزونههای کروم (Chrome Extensions) نیز دارای زمینهٔ جاوااسکریپت مستقل خود هستند.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
This media is not supported in your browser
VIEW IN TELEGRAM
سلام بر رقیه عزیز حسین (ع) ... .
🖤اربعین حسینی تسلیت باد
#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
🖤اربعین حسینی تسلیت باد
#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
❤8👎5😁1🎉1
اگر کدی را در کنسول اجرا کردهاید و حالا میخواهید نتیجهٔ آن را در جایی دیگر جایگذاری (Paste) کنید، بسیار ساده است:
کافیست دستور زیر را اجرا کنید:
در اینجا، $_ به مقدار آخرین عبارت جاوااسکریپتی که در کنسول اجرا کردهاید اشاره دارد.
اگر نیاز دارید چند مرحله مختلف را روی یک شیء انجام دهید، استفاده از $_ باعث میشود بتوانید به نتیجهٔ آخرین عملیات بهسادگی دسترسی پیدا کنید، بدون نیاز به اجرای مجدد کل عبارت.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
کافیست دستور زیر را اجرا کنید:
در اینجا، $_ به مقدار آخرین عبارت جاوااسکریپتی که در کنسول اجرا کردهاید اشاره دارد.
اگر نیاز دارید چند مرحله مختلف را روی یک شیء انجام دهید، استفاده از $_ باعث میشود بتوانید به نتیجهٔ آخرین عملیات بهسادگی دسترسی پیدا کنید، بدون نیاز به اجرای مجدد کل عبارت.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍1
### میخواهید بدانید یک تابع چند بار و با چه آرگومانهایی فراخوانی میشود؟
تابع
میتوانید از
برای متوقف کردن ثبت گزارشها، کافیست از تابع
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
تابع
monitor
این امکان را فراهم میکند تا با هر بار اجرای تابع، گزارشی حاوی جزئیات آن در کنسول نمایش داده شود.monitor(window.scrollTo);
window.scrollTo(۰, ۲۰۰۰);
میتوانید از
monitor
برای توابع داخلی مانند scrollTo
(در مثال بالا) یا برای کدهای سفارشی خود استفاده کنید.برای متوقف کردن ثبت گزارشها، کافیست از تابع
unmonitor
استفاده کنید:unmonitor(window.scrollTo);
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍2❤1
ثبت رویدادهای عناصر DOM در کنسول
تابع
📋 رویدادهای گزارششده روی `document.body`
همانطور که مشاهده میکنید، گزارشگیری از تمام رویدادها میتواند بسیار شلوغ و پرحجم باشد.
برای جلوگیری از این مسئله، میتوانید فقط نوع رویدادهایی که برایتان اهمیت دارند را بهصورت آرایهای مشخص کنید:
برای غیرفعال کردن این گزارشها، از تابع
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
تابع
monitorEvents
برای هر رویدادی که روی یک گره DOM (مانند یک عنصر HTML) رخ میدهد، پیامی در کنسول ثبت میکند.monitorEvents(document.body);
📋 رویدادهای گزارششده روی `document.body`
همانطور که مشاهده میکنید، گزارشگیری از تمام رویدادها میتواند بسیار شلوغ و پرحجم باشد.
برای جلوگیری از این مسئله، میتوانید فقط نوع رویدادهایی که برایتان اهمیت دارند را بهصورت آرایهای مشخص کنید:
monitorEvents(document.body, ["pointerenter", "click"]);
برای غیرفعال کردن این گزارشها، از تابع
unmonitorEvents
استفاده کنید:unmonitorEvents(document.body);
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
شناسایی شنوندههای رویداد (Event Listeners) متصلشده
برای مشاهدهی تمامی شنوندههای رویداد (Event Handlers) که به یک عنصر متصل شدهاند، میتوانید از تابع
با اجرای این دستور، میتوانید موارد زیر را مشاهده کنید:
* نوع رویداد (مانند
* ویژگیهایی مانند اینکه آیا شنونده فقط یکبار اجرا میشود (
* و همچنین ارجاع مستقیم به تابعی که بهعنوان handler تعریف شده است
برای مشاهدهی کد منبع تابع، کافیست روی آن راستکلیک کرده و گزینهی Show function definition را انتخاب کنید تا مستقیماً به محل تعریف تابع هدایت شوید.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
برای مشاهدهی تمامی شنوندههای رویداد (Event Handlers) که به یک عنصر متصل شدهاند، میتوانید از تابع
getEventListeners
استفاده کنید:getEventListeners(document.body);
با اجرای این دستور، میتوانید موارد زیر را مشاهده کنید:
* نوع رویداد (مانند
click`، `scroll
و...)* ویژگیهایی مانند اینکه آیا شنونده فقط یکبار اجرا میشود (
once
) یا خیر* و همچنین ارجاع مستقیم به تابعی که بهعنوان handler تعریف شده است
برای مشاهدهی کد منبع تابع، کافیست روی آن راستکلیک کرده و گزینهی Show function definition را انتخاب کنید تا مستقیماً به محل تعریف تابع هدایت شوید.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍1
یافتن اشیاء براساس سازنده (Constructor)
تابع queryObjects فهرستی از اشیایی را بازمیگرداند که با استفاده از سازندهای که به آن پاس دادهاید، ایجاد شدهاند.
این سازنده میتواند یک نوع داخلی مانند Function یا Promise باشد، یا یک کلاسی که خودتان در کد تعریف کردهاید.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
تابع queryObjects فهرستی از اشیایی را بازمیگرداند که با استفاده از سازندهای که به آن پاس دادهاید، ایجاد شدهاند.
این سازنده میتواند یک نوع داخلی مانند Function یا Promise باشد، یا یک کلاسی که خودتان در کد تعریف کردهاید.
queryObjects(Function);
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
جمعآوری ضبط عملکرد
ابزار Performance Profiler در Chrome DevTools ابزاری قدرتمند برای ثبت دقیق جزئیات عواملی است که بر سرعت بارگذاری صفحه شما تأثیر میگذارند.
شما میتوانید در بخش Performance پنل DevTools یک پروفایل را آغاز کرده و پس از اتمام، ضبط را متوقف کنید. با این حال، این روش میتواند با چند مشکل همراه باشد:
کنترل دقیقی بر زمان جمعآوری دادهها ندارید و ناچارید بعداً روی بخش مورد نظر بزرگنمایی کنید.
ضبط چندین پروفایل تکراری فرآیندی کند و دستی است.
بارگذاری ردگیریهای بزرگ (Large traces) در ابزار توسعهدهنده زمانبر است.
توابع profile و profileEnd تمام این مشکلات را برطرف میکنند. با استفاده از این توابع، میتوانید بهصورت برنامهریزیشده و دقیقاً در زمان مناسب، ضبط عملکرد را آغاز و پایان دهید:
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
ابزار Performance Profiler در Chrome DevTools ابزاری قدرتمند برای ثبت دقیق جزئیات عواملی است که بر سرعت بارگذاری صفحه شما تأثیر میگذارند.
شما میتوانید در بخش Performance پنل DevTools یک پروفایل را آغاز کرده و پس از اتمام، ضبط را متوقف کنید. با این حال، این روش میتواند با چند مشکل همراه باشد:
کنترل دقیقی بر زمان جمعآوری دادهها ندارید و ناچارید بعداً روی بخش مورد نظر بزرگنمایی کنید.
ضبط چندین پروفایل تکراری فرآیندی کند و دستی است.
بارگذاری ردگیریهای بزرگ (Large traces) در ابزار توسعهدهنده زمانبر است.
توابع profile و profileEnd تمام این مشکلات را برطرف میکنند. با استفاده از این توابع، میتوانید بهصورت برنامهریزیشده و دقیقاً در زمان مناسب، ضبط عملکرد را آغاز و پایان دهید:
console.profile();
// اجرای مجموعهای از عملیات کند
console.profileEnd();
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍1
عبارات زنده (Live Expressions)
اگر مرتباً یک عبارت جاوااسکریپت خاص را برای بررسی وضعیت صفحه اجرا میکنید، «عبارات زنده» گزینهای ایدهآل هستند. به جای اجرای دستی کد، با استفاده از این قابلیت میتوانید Chrome را طوری پیکربندی کنید که بهطور خودکار و پیوسته همان عبارت را اجرا کند.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
اگر مرتباً یک عبارت جاوااسکریپت خاص را برای بررسی وضعیت صفحه اجرا میکنید، «عبارات زنده» گزینهای ایدهآل هستند. به جای اجرای دستی کد، با استفاده از این قابلیت میتوانید Chrome را طوری پیکربندی کنید که بهطور خودکار و پیوسته همان عبارت را اجرا کند.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍2
تنظیمات کنسول
برای پیکربندی تنظیمات کنسول، روی آیکون چرخدنده در گوشه بالای سمت راست زبانه Console کلیک کنید.
به عنوان نمونه، میتوانید گزینه Preserve log را فعال کنید تا خروجیهای ثبتشده هنگام جابهجایی بین وبسایتها و صفحات مختلف حذف نشوند. به طور پیشفرض، کنسول با هر بار پیمایش به صفحه جدید پاک میشود.
علاوه بر این، میتوانید نوع پیامهای تولیدشده توسط Chrome را فعال یا غیرفعال کنید:
Hide network: پنهانکردن درخواستهای ناموفق
Log XMLHttpRequests: ثبت همه درخواستهای Ajax یا Fetch در صفحه
Show CORS errors in console: نمایش علت شکست درخواستهای بینمبدأ (Cross-Origin)
با این تنظیمات، خروجی کنسول میتواند شامل گزارش درخواستها و همچنین خطاهای CORS باشد.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
برای پیکربندی تنظیمات کنسول، روی آیکون چرخدنده در گوشه بالای سمت راست زبانه Console کلیک کنید.
به عنوان نمونه، میتوانید گزینه Preserve log را فعال کنید تا خروجیهای ثبتشده هنگام جابهجایی بین وبسایتها و صفحات مختلف حذف نشوند. به طور پیشفرض، کنسول با هر بار پیمایش به صفحه جدید پاک میشود.
علاوه بر این، میتوانید نوع پیامهای تولیدشده توسط Chrome را فعال یا غیرفعال کنید:
Hide network: پنهانکردن درخواستهای ناموفق
Log XMLHttpRequests: ثبت همه درخواستهای Ajax یا Fetch در صفحه
Show CORS errors in console: نمایش علت شکست درخواستهای بینمبدأ (Cross-Origin)
با این تنظیمات، خروجی کنسول میتواند شامل گزارش درخواستها و همچنین خطاهای CORS باشد.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
🖤شهادت رسول اکرم صلی الله علیه و آله و امام مجتبی علیه السلام.
🔗https://www.aparat.com/v/c50akua
#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
🔗https://www.aparat.com/v/c50akua
#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
❤10👎7
استفاده از await در سطح بالای ماژولهای ES
نوشتن کدهای ناهمگام (asynchronous) در جاوااسکریپت تا چندی پیش یک محدودیت مهم داشت: کلیدواژهی await تنها درون یک تابع async قابل استفاده بود. این موضوع با معرفی ویژگی Top-Level Await در استاندارد ES2022 تغییر کرد؛ قابلیتی مدرن در ماژولهای ES که امکان اجرای الگوهای جدیدی از کد ناهمگام را در سطح ماژول فراهم میکند.
Top-Level Await چیست؟
بهطور سنتی، دستور await تنها درون توابع async معتبر بود:
اکنون با استفاده از Top-Level Await، میتوانید آن را در سطح بالای ماژول ES اجرا کنید:
در گذشته برای استفاده از await در سطح بالا، ناچار بودید آن را درون یک تابع ناهمگام خوداجرا (IIFE) بپیچید:
با Top-Level Await میتوانید با چنین کدهای زائد خداحافظی کنید و منطق ناهمگام خود را بهصورت مستقیم در بالاترین سطح ماژول بنویسید؛ کدی سادهتر، خواناتر و تمیزتر.
⚠️ نکته مهم
Top-Level Await فقط در ماژولهای جاوااسکریپت پشتیبانی میشود، نه در CommonJS (یعنی require) و نه در تگهای <script> سنتی که فاقد ویژگی type="module" هستند (زیرا این حالت در «مد کلاسیک» اجرا میشود). همچنین، فایلهای با پسوند .cjs در Node.js از آن پشتیبانی نمیکنند.
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
نوشتن کدهای ناهمگام (asynchronous) در جاوااسکریپت تا چندی پیش یک محدودیت مهم داشت: کلیدواژهی await تنها درون یک تابع async قابل استفاده بود. این موضوع با معرفی ویژگی Top-Level Await در استاندارد ES2022 تغییر کرد؛ قابلیتی مدرن در ماژولهای ES که امکان اجرای الگوهای جدیدی از کد ناهمگام را در سطح ماژول فراهم میکند.
Top-Level Await چیست؟
بهطور سنتی، دستور await تنها درون توابع async معتبر بود:
// ❌ خطای نحوی (SyntaxError) در خارج از تابع async
const result = await fetchData();
اکنون با استفاده از Top-Level Await، میتوانید آن را در سطح بالای ماژول ES اجرا کنید:
// ✅ این کد در یک ماژول ES قابل اجرا است
const result = await fetchData();
در گذشته برای استفاده از await در سطح بالا، ناچار بودید آن را درون یک تابع ناهمگام خوداجرا (IIFE) بپیچید:
(async () => {
const result = await fetchData();
})();
با Top-Level Await میتوانید با چنین کدهای زائد خداحافظی کنید و منطق ناهمگام خود را بهصورت مستقیم در بالاترین سطح ماژول بنویسید؛ کدی سادهتر، خواناتر و تمیزتر.
⚠️ نکته مهم
Top-Level Await فقط در ماژولهای جاوااسکریپت پشتیبانی میشود، نه در CommonJS (یعنی require) و نه در تگهای <script> سنتی که فاقد ویژگی type="module" هستند (زیرا این حالت در «مد کلاسیک» اجرا میشود). همچنین، فایلهای با پسوند .cjs در Node.js از آن پشتیبانی نمیکنند.
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript