Anophel-آنوفل شروع با Alpine.js | مزایا و معایب فریمورک Alpine.js

شروع با Alpine.js | مزایا و معایب فریمورک Alpine.js

انتشار:
1
0

Alpine.js یک فریم ورک جاوا اسکریپتی سبک و کوچک است که به تازگی در دنیای توسعه وب به شهرت رسیده است. این فریم ورک اختصاصی برای کار با اچ تی ام ال (HTML)، جی کوئری (jQuery) (البته جایگزین آن می باشد)و وانیلا جاوا اسکریپت (Vanilla JavaScript) ساخته شده است. در این مقاله، ما به بررسی عمیق Alpine.js می پردازیم و مزایا و معایب آن را بررسی می کنیم.

Alpine.js چیست؟

Alpine.js یک فریم ورک جاوا اسکریپتی منحصر به فرد است که برای ایجاد کامپوننت های تعاملی در وب سایت ها استفاده می شود. این فریم ورک به توسعه دهندگان امکان می دهد تا به راحتی و بدون نیاز به دانش عمیق در زمینه جاوا اسکریپت، کامپوننت ویژه ای را به وب سایت خود اضافه کنند.

هیچ مرحله ساختی وجود ندارد و اندازه فایل کتابخانه حدود 4 کیلوبایت گیگزیپ شده است. Alpine برای جایگزینی چارچوب هایی مانند Vue و React نیست. اگر یک برنامه تک صفحه ای بسیار تعاملی دارید، بهتر است از ابزارهای قدرتمندتر استفاده کنید. هنگامی که پروژه شما فقط به حداقل جاوا اسکریپت نیاز دارد، بهتر است از آن استفاده کنید، مانند زمانی که شما فقط به یک یا دو کامپوننت مانند dropdowns, sidebars, tabs, و image نیاز دارید.

Alpine مجموعه ای از 15 تا attributes و 6 properties و 2 متد است.

Alpine همچنین برای برنامه های رندر شده در سمت سرور، مانند Laravel، Rails و AdonisJS، که شما را ملزم به تغییر برخی از اجزای جاوا اسکریپت می کند، عالی است. و از آنجایی که DOM مجازی ندارد، راه اندازی آن آسان تر است.

اساسا، Alpine مانند Tailwind برای جاوا اسکریپت است. DOM و رفتار از هم جدا نیستند. شما می توانید DOM خود را حفظ کنید و رفتار خود را همانطور که می خواهید بپاشید. شما به راحتی می توانید کد اعلامی را برخلاف کد رویه ای بنویسید. در نهایت، Alpine ردپای بسیار کمی در برنامه شما دارد.

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

حالا بیایید به مراحل نصب برویم و دستمان را با Alpine عادت بدهیم.

نصب و استفاده اولیه

افزودن Alpine به پروژه آسان است. شما می توانید آن را از یک تگ اسکریپت از طریق CDN وارد کنید یا آن را به عنوان یک ماژول وارد کنید.

استفاده از تگ اسکریپت ساده ترین  راه برای اضافه کردن Alpine به پروژه شما است. شما فقط باید قطعه زیر را در انتهای بخش <head> فایل HTML خود اضافه کنید:

    <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>

به عنوان یک ماژول
با این روش ابتدا باید Alpine را از طریق npm نصب کنید:

npm install alpinejs

سپس، Alpine را به باندل خود وارد کرده و مقداردهی اولیه کنید:

import Alpine from 'alpinejs'

// optional
window.Alpine = Alpine

// initialize Alpine
Alpine.start()

یک کامپوننت ساده در آلپاین:

<html>
  <head>
    <script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script>
  </head>
  <body>
    <div x-data="{ isOpen: true }">
      <button x-on:click=" isOpen = !isOpen">Toggle</button>
      <h1 x-show="isOpen">Alpinjs</h1>
    </div>
  </body>
</html>

اولین قدم برای استفاده از Alpine تعریف یک state است. state هر جا که لازم باشد می رود و همان محدوده اسکوب HTML را دارد که در آن قرار داده اید.

در کد بالا، ما یک محدوده را با استفاده از دستور x-data با ارسال یک شی به عنوان مقدار state تعریف کردیم. دستور x-on به رویدادها گوش می دهد. برای المان دکمه، ما به رویداد کلیک گوش می دهیم که مقدار isOpen را به true یا false تغییر می دهد. دستور x-show بسته به مقدار ویژگی isOpen شیء state ، یک عنصر را از DOM نشان می دهد یا پنهان می کند.

ساخت counter

بیایید با یک کامپوننت counter ساده شروع کنیم تا اصول اولیه گوش دادن به حالت و رویداد را در Alpine نشان دهیم با دو ویژگی اصلی.

موارد زیر را در تگ <body> وارد کنید:

<div x-data="{ count: 0 }">
    <button x-on:click="count++">Increment</button>
 
    <span x-text="count"></span>
</div>

اکنون، می توانید ببینید با 3 بیت آلپاین که در این HTML وجود دارد، ما یک کامپوننت تعاملی "counter" ایجاد کرده ایم.

دستورات کدنویسی Alpine.js

در هسته چارچوب Alpine دستوراتی وجود دارد که با افزودن و حذف عناصر DOM، طرح DOM را تغییر می‌دهد و رفتار و ظاهر عناصر را در DOM تغییر می‌دهد. دستورالعمل های آلپاین با علامت x و به دنبال آن نام دستورالعمل شروع می شود.

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

x-data

x-data یک محدوده کامپوننت جدید را با یک شی در یک عنصر HTML مقداردهی اولیه می کند. همه عناصر HTML فرزند به شی داده ای که در عنصر والد آن وجود دارد دسترسی دارند:

<div x-data="{ isOpen: false }">...</div>

x-init

x-init برای اجرای یک عبارت در هنگام مقداردهی اولیه کامپوننت استفاده می شود و می توان از آن برای تنظیم مقدار اولیه state کامپوننت استفاده کرد:

<div x-data="{ title: 'foo' }" x-init="title = 'bar'"></div>

همچنین، x-init را می توان برای اجرای کد پس از مقداردهی اولیه کامپوننت با ارسال تابع callback استفاده کرد:

<div x-data="{ images: [] }"
  x-init="$nextTick(() => {
    fetch('https://pixabay.com/api/?key=15819227-ef2d84d1681b9442aaa9755b8&q=yellow+flowers&image_type=photo')
      .then(response => answer.json())
      .then(response => { images = answer.hits })
  })"
</div>

x-bind

آلپاین x-bind را به عنوان مکانیزمی برای اتصال value ، بولی و ویژگی های کلاس ارائه می کند.

اتصال مقدار attribute :

<img x-bind:src="imgSrc">


این مقدار یک attribute را به نتیجه عبارت تنظیم می کند.

اتصال attribute کلاس:

<div x-bind:class="{ 'hidden': isClosed }"></div>


برای اتصال کلاس، یک عبارت شی ارسال می شود. کلیدهای شیء نام کلاس ها هستند و مقادیر عبارت های بولی هستند. اگر عبارت بولی به true ارزیابی شود، نام کلاس برای آن عنصر اعمال می شود.

اتصال attribute بولی:

<input type="text" x-bind:hidden="true">

اتصال بولی مانند اتصال ویژگی عمل می کند، اما عبارت ارسال شده باید به true یا false ارزیابی شود.

x-on

x-on شنونده رویداد را به عنصری که در آن اعلام شده است اضافه می کند. هنگامی که عنصر آن رویداد را منتشر می کند (به عنوان مثال، یک کلیک یا رویداد ورودی)، یک عبارت (یا تابع) اجرا می شود:

<button x-on:click="foo = 'bar'">روی من کلیک کنید</button>


x-show

x-show ویژگی نمایش CSS عنصر را بسته به اینکه عبارت به true یا false ارزیابی شود تغییر می دهد. اگر عبارت به false ارزیابی شود، ویژگی display عنصر روی none تنظیم می شود. اگر به true برسد، ویژگی display روی بلوک تنظیم می‌شود:

<div x-show="isOpen"></div>


x-if

در حالی که x-show می تواند برای تغییر ویژگی نمایش یک عنصر استفاده شود، عنصر در واقع از DOM حذف نمی شود. دستور x-if عناصر را با CSS پنهان نمی کند. آنها را به طور کامل از DOM اضافه و حذف می کند.

مقدار x-if یک عبارت بولی است که می تواند true یا false ارزیابی شود. اگر عبارت false ارزیابی شود، x-if عنصر خود را از DOM حذف می کند. x-if فقط در عنصر template کار می کند و باید یک ریشه عنصر در داخل تگ template داشته باشد:

<template x-if="true">
  <div>...</div>
</template>

x-for

x-for زمانی کمک می کند که می خواهید گره های DOM جدید برای هر مورد در یک مجموعه ایجاد کنید. درست مانند دستور x-if، دستور x-for باید روی یک تگ template وجود داشته باشد، نه یک عنصر DOM معمولی:

<template x-for="item in items" :key="item">
    <div x-text="item"></div>
</template>


x-model

x-model یک قابلیت اتصال داده دو طرفه را به یک عنصر اضافه می کند و مقدار یک عنصر ورودی و داده های کامپوننت را همگام می کند. به اندازه کافی هوشمند است که تغییرات را در ورودی‌های متن، چک باکس‌ها، radios ،textarea و multi selecting تشخیص دهد و مقدار آنها را به داده‌های کامپوننت متصل کند:

<input type="search" x-model="search">

x-text

در حالی که x-bind برای اتصال ویژگی است، x-text برای تنظیم مقدار innerText یک عنصر استفاده می شود:

<span x-text="title"></span>

x-html

x-html مشابه x-text کار می کند، اما به جای تنظیم innerText، مقدار innerHTML یک عنصر را تعیین می کند:

<span x-html="title"></span>


برای کسب اطلاعات بیشتر در مورد دستورالعمل های آلپاین، حتماً اسناد را بررسی کنید.

ساخت گالری تصاویر با Alpine

برای نشان دادن اینکه چگونه می توان از این دستورالعمل ها با هم استفاده کرد، اجازه دهید یک گالری تصویر ساده بسازیم:

<!DOCTYPE html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
    />
    <!-- Bootstrap CSS -->
    <link
      rel="stylesheet"
      href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
      integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
      crossorigin="anonymous"
    />
    <!-- Custom CSS -->
    <link rel="stylesheet" href="css/custom.css" />
    <!-- Fonts -->
    <link
      href="https://fonts.googleapis.com/css?family=Lora:400,700|Nunito:400,700"
      rel="stylesheet"
    />
    <script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script>
    <script
      defer
      src="https://use.fontawesome.com/releases/v5.0.7/js/all.js"
    ></script>
    <link
      href="images/favicon_32.ico"
      rel="shortcut icon"
      type="image/x-icon"
    />
    <link href="images/favicon_256.ico" rel="apple-touch-icon" />
  </head>
  <body
    x-data="images()"
    x-init="fetch('https://pixabay.com/api/?key=15819227-ef2d84d1681b9442aaa9755b8&q=yellow+flowers&image_type=photo')
.then(response => response.json())
.then(response => { images = response.hits })"
  >
    <!-- Header section -->
    <header class="navigation">
      <div class="container navigation-content">
        <nav class="navbar navbar-expand-lg navbar-light">
          <a class="navbar-brand" href="index.html"
            ><img
              src="https://godwinekuma.github.io/we-connect/images/logo-white.svg"
              alt="weconnect logo"
              height="50"
              class="navbar-brand-image"
            />
            PictureGram</a
          >
          <button
            class="navbar-toggler"
            type="button"
            data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent"
            aria-expanded="false"
            aria-label="Toggle navigation"
          >
            <span class="navbar-toggler-icon"></span>
          </button>
        </nav>
      </div>
    </header>
    <!-- Header section /-->
    <!-- Hero Section -->
    <div>
      <section class="hero">
        <div class="container">
          <div class="d-flex flex-column align-items-center">
            <h1 class="display-4" style="text-align:center">
              Search for images.
            </h1>
            <h2 class="" style="text-align:center">
              Pixel perfect images can be found here.
            </h2>
            <div class="input-group">
              <input
                type="text"
                class="form-control"
                placeholder="search images"
                x-model="q"
                aria-label="Text input with segmented dropdown button"
              />
              <select class="custom-select" x-model="image_type">
                <option selected>choose image type</option>
                <option value="all">All</option>
                <option value="photo">Photo</option>
                <option value="illustration">Illustration</option>
                <option value="vector">Vector</option>
              </select>
              <div class="input-group-append">
                <button
                  class="btn btn-primary"
                  type="button"
                  x-on:click="getImages()"
                >
                  Search
                </button>
              </div>
            </div>
          </div>
        </div>
      </section>
      <section id="photos" class="my-5">
        <template x-for="image in images" :key="image.id">
          <img x-bind:src="image.webformatURL" alt="image.tags[0]" />
        </template>
      </section>
    </div>
    <script>
      function images() {
        return {
          images: [],
          q: "",
          image_type: "",
          getImages: async function() {
            console.log("params", this.q, this.image_type);
            const response = await fetch(
              `https://pixabay.com/api/?key=15819227-ef2d84d1681b9442aaa9755b8&q=${
                this.q
              }&image_type=${this.image_type}`
            );
            const data = await response.json();
            this.images = data.hits;
          }
        };
      }
    </script>
  </body>
</html>  

برنامه گالری ما لیستی از تصاویر را از Pixabay دریافت می کند و آنها را نمایش می دهد. حالت برنامه بر روی تگ body توسط دستور x-data با استفاده از تابعی به نام images تنظیم می شود. تابع یک شی را برمی گرداند که حاوی image، q، image-type و getImages است.

مقدار اولیه یک تصویر با استفاده از دستور x-init تنظیم می شود. x-init لیستی از تصاویر را از Pixabay دریافت می کند و آن را به عنوان فیلد مقدار تصاویر تنظیم می کند. q مقدار <input> را می گیرد و با استفاده از دستور x-model تنظیم می شود. از سوی دیگر، image_type مقدار <select></select> را می گیرد و همچنین با استفاده از دستور x-model تنظیم می شود.

ما یک شنونده رویداد کلیکی را به <button> دادیم. هنگامی که دکمه کلیک می شود، متد ()getImages در state فراخوانی می شود. متد ()getImages تصاویر جدید را بر اساس مقدار q و image_type واکشی می کند.

مزایا و معایب Alpine.js

مزایا:

سبک و سریع
یکی از مزایای بزرگ Alpine.js سبک و سرعت آن است. این فریم ورک بسیار کم حجم است و به سرعت بارگذاری می شود.

 

اجزای تعاملی
Alpine.js به شما امکان می دهد اجزا ویژه ای را ایجاد کنید که به وب سایت شما تعاملی تر کنند و تجربه کاربری را بهبود ببخشند.

 

سادگی و آموزش آسان
یکی دیگر از مزایای Alpine.js، سادگی و آموزش آسان آن است. حتی توسعه دهندگان مبتدی نیز می توانند به راحتی از این فریم ورک استفاده کنند.

معایب:

کمبود اکوسیستم گسترده
یکی از معایب Alpine.js این است که اکوسیستم آن نسبت به فریم ورک های دیگر کمتر گسترده است. این ممکن است در پروژه های بزرگ تر مشکلاتی ایجاد کند.

 

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

نتیجه

در این آموزش نحوه استفاده از Alpine را توضیح دادیم و یک نمونه گالری تصویر با این فریم ورک را ساختیم. اگرچه ممکن است به طور کامل جایگزین فریمورک های دیگر نشود، اما می توان آن را در ترکیب با React یا Vue برای نمونه سازی سریع کامپوننت ها بدون نوشتن جاوا اسکریپت زیاد استفاده کرد. برای کسب اطلاعات بیشتر در مورد Alpine، حتماً به وب سایت آن مراجعه کنید.

#آلپاین#Alpine.js#فرانت_اند#front_end#alpine#js#جاوااسکریپت
نظرات ارزشمند شما :
Loading...