جاوااسکریپت | JavaScript
507 subscribers
654 photos
139 videos
3 files
512 links
کانال @IR_javascript حاوی اطلاعات مفید در حوزه برنامه نویس فرانت که بصورت روزانه بروز می‌شود.
در این کانال شما به:
[1] مطالب تازه
[2] تحلیل‌های عمیق
[3] نکات آموزشی
[4] چالش
[5] ابزار و راهنمایی‌های کاربردی
دسترسی خواهید داشت.

🆔@IR_javascript
Download Telegram
آیا راهی برای فشرده‌سازی کدهای SVG می‌خواهید؟
معمولاً SVGها کد نسبتاً تمیزی دارند، ولی بعضی فایل‌ها حجم زیادی کد اضافی و غیرضروری تولید می‌کنند.

ابزار فوق‌العاده‌ای به نام SVGO (مخفف SVG Optimizer) وجود دارد که اگر SVGها را به صورت inline در HTML استفاده می‌کنید، واقعاً به کارتان می‌آید.

با SVGO می‌توانید:
✔️ دقت غیرضروری منحنی‌ها را کاهش دهید
✔️ استایل‌های درون‌خطی را به کلاس‌ها منتقل کنید
✔️ عناصر و ویژگی‌ها را مرتب و گروه‌بندی کنید

---
🔗https://jakearchibald.github.io/svgomg/
#️⃣ #tool
👥@IR_javascript_group
🆔@IR_javascript
یکی از ویژگی‌های CSS برای جدول‌ها که اغلب نادیده گرفته می‌شود، اما می‌تواند به‌طور چشمگیری کار شما را ساده‌تر کند:

## 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
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."

این پیام باعث شد رویکردم به مدیریت رویدادهای پیمایش را بازبینی کنم.

زمانی که با رویدادهایی مانند پیمایش با ماوس (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
👍1🔥1
اگر از معنای یک خطا مطمئن نیستید، گوگل اخیراً قابلیتی به نام AI Console Insights در کنسول به مرورگر کروم افزوده است.
برای استفاده از این قابلیت، ابتدا باید آن را از طریق تنظیمات فعال کنید.

هنگامی که برای توضیح یک پیام درخواست می‌دهید، کروم متن پیام، پشته‌ی خطا (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
This media is not supported in your browser
VIEW IN TELEGRAM
سلام بر رقیه عزیز حسین (ع) ... .
🖤اربعین حسینی تسلیت باد

#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
8👎5😁1🎉1
اگر کدی را در کنسول اجرا کرده‌اید و حالا می‌خواهید نتیجهٔ آن را در جایی دیگر جای‌گذاری (Paste) کنید، بسیار ساده است:
کافی‌ست دستور زیر را اجرا کنید:

در اینجا، $_ به مقدار آخرین عبارت جاوااسکریپتی که در کنسول اجرا کرده‌اید اشاره دارد.

اگر نیاز دارید چند مرحله مختلف را روی یک شیء انجام دهید، استفاده از $_ باعث می‌شود بتوانید به نتیجهٔ آخرین عملیات به‌سادگی دسترسی پیدا کنید، بدون نیاز به اجرای مجدد کل عبارت.


#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍1
### می‌خواهید بدانید یک تابع چند بار و با چه آرگومان‌هایی فراخوانی می‌شود؟

تابع monitor این امکان را فراهم می‌کند تا با هر بار اجرای تابع، گزارشی حاوی جزئیات آن در کنسول نمایش داده شود.

monitor(window.scrollTo);
window.scrollTo(۰, ۲۰۰۰);


می‌توانید از monitor برای توابع داخلی مانند scrollTo (در مثال بالا) یا برای کدهای سفارشی خود استفاده کنید.

برای متوقف کردن ثبت گزارش‌ها، کافی‌ست از تابع unmonitor استفاده کنید:

unmonitor(window.scrollTo);






#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍21
ثبت رویدادهای عناصر DOM در کنسول

تابع 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) که به یک عنصر متصل شده‌اند، می‌توانید از تابع getEventListeners استفاده کنید:

getEventListeners(document.body);


با اجرای این دستور، می‌توانید موارد زیر را مشاهده کنید:

* نوع رویداد (مانند click`، `scroll و...)
* ویژگی‌هایی مانند اینکه آیا شنونده فقط یک‌بار اجرا می‌شود (once) یا خیر
* و همچنین ارجاع مستقیم به تابعی که به‌عنوان handler تعریف شده است

برای مشاهده‌ی کد منبع تابع، کافی‌ست روی آن راست‌کلیک کرده و گزینه‌ی Show function definition را انتخاب کنید تا مستقیماً به محل تعریف تابع هدایت شوید.


#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍1
یافتن اشیاء براساس سازنده (Constructor)
تابع queryObjects فهرستی از اشیایی را بازمی‌گرداند که با استفاده از سازنده‌ای که به آن پاس داده‌اید، ایجاد شده‌اند.

این سازنده می‌تواند یک نوع داخلی مانند Function یا Promise باشد، یا یک کلاسی که خودتان در کد تعریف کرده‌اید.


queryObjects(Function);



#️⃣#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
👍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
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
🖤شهادت رسول اکرم صلی الله علیه و آله و امام مجتبی علیه السلام.

🔗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 معتبر بود:


//  خطای نحوی (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
شکستن کلمات همراه با خط تیره 😉

موضوع ساده به نظر می‌رسد — وقتی یک کلمه طولانی در یک خط جا نمی‌شود، باید آن را با خط تیره به خط بعد منتقل کرد. اما چطور این کار را به‌درستی انجام دهیم تا هم ظاهر متن زیبا باشد و هم ساختار آن به‌هم نریزد؟

بیایید بررسی کنیم برای این کار در CSS چه نیاز داریم. ☺️

برای شکستن صحیح کلمات همراه با خط تیره، سه ویژگی اصلی مورد نیاز است:

✔️ overflow-wrap: break-word; — این ویژگی باعث می‌شود کلمات طولانی (مثل نشانی‌های اینترنتی یا اصطلاحات پیچیده) در صورت کمبود فضا به خط بعد منتقل شوند.

✔️ word-break: break-word; — این ویژگی اجازه می‌دهد کلمات در نقاط مناسب نیز شکسته شوند، اگر در یک خط جا نشوند.

✔️ hyphens: auto; — مسئول اضافه کردن خودکار خط تیره هنگام شکستن کلمات است، بر اساس قواعد زبان مورد استفاده.

نمونه کد:

.text {
overflow-wrap: break-word; /* اجازه شکستن کلمات طولانی */
word-break: break-word; /* شکستن کلمات در نقاط مناسب */
hyphens: auto; /* افزودن خودکار خط تیره هنگام شکستن */
}


حالا همه‌چیز طبق قواعد زبان کار خواهد کرد: کلمات همراه با خط تیره شکسته می‌شوند و در عین حال متن، منظم و زیبا باقی می‌ماند. 👍


#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
Atropos.js

‏عناصر تعاملی اغلب ظاهری تخت دارند و توجه کاربر را جلب نمی‌کنند. این کتابخونه مشکل را با ایجاد یک افکت پارالاکس سه‌بعدی هنگام قرار گرفتن نشانگر ماوس بر روی عنصر، برطرف می‌کند. این کتابخانه به شما کمک می‌کند تا به کارت‌ها، بنرها و سایر بلوک‌ها عمق ببخشید و رابط کاربری را زنده‌تر و ماندگارتر در ذهن کاربر جلوه دهید.

🔗https://atroposjs.com/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
👍1
خب، نتایج بنچمارک عملکرد منتشر شد ( [لینک](https://krausest.github.io/js-framework-benchmark/2025/table_chrome_139.0.7258.67.html) )؛ این بار روی آخرین نسخه کروم و همراه با پچ‌های جدیدی که در نسخه آلفای Vue 3.6 ارائه شده‌اند.

به‌دلیل حجم بالاتر باندل و لزوم پشتیبانی از APIهای قدیمی، اندازه‌ی فریم هنوز کمی بزرگ‌تر از Svelte و Solid است، اما در سایر شاخص‌ها کاملاً در سطح رقبا و حتی در برخی موارد بهتر عمل می‌کند.


#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript