برنامه نویسی

کد نویسی برنامه های Faster React: نحوه مهاجرت از Emotion CSS-in-JS به Stylify Utility-First CSS

به دنبال راه بهتری برای مدیریت CSS خود در React هستید؟ بیاموزید که چگونه از Emotion CSS-in-JS به رویکرد اول ابزار کاربردی Stylify CSS مهاجرت کنید و گردش کار توسعه خود را ساده کنید.

می توانید نمونه های موجود در این مقاله را در Playground On Stackblitz امتحان کنید.

💎 مقدمه

Stylify کتابخانه‌ای است که از انتخابگرهای شبیه به CSS برای تولید CSS بهینه‌سازی شده بر اساس آنچه می‌نویسید استفاده می‌کند.

امکانات:
✅ ساخت ماژول. بدون اسکریپت زمان اجرا
✅ انتخابگرهای شبیه CSS
✅ بدون چارچوب برای مطالعه
✅ زمان کمتری که در اسناد صرف می شود
✅ CSS مخدوش و بسیار کوچک
✅ بدون نیاز به پاکسازی CSS
✅ مولفه ها، متغیرها، انتخابگرهای سفارشی
✅ می تواند چندین بسته CSS ایجاد کند

🔗 اجزاء

در Emotion، اجزاء اغلب به این صورت تعریف می شوند:

const Title = styled.h1`
  color: blue 
  font-weight: bold
  @media (max-width: 640px) {
    color:red
  }
`;
<Title>Hello World!🎉</Title>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Stylify ویژگی مشابهی را ارائه می دهد. کامپوننت‌ها را می‌توان در یک فایل (با استفاده از گزینه‌های محتوا)، جایی که از آنها استفاده می‌شود، یا به صورت سراسری در یک پیکربندی تعریف کرد.

به عنوان مثال با پیکربندی در یک فایل. محتوای بین stylify-components از شی جاوا اسکریپت بدون براکت های اطراف انتظار می رود:

<!-- 
stylify-components
  title: 'color:blue font-weight:bold md:color:red'
/stylify-components
-->
<h1 class="title"></h1>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مثال در یک پیکربندی کامپایلر جهانی:

const compilerConfig = {
  title: 'color:blue font-weight:bold md:color:red'
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده:

<h1 class="title"></h1>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اجزاء “تنبل” هستند (در صورت تقاضا تولید می شوند). این بدان معناست که حتی اگر آنها را پیکربندی کنید (در یک فایل یا به صورت سراسری)، فقط در صورت مطابقت با محتوا تولید می شوند. هیچ CSS استفاده نشده ای تولید نمی شود. در مورد آب و برق هم همینطور. اگر ابزار یک مؤلفه مستقیماً با یک محتوا مطابقت نداشته باشد، انتخابگر ایجاد نمی شود و فقط انتخابگر مؤلفه به خروجی CSS اضافه می شود.

خروجی CSS تولیدی در تولید چیزی شبیه به این خواهد بود:

.a,.d {color:blue}
.b,.d {font-weight:bold}
 @media (max-width: 768px) {
 .c,.d {color:red}
 }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی html:

<h1 class="d"></h1>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

🎯 انتخاب کننده ها

در Emotion، می توانید از CSS prop برای استایل دادن به عنصر مستقیماً به این صورت استفاده کنید:

<div css={css`
  color: blue;
  font-weight: bold;
  @media (min-width: 640px) {
    color: red;
  }
`}></div>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Stylify به شما امکان می دهد از برنامه های کاربردی مستقیماً در محتوا استفاده کنید. بنابراین مثال بالا را می توان به این شکل بازگرداند:

<div className="color:blue font-weight:bold md:color:red"></div>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی تولید CSS مشابه نمونه کامپوننت ها خواهد بود. اما HTML به شکل زیر خواهد بود:

<div className="a b c"></div>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

🌐 سبک های جهانی

گاهی اوقات لازم است برخی از قسمت های برنامه را به صورت سراسری استایل کنیم. برای انجام این کار در Emotion، باید از مؤلفه Global استفاده کنیم:

<Global
  styles={css`
    .some-class {
      color: hotpink !important;
    }
  `}
/>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

مثال با ویژگی class:

<div className="[.button_.icon]{font-size:14px}">
  <button className="
    [.icon]{color:#fff;border-radius:12px}
    [&+button]{margin-left:24px}
  ">
    <i className="icon"></i>
  </button>
  <button></button>
<div>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

الگوی نحوی در ویژگی class به شکل زیر است:

[css selectors]{stylify selectors split by ;}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را _ (زیر خط) هم در انتخابگرهای CSS و Stylify و هم به جای فاصله استفاده می شود & کاراکتر همیشه به عنصر فعلی اشاره دارد.

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

const compilerConfig = {
  customSelectors: {
    '.buttons-wrapper .button .icon': 'font-size:14px',
    '.button': `
       .icon { color:#fff border-radius:12px }
       & + button { margin-left:24px }
    `,
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگام تعریف customSelectors در پیکربندی جهانی، نحو به شما امکان می دهد از یک ویژگی تودرتو استفاده کنید. را & کاراکترها به سطح بالایی اشاره دارند.

استفاده از پیکربندی جهانی:

<div className="buttons-wrapper">
  <button className="button">
    <i className="icon"></i>
  </button>
  <button></button>
<div>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

💲متغیرها

زمانی که باید رنگی را با استفاده از props به کامپوننت منتقل کنید، به جای انجام این کار color: ${props => props.textColor};، می توانید از متغیرهای CSS بومی استفاده کنید:

<div 
  style={{ '--localTextColor': props.textColor }}
  className="title color:$localTextColor"
">
</div>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

فقط باید به Stylify بگوییم که متغیرها را به جای مقدارشان با متغیرهای CSS جایگزین کند و این localTextColor خارجی است:

const compilerConfig = {
  replaceVariablesByCssVariables: true,
  externalVariables: ['localTextColor']
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

متغیر خارجی نیز فقط در فایلی که در آن استفاده می شود قابل تعریف است:

<!-- 
stylify-externalVariables
  localTextColor
/stylify-externalVariables
-->
<div 
  style={{ '--localTextColor': props.textColor }}
  className="title color:$localTextColor"
">
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Stylify همچنین گزینه ای برای پیکربندی متغیرهای سفارشی. این کار را می توان در فایلی که در آن استفاده می شود، به همان روشی که کامپوننت ها یا در پیکربندی جهانی انجام می دهند:

در پرونده:

<!-- 
stylify-variables
  primary: '#000',
  secondary: '#444'
/stylify-variables
-->
<div class="color:primary"></div>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در پیکربندی کامپایلر:

const compilerConfig = {
  primary: '#000'
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

📦 تقسیم CSS

Emotion CSS را به طور خودکار تقسیم می کند و آن را مستقیماً بر اساس اجزای رندر شده به سند تزریق می کند.

Stylify هیچ اسکریپت زمان اجرا ندارد، بنابراین باید Bundler و splitting را به صورت دستی پیکربندی کنید.

با این حال، خروجی Stylify آنقدر کوچک است (حتی می تواند 10 کیلوبایت (گزیپ شده) برای یک وب سایت بزرگ باشد)، که داشتن تنها یک بسته برای کل پروژه مشکلی ندارد. در نهایت، در آنجا می توانید نکات مربوط به تقسیم بسته های CSS را بررسی کنید.

مثال پیکربندی باندل:

const bundles = [
  { 
     outputFile: 'path/to/layout.css', 
     files: ['path/to/layout.jsx'] 
  },

  // Bundler uses https://npmjs.com/package/fast-glob
  // You can use its glob syntax
  { 
     outputFile: 'path/to/global.css', 
     files: ['path/**/*.jsx'] 
  }
]);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به من بگویید که چه فکر می کنید!

اگر ایده را دوست دارید، با بازی Stylify repo ❤️ به من اطلاع دهید.

من برای هر گونه بازخورد خوشحال خواهم شد! Stylify هنوز یک کتابخانه جدید است و فضای زیادی برای بهبود وجود دارد 🙂.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا