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

🆔@IR_javascript
Download Telegram
گاهی به‌نظر می‌رسد که فهمیدن وضعیت کلیدهای ترکیبی مانند Shift**، **Control**، **Alt یا Meta کار پیچیده‌ای است. 🙈

«اصلاً چطور باید این کار را انجام داد؟ آیا باید هر کلید را جداگانه بررسی کنیم؟» 🤔

نگران نباشید — راه‌حل وجود دارد و بسیار ساده‌تر از چیزی است که تصور می‌کنید! تنها چیزی که نیاز دارید، متد `getModifierState()` در جاوااسکریپت است که در رویدادهای صفحه‌کلید در دسترس می‌باشد.

این متد به شما اجازه می‌دهد به‌راحتی بفهمید آیا یک کلید ترکیبی (مثلاً Shift یا Ctrl یا Alt) در لحظهٔ وقوع رویداد فشرده شده است یا نه.

---

### 💡 نمونهٔ استفاده:

document.addEventListener('keydown', function(event) {
if (event.getModifierState('Shift')) {
console.log('کلید Shift فشرده شده است!');
}
if (event.getModifierState('Control')) {
console.log('کلید Control فشرده شده است!');
}
});


متد getModifierState() مقدار true برمی‌گرداند اگر کلید ترکیبی در آن لحظه فشرده شده باشد، و در غیر این صورت false. به همین سادگی! 😁

---

### 🎯 مثال کاربردی

فرض کنید می‌خواهیم از رفتار پیش‌فرض مرورگر هنگام فشردن ترکیب Ctrl + S (ذخیرهٔ صفحه) جلوگیری کنیم:

document.addEventListener('keydown', function(event) {
if (event.getModifierState('Control') && event.key === 's') {
event.preventDefault(); // جلوگیری از عملکرد پیش‌فرض
console.log('عملیات ذخیره‌سازی لغو شد!');
}
});


---

### نتیجه

با استفاده از تنها چند خط کد و متد **getModifierState()**، می‌توانیم به‌سادگی وضعیت کلیدهای ترکیبی موردنیاز را بررسی و کنترل کنیم. 👍


#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
نوآوری‌های CSS — کنترل حداکثری با انتخابگر :nth-child() و دستور جدید OF S

با استفاده از شبه‌کلاس `:nth-child()` می‌توان عناصر موجود در DOM را بر اساس ترتیبشان انتخاب کرد. نحوۀ کلاسیک An+B به شما امکان می‌دهد انتخاب عناصر را با دقت بالا کنترل کنید.

برای نمونه:

* :nth-child(2) — انتخاب دومین فرزند.
* :nth-child(2n) — انتخاب تمام فرزندان زوج.
* :nth-child(2n+1) — انتخاب تمام فرزندان فرد.
و غیره...

اما حالا ویژگی جدیدی در سطح چهارم انتخابگرهای CSS معرفی شده است — یعنی سینتکس OF S. این قابلیت به شما اجازه می‌دهد ابتدا عناصر را بر اساس یک فیلتر مشخص (مثلاً کلاس یا نوع خاصی از عناصر) محدود کنید، و سپس از میان همان گروه، عناصر مورد نظر را بر اساس ترتیبشان انتخاب نمایید.

ساختار کلی:

:nth-child(An+B [of S])
:nth-last-child(An+B [of S])


در سطح چهارم انتخابگرهای CSS (Selectors Level 4) که در [W3C](https://www.w3.org/TR/selectors-4/) تعریف شده است، می‌توان به‌صورت اختیاری یک فهرست از انتخابگرها را در :nth-child() یا :nth-last-child() ارسال کرد.

---

### 📘 مثال

<div class="test-1">one</div>
<div class="test-2">two</div>
<div class="test-1">three</div>
<div class="test-2">four</div>


:nth-child(2 of .test-1, .test-2) {
outline: 0.3rem dashed lightblue;
}


---

### 🔍 چگونه کار می‌کند؟

تصور کنید شبه‌کلاس :nth-child با دستور of S مانند یک فیلتر هوشمند عمل می‌کند.
ابتدا مرورگر همهٔ عناصری را که با انتخابگرهای .test-1 و .test-2 مطابقت دارند پیدا می‌کند. سپس از میان آن فهرست فیلترشده، دومین عنصر را انتخاب می‌کند و سبک (style) مورد نظر را به آن اعمال می‌کند.

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

---

با این قابلیت، دامنۀ کارهایی که می‌توان تنها با CSS انجام داد روزبه‌روز گسترده‌تر می‌شود — بدون نیاز به جاوااسکریپت! 🎨


#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
چگونه بدون استفاده از <br> در CSS شکست خط ایجاد کنیم 🧐

یک ترفند جالب وجود دارد که با استفاده از نماد \A و سبک‌هایی مثل white-space: pre-wrap می‌توان شکست خط را در CSS ایجاد کرد. بیایید بررسی کنیم چگونه این کار انجام می‌شود!

📕 نماد `\A` چیست؟

در CSS، \A راهی برای وارد کردن شکست خط در ویژگی content است که معمولاً در پیش‌عنصرها (::before و ::after) استفاده می‌شود. به جای قرار دادن دستی <br>`، کافی است `\A را بنویسیم تا مرورگر بداند در این نقطه باید خط جدید شروع شود.

با این حال، برای کارکرد صحیح این روش، لازم است ویژگی white-space را اضافه کنیم، مثلاً با مقدار pre-wrap. این ویژگی به مرورگر می‌گوید: «شکست‌های خط را مانند تگ <pre> پردازش کن، ولی همچنین اجازه بده متن در صورت نیاز به خط بعد منتقل شود.»

مثال:

.text::before {
content: "خط اول\Aخط دوم"; /* \A شکست خط ایجاد می‌کند */
white-space: pre-wrap; /* \A را به عنوان شکست خط پردازش می‌کند */
}


اینجا \A در ویژگی content شکست خط ایجاد می‌کند و white-space: pre-wrap به مرورگر کمک می‌کند این شکست را به درستی نمایش دهد.

نتیجه: این روش یک راه عالی برای تمیز نگه داشتن کد و راحت‌تر کردن مدیریت متن است.


#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
👍1
مسدود کردن dev-tool
اگر امکانش رو دارید به این سایت [+لینک] بروید و با هر روشی dev-tools رو باز کنید

پکیجی برای غیرفعال‌سازی ابزارهای توسعه‌دهنده‌ی وب از طریق دکمه‌ی F12، کلیک راست و منوی مرورگر



🔗https://theajack.github.io/disable-devtool/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
🥰1😁1
EyeDropper API: انتخاب رنگ‌ها مستقیم از روی صفحه 🤩

هر ساله APIهای بومی جدیدی برای مرورگرها معرفی می‌شوند و یکی از این ابزارهای جالب، EyeDropper API است.

EyeDropper API به توسعه‌دهندگان وب این امکان را می‌دهد که کاربران بتوانند با استفاده از ابزار قطره‌چکان (pipette) رنگ‌ها را مستقیماً از صفحه انتخاب کنند. پس از انتخاب، مقدار رنگ به صورت sRGBHex (مثل #ff5733) بازگردانده می‌شود.

---

### نمونه ساده استفاده:

if ("EyeDropper" in window) {
const eyeDropper = new EyeDropper();
eyeDropper.open()
.then(result => {
console.log("رنگ انتخاب‌شده:", result.sRGBHex);
document.body.style.backgroundColor = result.sRGBHex;
})
.catch(err => {
console.error("خطا:", err);
});
}


---

### نحوه عملکرد 🧐

1. فراخوانی متد open() روی شیء `EyeDropper`؛
2. باز شدن ابزار قطره‌چکان در مرورگر؛
3. انتخاب رنگ توسط کاربر؛
4. بازگرداندن رنگ انتخاب‌شده در فرمت `#RRGGBB`.

---

### مزایای API

* سادگی: تنها با چند خط کد می‌توان انتخاب رنگ را در وب‌سایت ادغام کرد.
* تعامل‌پذیری: امکان تنظیم رابط کاربری و اجازه دادن به کاربران برای انتخاب رنگ پس‌زمینه، متن یا سایر عناصر.
* کاربرد در طراحی: ایده‌آل برای ویرایشگرهای آنلاین تصویر، تولیدکننده‌های پالت رنگ و رابط‌های واکنش‌گرا.

---

### محدودیت پشتیبانی

این API در حال حاضر فقط در Chrome، Edge و Opera پشتیبانی می‌شود. در مرورگرهای Safari و Firefox هنوز قابل استفاده نیست.


#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍1
مرتب نگه داشتن head

با یک اسکریپت جالب برخورد کردم که امکان انجام یک حسابرسی بسیار سریع و اصلاح نسبتاً سریع ترتیب تگ‌ها درون <head> را فراهم می‌کند.

یک قطعه CSS از هری رابرتز وجود دارد که ترتیب نادرست تگ‌های سیستمی را برجسته می‌کند. این فایل ct.css نام دارد [+لینک]. همچنین یک ارائه درباره این قطعه وجود دارد. هری یک متخصص فوق‌العاده در زمینه عملکرد وب است و اسلایدهای او [+لینک] بسیار متقاعدکننده هستند.

اسکریپت capo.js تقریباً همان کار را انجام می‌دهد، با این تفاوت که نتایج حسابرسی را در کنسول نمایش می‌دهد و پیشنهاد می‌کند چگونه متا تگ‌ها، نشانه‌گذاری و سایر محتوای <head> را بهتر مرتب کنیم تا مهم‌ترین اطلاعات برای بارگذاری سریع صفحه در اولویت قرار گیرند و بقیه موارد بعداً بارگذاری شوند.


#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
ترتیب عناصر در <head>

چند وقت یک‌بار به <head> پروژه‌های خود سر می‌زنید و بررسی می‌کنید که چه اتفاقی در آنجا می‌افتد؟ بهتر است این کار را به‌صورت دوره‌ای انجام دهید، زیرا محتوای <head> و ترتیب عناصر می‌تواند تأثیر منفی بر عملکرد سایت داشته باشد.

ابتدا باید از صحت ساختار اطمینان حاصل کرد. درون <head> تنها برخی عناصر مشخص مجاز هستند:

* یک عنصر <title>
* یک عنصر <base>
* صفر یا بیشتر عناصر <link>
* صفر یا بیشتر عناصر <meta>
* صفر یا بیشتر عناصر <script>
* صفر یا بیشتر عناصر <style>
* صفر یا بیشتر عناصر <template>
* صفر یا بیشتر عناصر <noscript>

اگر هر عنصر دیگری در <head> مشاهده شود، پارسر فوراً <head> را می‌بندد و عناصر باقی‌مانده را به <body> منتقل می‌کند.

مثال:

<head>
<meta charset="utf-8">
<title>سایت من</title>
<img src="pixel.png">
<link
rel="preload"
href="custom-font.woff2"
as="font"
type="font/woff2"
>
<link
rel="stylesheet"
href="styles.css"
>
<script
src="script.js"
defer
></script>
</head>
<body>
<!-- ... -->
</body>


پارسر این کد را به شکل زیر بازسازی می‌کند:

<head>
<meta charset="utf-8">
<title>سایت من</title>
</head>
<body>
<img src="pixel.png">
<link
rel="preload"
href="custom-font.woff2"
as="font"
type="font/woff2"
>
<link
rel="stylesheet"
href="styles.css"
>
<script
src="script.js"
defer
></script>
<!-- ... -->
</body>


این موضوع پیامدهای مختلفی دارد، زیرا محل و اولویت عناصر در صف بارگذاری منابع، وضعیت مسدودسازی پارسر و عملکرد اسکریپت‌هایی که به <head> وابسته‌اند، تغییر می‌کند.

عناصر غیرمجاز در <head> معمولاً هنگام ادغام «پیکسل‌ها»، فریم‌های تحلیلی و دیگر افزونه‌های جانبی ظاهر می‌شوند و معمولاً شامل <img>`، <iframe> و <div>` هستند.

دستورالعمل‌های این افزونه‌ها اغلب پیشنهاد می‌کنند که کد مربوطه در ابتدای <body> قرار گیرد، اما گاهی همراه با <script> به <head> وارد می‌شوند. استفاده از ولیدیتور HTML می‌تواند چنین خطاهایی را شناسایی کند.

منبع دیگر مشکلات، ترتیب نادرست عناصر در <head> است. جابجایی ساده عناصر به ترتیب مناسب می‌تواند زمان بارگذاری را تا چند ثانیه کاهش دهد. در این زمینه، سخنرانی بسیار خوبی توسط هری رابرتز موجود است.

دو ابزار برای شناسایی مشکلات ترتیب عناصر وجود دارد:

* ct.css — فایل استایلی که عناصر <head> را قابل مشاهده می‌کند و نقاط مشکل‌دار را برجسته می‌سازد.
* capo.js — قطعه کدی که محتوای <head> را تحلیل کرده و ترتیب فعلی و مرتب‌شده را در کنسول نمایش می‌دهد.

مدیران تگ نیز توجه ویژه‌ای می‌طلبند، زیرا از طریق آن‌ها اسکریپت‌های بازاریابی مختلف به‌طور غیرقابل کنترل وارد سایت شده و <head> را شلوغ می‌کنند.


#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
Quicklink

یک کتابخانه کوچک جاوااسکریپت که برای شناسایی لینک‌هایی طراحی شده است که وارد ناحیه قابل مشاهده مرورگر (viewport) می‌شوند و منابعی را که این لینک‌ها به آن‌ها اشاره دارند، به‌صورت خودکار پیش‌بارگذاری می‌کند. این کتابخانه DOM را تحلیل می‌کند، لینک‌هایی را که در دید کاربر قرار دارند شناسایی می‌کند و بارگذاری منابع مرتبط (مانند تصاویر، اسکریپت‌ها یا داده‌های دیگر) را آغاز می‌کند و آن‌ها را در کش ذخیره می‌کند تا دسترسی بعدی سریع‌تر شود. این ویژگی به‌ویژه برای بهینه‌سازی عملکرد صفحات وب مفید است، زیرا زمان بارگذاری هنگام کلیک روی لینک‌ها را کاهش می‌دهد.

🔗https://getquick.link/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
1
This media is not supported in your browser
VIEW IN TELEGRAM
و در گوشش، با زمزمه‌ای جانکاه صحبت کرد ... .
◾️سالروز شهادت حضرت فاطمه زهرا (ص)

#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
5
qrframe

یک ابزار تولید QR کد مبتنی بر کد است که به شما امکان می‌دهد QR کدها را به‌صورت برنامه‌نویسی شده ایجاد کنید.


🔗https://github.com/zhengkyl/qrframe
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
👍1
Intl.ListFormat — قالب‌بندی لیست

«می‌داند» چگونه عناصر را به‌درستی با ویرگول، حرف ربط و/یا، کوتاه‌سازی پیوندها و غیره ترکیب کند، بسته به زبان و سبک مورد استفاده. استفاده از آن بسیار ساده است، اما آشنایی با گزینه‌ها و «چالش‌های پنهان» باعث می‌شود نتیجه نهایی تمیزتر و حرفه‌ای‌تر باشد. 😁

✔️ آرایه‌ای از مقادیر را به رشته‌ای قابل خواندن برای انسان تبدیل می‌کند و قوانین زبان را رعایت می‌کند (مثال: سیب، موز و پرتقال)؛

✔️ امکان انتخاب نوع (conjunction / disjunction / unit) و سبک (long / short / narrow) را فراهم می‌کند؛

✔️ متدهای format() (برای خروجی رشته‌ای)، formatToParts() (برای دریافت بخش‌های ساختاریافته) و resolvedOptions() (برای مشاهده گزینه‌های اعمال‌شده واقعی) را ارائه می‌دهد.

const lf = new Intl.ListFormat('fa', { type: 'conjunction', style: 'long' });

lf.format(['سیب']);
// "سیب"

lf.format(['سیب', 'موز']);
// "سیب و موز"

lf.format(['سیب', 'موز', 'پرتقال']);
// "سیب، موز و پرتقال"


new Intl.ListFormat('fa', { type: 'disjunction' })
.format(['چای', 'قهوه', 'آب‌میوه']);
// => "چای، قهوه یا آب‌میوه"


new Intl.ListFormat('en', { style: 'short' })
.format(['A', 'B', 'C']);
// => "A, B & C" (در انگلیسی short ممکن است از '&' استفاده شود)


#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍2
واقعیتی جالب: مغز انسان قادر نیست چیزی کاملاً نو از هیچ بیافریند؛ هر ایده‌ای در واقع ترکیبی از دانسته‌ها و تجربیاتی است که پیش‌تر در ذهن وجود داشته‌اند. در نتیجه، میزان خلاقیت ما به‌طور مستقیم به کیفیت محتوایی که مصرف می‌کنیم وابسته است. اگر ورودی ذهن شما فقط شامل میم‌ها و ویدیوهای کوتاه باشد، تبریک می‌گویم — تمام ایده‌هایتان هم بی‌ارزش خواهند بود (طبق برخی پژوهش‌ها، هرچند من منبعش را نمی‌دهم).
اما اگر خوراک ذهنی‌تان مثلاً کتاب‌ها و مقالات فنی باشد، مغز شما شروع می‌کند به تولید ایده‌هایی بیشتر و عمیق‌تر برای حل مسائل فنی در کد یا پروژه‌های واقعی.

پس باید اطلاعات باکیفیت‌تر مصرف کنیم و میم‌ها و ویدیوهای تیک‌تاک را فقط زمانی ببینیم که می‌خواهیم استراحت کنیم. ساده به نظر می‌رسد، اما همیشه یک «اما» وجود دارد.

مغز ما نمی‌تواند به‌طور هم‌زمان اطلاعات را هم دریافت کند و هم پردازش نماید. این موضوع شبیه فرایند تغذیه است: وقتی غذا می‌خورید، باید چهار تا پنج ساعت به بدن فرصت بدهید تا غذا هضم شود؛ اگر بی‌وقفه بخورید، نتیجه‌اش تهوع یا اسهال است.
در مورد مغز هم همین است — پس از خواندن یک مقاله‌ی فنی جالب، باید به مغز فرصت «هضم» اطلاعات را بدهید. برای این کار، نباید بلافاصله ذهن را با اطلاعات تازه پر کنید.

برای مثال، اگر بلافاصله بعد از خواندن یک مقاله بروید و ویدیوهای کوتاه ببینید، میم‌ها مرور کنید یا خبر بخوانید، مغز شما اطلاعات آن مقاله را بازنویسی می‌کند و بسته به وضعیتش، یا کل مقاله را فراموش می‌کند یا بخش بزرگی از آن را.

چطور باید به مغز اجازه‌ی هضم بدهیم؟
بسیار ساده است — فقط کافی است مدتی هیچ‌کاری نکنید: به دیوار نگاه کنید، قدم بزنید، یا بخوابید.
اتفاقاً از همین‌جا می‌آید آن ترفند معروف دوران مدرسه: وقتی می‌خواستیم شعری را حفظ کنیم، شب در تخت مرورش می‌کردیم و بلافاصله می‌خوابیدیم — صبح که بیدار می‌شدیم، شعر را به‌خوبی به خاطر داشتیم، چون مغز در خواب فرصت هضم و تثبیت اطلاعات را پیدا کرده بود.

#️⃣#discussion
👥@IR_javascript_group
🆔@IR_javascript
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
نکته‌ی CSS: از ارقام جدولی (tabular numbers) برای نمایش تایمرها استفاده کنید

ویژگی font-variant-numeric مشخص می‌کند که اعداد چگونه نمایش داده شوند. با تنظیم مقدار آن روی tabular-nums، تمام اعداد با پهنای یکسان نمایش داده می‌شوند، که باعث می‌شود کاملاً منظم و در یک خط قرار بگیرند.


#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
🔥3👍2
شعاع حاشیه منفی

گاهی پیش می‌آید که طراحان بلوک‌هایی با بریدگی‌های خاص طراحی می‌کنند که گوشه‌های آن‌ها گرد و نرم است، مانند تصویری که در پیوست مشاهده می‌کنید. همین چند روز پیش از من پرسیدند چگونه می‌توان چنین اثری را پیاده‌سازی کرد.

روش‌های مختلفی برای این کار وجود دارد، از جمله ترفندهایی با استفاده از عناصر ماسک دارای موقعیت مطلق. در کل، پیاده‌سازی چنین بلوک‌هایی کار ساده‌ای نیست. اما تیم HTML Academy راه‌حلی ارائه داده است — کتابخانه‌ای به نام nebo.css (https://github.com/htmlacademy/nebo.css
).

Nebo مخفف negative border radius است، عبارتی که اغلب برای توصیف چنین افکت‌هایی به کار می‌رود. این کتابخانه یک فایل CSS با بیش از صد خط کد است که چند کلاس و مجموعه‌ای از ویژگی‌های سفارشی برای تنظیم دقیق در اختیار شما قرار می‌دهد.

#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
👏1
افزونه‌ی Save All Resources یک ابزار برای مرورگر Google Chrome است که به شما اجازه می‌دهد تمام فایل‌های یک وب‌سایت را (تقریباً هر چیزی که مرورگر برای نمایش آن سایت دانلود می‌کند) ذخیره کنید.

به زبان ساده، وقتی شما وارد یک سایت می‌شوید، مرورگر فایل‌هایی مثل HTML، CSS، JavaScript، عکس‌ها، فونت‌ها و حتی داده‌های JSON را بارگذاری می‌کند. این افزونه همه‌ی آن منابع را یکجا جمع می‌کند و به شما امکان می‌دهد با یک کلیک آن‌ها را به‌صورت فشرده (ZIP) دانلود کنید.


#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍1
اپل سورس‌مپ‌های نسخه‌ی وب جدید App Store را مستقیماً در محیط پروداکشن منتشر کرد، و طبیعتاً این داده‌ها به بیرون درز کردند.

بدیهی است که مخزن اصلی اکنون حذف شده است. ([https://github.com/rxliuli/apps.apple.com](https://github.com/rxliuli/apps.apple.com)) اما البته من یک نسخه‌ی پشتیبان از آن دارم، و باید گفت تماشای آن واقعاً جالب است!

همچنین کلون‌های متعددی هم به‌موقع ایجاد شدند؛ برای مثال این مخزن: ([https://github.com/minhducdz99/apps.apple.com](https://github.com/minhducdz99/apps.apple.com)).

و اما برای شروع، بد نیست بدانید که کل داده‌ها با استفاده از افزونه‌ی کروم Save All Resources استخراج شده‌اند.

خب، در سورس‌کدها چه چیز جالبی وجود دارد؟

پیش از هر چیز، پروژه با Svelte ساخته شده است. غیرمنتظره بود؟ نه چندان. اپل معمولاً فریم‌ورک‌های غیرمرسوم را ترجیح می‌دهد . اپل در زمانی که همه از Angular و Backbone استفاده می‌کردند، با SproutCore آغاز کرد و سپس به سراغ Ember.js رفت. حداقل Apple Music با آن نوشته شده بود.

در مرحله‌ی دوم، نویسندگان پروژه بدون هیچ خجالتی در کد نظر (Comment) گذاشته‌اند.
در مرحله‌ی سوم، ساختار عجیب مخزن و این‌همه کامپوننت عظیم، تجربه‌ی غریبی بود. ولی خب، هر تیمی سبک خودش را دارد.

و در نهایت، به‌نظر می‌رسد آن‌ها فریم‌ورک اختصاصی خودشان را برای مدیریت وضعیت، مسیرها و درخواست‌ها دارند — فریم‌ورکی به نام Jet. هنوز زود است که درباره‌ی میزان کارایی آن قضاوت کنیم.




#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
3