۶ اردیبهشت ۱۴۰۴

Techboy

اخبار و اطلاعات روز تکنولوژی

معرفی به alpine.js: یک چارچوب جاوا اسکریپت برای مینیمالیست ها

Alpine.js یک چارچوب JavaScript جلوی آن مانند یک کوله پشتی سبک ، با API مینیمالیستی و ویژگی های متفکرانه است. بیایید آن را امتحان کنیم.

Alpine.js یک چارچوب JavaScript جلوی آن مانند یک کوله پشتی سبک ، با API مینیمالیستی و ویژگی های متفکرانه است. بیایید آن را امتحان کنیم.

من اخیراً از طریق Big Sur کوله پشتی کردم و بعد از چند روز ، اجتناب ناپذیر اتفاق افتاد: من به هر آنچه که حمل کردم نگاه کردم و خواستار آن شدم که حضور آن را در کوله پشتی من توجیه کند. انجام گزینه های فنی در طی فرآیند توسعه نرم افزار مشابه است. هر دارایی موجود در سیستم پیچیدگی را اضافه می کند ، بنابراین همه چیز بهتر است وزن خود را بکشید.

آلپین مکانی را برای خود به عنوان انتخاب مینیمالیستی در میان چارچوب های واکنش

API مینیمالیستی آلپ

همانطور که در اسناد آلپ شرح داده شده است ، آلپ مجموعه ای از ۱۵ ویژگی ، شش خاصیت و دو روش است. این یک API بسیار کوچک است. این واکنش پذیری را در یک بسته ساده ارائه می دهد ، سپس چند مورد در بالا مانند رویداد و یک فروشگاه ارائه می دهد.

صفحه وب ساده زیر را در نظر بگیرید:


<html>
<head>
  <script src="https://unpkg.com/alpinejs@3.14.8/dist/cdn.min.js" defer></script>
</head>
<body>
  <div x-data="">
    <span x-text="'Text literal'"></span>
</div>
</body>
</html>

علاوه بر بسته بندی آلپین از طریق CDN ، تنها چیزهای مرتبط با آلپ در اینجا دو دستورالعمل هستند: X-Data و x-text .

اگر این موضوع را در صفحه HTML در سیستم خود قرار داده و آن را در مرورگر مشاهده کنید ، این پیام را مشاهده خواهید کرد: خروجی “متن به معنای کلی”. این بسیار چشمگیر نیست ، اما دو واقعیت جالب در مورد آلپ را نشان می دهد.

ابتدا ، برای واکنش پذیری درگیری ، باید نشانه گذاری را در یک دستورالعمل x-data محصور کنید. اگر این بخشنامه را حذف کنید ، x-text اثر نخواهد داشت. بنابراین ، دستورالعمل X-Data یک مؤلفه آلپ را ایجاد می کند. در این حالت ، دستورالعمل خالی است ، اما در استفاده واقعی تقریباً همیشه داده ها را در آنجا دارید. از این گذشته ، شما در حال نوشتن مؤلفه هایی هستید که هدف آنها واکنشی به آن داده ها است.

دوم ، می توانید هر نوع javascript را به x-text اضافه کنید. این در مورد All دستورالعمل های آلپ صادق است. ویژگی X-Text پیوندی بین HTML (نمای) و JavaScript (رفتار) به شما می دهد.

alpine و htmx

آلپین از ویژگی های HTML برای تعریف عملکرد آن استفاده می کند ، که آن را از بعضی جهات شبیه به htmx اگرچه آنها کارهای مختلفی انجام می دهند ، هر دو فناوری از برنامه های پسوند HTML با x-prefix استفاده می کنند تا قدرت های بوت استرپ را بر روی HTML قدیمی قدیمی انجام دهند.

<div x-data="{ message: 'When in the course of human events...' }"> <span x-text="message"></span> </div>

اکنون این صفحه آغاز اعلامیه استقلال را صادر می کند. می توانید ببینید که x-data یک شیء قدیمی JavaScript قدیمی را با یک قسمت واحد ، “پیام” تعریف کرده است که حاوی مقدمه است ، و اینکه x-text به این قسمت شیء اشاره دارد.

واکنش پذیری در آلپ

اکنون ما از واکنش پذیری برای رفع خطایی در سند استفاده خواهیم کرد:


<div x-data="{ noun: 'men' }">
  <button x-on:click="noun = 'people'">Fix It</button>
  <span x-text="`all ${noun} are created equal`"></span>
</div>

همانطور که اکنون مشهود است ، دستورالعمل X-Text به متغیر اسم در معرض دستورالعمل X اشاره دارد. قطعه جدید در اینجا دکمه ای است که دارای دستورالعمل X-on است: روی کلیک کنید. کنترل کننده این رویداد کلیک جایگزین اسم پیش فرض قدیمی (“مردان”) با یک جنسیت بی طرف ، “مردم” است. واکنش پذیری سپس به روزرسانی مرجع را در x-text انجام می دهد.

UI به طور خودکار تغییر داده ها را منعکس می کند.

توابع در داده ها

خصوصیات داده در آلپین اشیاء جاوا اسکریپت کامل است. با دانستن این موضوع ، در اینجا روش دیگری برای رسیدگی به نیاز فوق وجود دارد:


<div x-data="{ 
      noun: 'men', 
      fixIt: function(){
        this.noun = 'people';
      }
    }">
    <button x-on:click="fixIt()">Fix It</button>
    <span x-text="`all ${noun} are created equal`"></span>
  </div>

در این مثال ، می بینید که شی داده اکنون میزبان یک روش fixit است که توسط کنترل کننده کلیک خوانده می شود. ما می توانیم هر ساختار شیء را به بهترین وجه با رفتاری که می خواهیم در HTML مشاهده کنیم ، انجام دهیم.

اسکریپت در مقابل X-Data

گاهی اوقات کدی را مشاهده می کنید که از دستورالعمل X-Data به یک تابع تعریف شده در یک اسکریپت می پردازد. این یک موضوع اولویت شخصی است ، زیرا دقیقاً به همان روشی که یک خط داخلی x-data عمل می کند ، عمل می کند:


<div x-data="myDataFunction()">...</div>
	...
	<script>
	  function myDataFunction() {
	    return {
		  foo: "bar"
		}
	  }
	</script>

واکشی داده های از راه دور

اکنون اجازه دهید چرخ دنده ها را تغییر دهیم و در مورد الزامی که می خواهید یک لیست با فرمت JSON از روسای جمهور آمریکایی را از یک API خارجی بارگیری کنید ، فکر کنیم. اولین کاری که ما انجام خواهیم داد این است که هنگام بارگیری صفحه ، آن را بارگیری کنیم. برای این کار ، ما از دستورالعمل x-init استفاده خواهیم کرد:


<div x-data="{
      presidents: []
    }" 
    x-init="(
      async () => {
        const response = await fetch('https://raw.githubusercontent.com/hitch17/sample-data/master/presidents.json');
        presidents = await response.json();
      }
    )">
    <span x-text="presidents"></span>
  </div>

اجازه دهید این کد را باز کنیم. دستورالعمل X-Data باید واضح باشد. این یک قسمت روسای جمهور با یک آرایه خالی دارد. x-text در عنصر span محتویات این قسمت را خروجی می کند.

کد x-init کمی بیشتر درگیر است. اول از همه ، توجه کنید که در یک عملکرد خود اجرایی پیچیده شده است. این امر به این دلیل است که Alpine انتظار یک عملکرد را دارد (نه یک تعریف عملکرد). اگر قرار بود از فرم پاسخ به تماس غیر ASYNC Fetch استفاده کنید ، نیازی به بسته بندی عملکرد مانند این نیست (زیرا در این مورد به عملکرد async-scoped احتیاج ندارید).

پس از به دست آوردن لیست روسای جمهور از نقطه پایانی ، ما آن را به متغیر روسای جمهور می چسبانیم ، که آلپین به عنوان بخشی از شیء x-data در معرض ما قرار داده است.

برای تکرار: Alpine داده ها را از X-Data در دسترس سایر توابع دستورالعمل (مانند x-init ) در همان زمینه قرار می دهد.

تکرار با آلپین

در این مرحله ، برنامه داده ها را از نقطه پایانی از راه دور بیرون می کشد و آن را به حالت ذخیره می کند. با این حال ، این در حال خروج از چیزی مانند [object] ، [object] .... است. این چیزی نیست که ما می خواهیم. برای رفع آن ، ما ابتدا باید نگاهی به تکرار داده ها بیندازیم:


<div x-data=...>
<ul>
      <template x-for="pres in presidents">
        <li><div x-text="pres.president"></div>
          From: <span x-text="pres.took_office"></span> Until: <span x-text="pres.left_office"></span></li>
      </template>
    </ul>
</div>

مرد ، که واقعاً تمیز ، کد و الگوی خود توضیحی است!

کد حاوی یک لیست غیر سفارش معمولی ، و سپس یک عنصر الگوی html است که حاوی x-for است. این دستورالعمل دقیقاً مانند سایر چارچوبهای واکنشی عمل می کند. این امکان را برای تعیین یک مجموعه ، روسای جمهور و یک شناسه فراهم می کند ، که به نشانه محصور شده ارائه می شود که نشان دهنده هر نمونه از آن مجموعه است (در این حالت ، pres ).

بقیه نشانه ها از متغیر pres برای خروجی داده ها از اشیاء از طریق x-text استفاده می کنند. (این استفاده از تکرار یکی از رایج ترین الگوهای موجود در تمام نرم افزارها است.)

برنامه اکنون چیزی شبیه به تصویر زیر به نظر می رسد ، لیستی از روسای جمهور ایالات متحده را نشان می دهد.

لیستی از روسای جمهور ایالات متحده تولید شده با alpine.js.

لیستی از روسای جمهور ایالات متحده که با alpine.js تولید شده اند.

نمایش/پنهان کردن و onClick

اکنون بیایید بگوییم که ما می خواهیم با کلیک بر روی نام رئیس جمهور ، توانایی تغییر داده ها را برای رئیس جمهور اضافه کنیم. ما نشانه گذاری را تغییر می دهیم تا به این شکل نگاه کنیم:


<template x-for="pres in presidents">
  <li>
    <div x-text="pres.president" x-on:click="pres.show = ! pres.show"></div>
    <div x-show="pres.show">
       From: <span x-text="pres.took_office"></span> Until: <span x-text="pres.left_office"></span>
     </div>
  </li>
</template>

ما از دستورالعمل X-Show در یک div حاوی جزئیات ریاست جمهوری استفاده می کنیم. حقیقت بودن مقدار x-show تعیین می کند که آیا محتوا قابل مشاهده است یا خیر. در مورد ما ، این توسط قسمت pres.show تعیین می شود. (توجه داشته باشید که در یک برنامه واقعی ، شما ممکن است بخواهید از داده های تجاری واقعی برای میزبانی متغیر نمایش/پنهان استفاده کنید تا داده ها و رفتار را منزوی تر نگه دارید.)

برای تغییر مقدار pres.show ما یک x-on را اضافه می کنیم: روی کنترل کننده روی هدر کلیک کنید. این کنترل کننده به سادگی مقدار واقعی/غلط pres.show: pres.show =! Pres.show .

اضافه کردن انیمیشن انتقال

Alpine شامل انتقال های داخلی است که می توانید برای ویژگی نمایش/پنهان استفاده کنید. در اینجا نحوه اضافه کردن انیمیشن پیش فرض آورده شده است:


<div x-show="pres.show" x-transition>
  From: <span x-text="pres.took_office"></span> Until: <span x-text="pres.left_office"></span></li>
</div>

تمام آنچه تغییر کرد عنصری بود که دارای دستورالعمل X-Show بود ، که اکنون دارای یک دستورالعمل X-Transition است. به طور پیش فرض ، Alpine انتقال معقول را اعمال می کند. در این حالت از اثر اسلاید و محو استفاده می شود. شما می توانید انتقال را بطور گسترده سفارشی کنید ، از جمله با استفاده از کلاسهای CSS خود در مراحل مختلف انیمیشن. برای اطلاعات بیشتر به مراجعه کنید.

اتصال به ورودی ها

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


<div x-data="{
  filter: '',
  presidents: [],
    getPresidents: function(){
        return this.presidents.filter(pres => pres.president.includes(this.filter) )
      }
    }" 
...
    <input x-model="filter" />
...
  <ul>
      <template x-for="pres in getPresidents">

توجه کنید که شیء X-Data اکنون یک فیلد “فیلتر” روی آن دارد. این دو طرفه از طریق دستورالعمل X-Model که به “ فیلتر ” اشاره می کند ، به عنصر ورودی محدود می شود.

ما الگوی x-for را برای مرجع یک روش جدید getPresidents () تغییر داده ایم ، که در شی x-data اجرا شده است. این روش از نحو استاندارد JavaScript برای فیلتر کردن روسای جمهور بر اساس اینکه آیا متن را در قسمت فیلتر قرار می دهند ، استفاده می کند.

دستورالعمل اعزام $ Alpine

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

به مراجعه کنید به مخزن github برای مشاهده تمام کد برای نمونه های این مقاله.

نتیجه گیری

مانند نامگذاری آن ، Alpine کوله پشتی با دنده اصلی است تا شما را از طریق کوه ها بدست آورد. این حداقل ، اما کافی است. این شامل برخی از ویژگی های سطح بالاتر ، مانند یک فروشگاه مرکزی و یک سیستم رویداد و همچنین معماری افزونه و اکوسیستم است.

در کل ، آلپ برای استفاده ارگونومیک است و اگر با سایر چارچوب های واکنشی کار کرده اید ، آشنا خواهد بود. به همین دلایل ، یادگیری سریع و آسان است. سادگی اعلام یک مؤلفه و داده های آن در یک دستورالعمل X به سادگی نبوغ است. دفعه بعد که من به کد سرمایه گذاری می روم ، آلپین گزینه وسوسه انگیز خواهد بود.

به مقایسه چارچوب JavaScript برای اطلاعات بیشتر در مورد Alpine و سایر چارچوب های جلویی.