В этом посте мы рассмотрим, почему Alpinejs является идеальной библиотекой JavaScript для интеграции рендеринга HTML на стороне сервера и интерактивности JavaScript на стороне клиента.
🧭 Начало нашего путешествия: выбор наших инструментов
Для многих разработчиков ASP.NET JavaScript в Интернете является синонимом jQuery и хотя jQuery, безусловно, вездесущий , это не единственный вариант.
Основными преимуществами jQuery в 2021 году являются его простота использования (просто добавьте Элемент на страницу!) И его Огромная плагина экосистема Анкет Тем не менее, есть также некоторые недостатки, которые идут с этой библиотекой 😮.
🍝 JQUERY SPAGHETTI
JQuery в значительной степени связан с предоставлением постоянного (и гибкого) API для манипулирования DOM и использования функций браузера через JavaScript. Это требует императив и Процедурный Подход к этим проблемам, потому что jQuery является библиотекой низкого уровня.
Преимущества последовательного DOM API в браузерах больше не относятся к нам в эпоху современных вечнозеленых браузеров 🙏🏻.
Аналогичным образом, браузеры приняли синтаксис селектора JQUERY DOM ( Sizzle ) в document.queryselector () и document.queryselectorall () функции 😎.
С этими бездышными блюдами, что мы обычно получаем при использовании jQuery в 2021 году?
К сожалению, иногда это не красиво 🙄.
Образец построения чего -либо с jQuery обычно включает в себя эти шаги:
- Найдите некоторые элементы DOM (часто по
idилиclass) - Зарегистрируйте несколько обработчиков событий с этими элементами DOM, чтобы мы могли реагировать на взаимодействие с пользователями на странице
- Записать логику в JavaScript, которая специфична для нашего приложения
- Повторить
Шаги 1 и 2 – это те, которые становятся более проблематичными по мере роста сложности нашего JavaScript.
Поскольку jQuery является библиотекой низкого уровня, мы несем ответственность за всю работу сантехники. Сантехника – это весь код, который мы должны писать, чтобы «подключить вещи», и эта сантехника распространяется на протяжении всей нашей бизнес -логики.
Это не только делает важную часть нашего кода (бизнес -логика) более запутанной, но и то, что нам нужно поддерживать в течение жизни приложения.
Термин «jquery spaghetti» предназначен для описания того кода, который мы заставляем писать, когда пытаются создать сложные интерфейсы с помощью JQUERY, потому что код бизнес -логики и код сантехники смешиваются вместе и часто тесно связаны.
Вот пример JQUERY SPAGHETTI (возможно, не полная тарелка 🍝):
$(function () {
// Find our form
const formEl = $('#myForm');
if (!formEl) {
console.error('Could not find form');
return;
}
// Register an event listener
$('#myForm').on('click', function (e) {
e.preventDefault();
// Find our form field
const emailEl = $('form [name="email"]');
if (!emailEl) {
console.error('Could not email form field');
return;
}
// Get the email value
const email = emailEl.val();
// find the error element
const errorEl = $('form .error');
if (!errorEl) {
console.error('Could not find error message element');
return;
}
if (!email) {
// set the error message
errorEl.text('An email address is required');
errorEl.show();
} else {
errorEl.hide();
}
});
});
Приведенный выше код почти полностью сосредоточен на сантехнике 💦, и только несколько строк (проверка адреса электронной почты и отображение сообщения об ошибке) бизнес -логики.
Если мы изменим местоположение нашего элемента ошибки и выдвигаем его из формы, наш код перестает работать. Если мы изменим класс ( ошибка ) на нашем элементе ошибки, наш код перестает работать.
Да, есть лучшие практики, которые помогут избежать этих проблем, но факт остается фактом, что создание чего -либо в jQuery требует инженерной бдительности, тщательного принятия решений, небольшой работы, чтобы просто «зацепить» вещи 😕.
Это не приводит к тому, что разработчики идут рядом с Яма успеха Анкет
Так каковы наши альтернативы 🤔?
💻 Современная компонентная структура
Современные фреймворки JavaScript, такие как СВЕЛТА Реагировать , Vue и Угловой были разработаны, чтобы помочь нам решить проблему спагетти jQuery.
Эти рамки позаботятся обо всех сантехнике и предоставляют разработчикам API и шаблона, чтобы их бизнес -логика не была завалена на поиске элементов DOM, подключающуюся слушателей событий и явно обновляя пользовательский интерфейс.
Благодаря ответственности за сантехнику, эти рамки позволяют разработчикам выращивать свой код JavaScript как в размере, так и в сложности в сфере обслуживания, что приводит к читаемому коду 😀.
Та же функциональность, которую мы написали в jQuery, выглядели бы в Vuejs (включая шаблон HTML для рендеринга):
Обратите внимание, как здесь нет сантехники 🧐! Связь между HTML и нашим JavaScript – это декларатив Анкет Мы указываем, что хотим onsubmit Функция для обработки подчинения формы путем добавления @отправить = "onsubmit" Атрибут ( Директива ) к элемент.
Мы также получаем доступ к значению ввода электронной почты и сообщению об ошибке, используя v-model = "электронная почта" Синтаксис связывания и {{error}} Синтаксис интерполяции соответственно.
Это оставляет нас с некоторым HTML, улучшенным специальным синтаксисом, который, к счастью, не полагается на HTML id или класс Атрибуты и некоторая бизнес -логика (содержимое нашей функции onsubmit ).
Мы можем свободно перестраивать наш HTML, изменять стили и изменить нашу бизнес -логику – все независимо 👍🏽.
Я большой поклонник браузера на стороне HTML-карт на стороне HTML, подобных этим, но, к сожалению, они могут представлять другую проблему 🤔!
Прежде чем он начнет звучать так, как будто я консультирую не использовать какую -либо из приведенных выше средств, я хочу уточнить, что я регулярно использую Vue в своих приложениях Kentico Xperience, и эти сайты значительно выиграли от принятия нашей команды 💪 🏿.
Если вы хотите узнать больше, прочитайте мой пост Kentico 12: Паттерны дизайна, часть 16 – Интеграция VUE.JS с MVC
Эти структуры позволяют функциональности jQuery без необходимости писать сантехнический код, но, к сожалению, за счет потери контроля над рендерингом DOM.
В то время как jQuery можно использовать для создания новых элементов DOM, он чаще всего используется для изменения состояния элементов, уже на странице.
Современные фреймворки JavaScript, такие как Vue, с другой стороны, должны представлять весь свой DOM с нуля, когда они загружаются на странице 🤨.
Если бы мы посмотрели на отправку HTML с сервера для традиционного приложения для одной страницы (SPA), мы бы увидели что -то вроде этого:
Весь пользовательский интерфейс страницы создается рамками как детей Элемент, и это то, что подразумевается под фразой «рендеринг на стороне клиента».
Это означает, что сканеры поисковых систем должны были бы выполнить JavaScript, чтобы увидеть окончательный HTML и содержание страницы, и даже если поисковая система может запустить наш JavaScript, это может наказывать нас за то, что мы слишком долго, чтобы всего лишать всего ‘ ♀.
Это резко контрастирует с HTML-сервером, где данные, отправленные с сервера в браузер, будут включать все, что отображается для пользователя, поэтому нет никаких требований для выполнения JavaScript или задержек, чтобы увидеть, что он рендесирует на странице.
В идеале мы хотели бы библиотеку, которая существует где -то посередине между сантехникой, свободным от кодирования современных фреймворков JavaScript, и способность JQuery манипулировать и создавать DOM, не владея им … 😉
🏆 Alpinejs входит в чат
Alpinejs соответствует нашим требованиям исключительно и описывается как предлагая нам
Реактивная и декларативная природа больших рамок, таких как Vue или реагирование по гораздо более низкой цене.
и
Вы можете сохранить свой DOM и посыпать поведение, как вы считаете нужным.
Ну, это звучит великолепно 👏🏾. Итак, как мы его используем?
🗺 Наш пункт назначения: Использование AlpineJs
Давайте снова посмотрим на наш пример формы HTML, но на этот раз с Alpinejs!
Сначала нам нужно добавить <Скрипт> Элемент в документе :
Затем мы определяем CreateFormComponent () функция, где инициализируются состояние и методы нашего компонента:
Наконец, мы аннотируем наш HTML нашего сервера с некоторым альпийским специфическим синтаксисом:
Давайте посмотрим на каждую часть в деталях!
Сценарий AlpineJS работает как большинство библиотек JavaScript, которые мы загружаем в браузер без процесса сборки – как только скрипт выполняется, он ищет «альпийский» материал и инициализирует все, что он может найти на странице.
Это означает, что мы можем иметь страницу, полную существующего HTML, отображаемой на сервере, и альпийский может зацепить ее и включить все его мощные функции 😄!
Alpine будет искать код инициализации (определяемый x-data окно объект.
Говоря о функциях инициализации, давайте посмотрим на наши следующие:
Этот блок определяет Iife 🤓 (немедленно вызванное выражение функции), которая присваивает функцию ( createFormComponent ) для окно объект так, чтобы он был доступен для альпийских (функции и переменные, определенные в iife, не доступны вне него).
Функция, которую мы определили, CreateFormComponent , возвращает объект, который включает в себя «состояние» ( электронная почта и ошибка ) нашего компонента. Это значения, которые Alpine гарантирует, остаются в обновлении на основе взаимодействия с пользователями, а также обеспечивают привод к обновлению HTML при их изменении. Это та сантехника, которую мы хотим избежать, и, к счастью, Альпийс позаботится об этом для нас ».
Наша функция инициализации также определяет метод, onsubmit , это может быть вызвано, когда пользователь взаимодействует с компонентом определенным образом.
Обратите внимание, как это устанавливает значение this.error , который является Ошибка: '' значение в нашем состоянии компонента.
Он также имеет доступ к this.email что Электронная почта: '' значение в нашем состоянии компонента.
Теперь мы можем посмотреть на нашу улучшенную HTML -форму:
Alpine соединяет данные и интерактивность к нашему HTML с Директивы , Итак, давайте пройдемся через каждую директиву, которую мы используем, шаг за шагом Анкет
x-data = "createFormComponent ()" сообщает Alpine инициализировать это Элемент и все его детские элементы в компонент и установите состояние и методы, которые они могут получить к тому, что было возвращено CreateFormComponent () (В нашем случае это по электронной почте , Ошибка и onsubmit )
@Recoid.prevent = "onsubmit" Подключает наш компонент onsubmit () функционировать на отправить Событие формы (а также обеспечивает $ event.preventdefault () называется автоматически с помощью модификатора события
Убедитесь, что значение Всегда оставайся в курсе с нашими компонентами Электронная почта: '' значение с помощью X-Model = "Электронная почта" Синтаксис связывания. Если наш JavaScript изменится Эл. адрес , Элемент немедленно отразит это изменение – если пользователь вписывает новое значение в Наш JavaScript будет иметь доступ к этому новому значению.
Мы делаем что -то подобное с условно показывая это с x-show = "ошибка" который покажет элемент, когда наш компонент Ошибка: '' Ценность – это правда и скрыть ее, когда она фальсификация.
X-Text Директива устанавливает внутренний текст нашего каковому значению Ошибка является.
Обратите внимание, как ни один из наших HTML не связан с нашим JavaScript через HTML id или класс Значения атрибута, что означает, что это не хрупкое обновление дизайна или стилей 🧠.
Мы также не обязательно связывать взаимодействие с нашим HTML или значения нашего HTML. Вместо этого Alpine делает всю сантехнику для нас, и мы можем использовать наши навыки разработчика, чтобы сосредоточиться на бизнес -логике.
Вот живая демонстрация нашего решения Alpinejs:
Интеграция с Xperience
Если бы мы хотели заполнить сообщение об ошибке для нашей формы из Xperience, мы могли бы использовать Razor, чтобы установить значение, так как все на странице отображается на сервере:
const errorMessage = '@Model.FormErrorMessage';
window.createFormComponent = function () {
return {
email: '',
error: '',
onSubmit($event) {
this.error = !this.email
? errorMessage
: '';
},
};
};
Мы также можем сделать запросы в наш API ASP.NET CORE API, использовать ответ, чтобы установить наше сообщение об ошибке, и наша форма будет асинхронно подтверждена:
window.createFormComponent = function () {
return {
email: '',
error: '',
async onSubmit($event) {
const result = await fetch(
'/api/form',
{
method: 'POST',
body: JSON.stringify({ email: this.email })
})
.then(resp => resp.json());
this.error = result.errorMessage;
},
};
};
Или представьте себе сценарий, в котором у нас есть <Таблица> данных и мы хотим отфильтровать результаты на основе того, что пользователь вводит в :
@foreach (var row in Model.Rows) {
} @row.Title
В примере выше, все строки таблиц изначально отображаются (отлично подходит для SEO!) И отфильтрованы только тогда, когда пользователь начинает печатать в 🎉!
✈ направляюсь домой: Какой вариант лучший выбор?
Теперь, когда мы видели несколько различных вариантов улучшения нашего HTML с помощью JavaScript, какой из них имеет смысл для нашего варианта использования?
jQuery
- Если нам нужно только несколько строк кода
- Существующие плагины jQuery обрабатывают большую часть сложности
- Нет государственного управления в наших «компонентах»
Vue / Реагировать / СВЕЛТА / Угловой
- Сложное государственное управление
- Многие компоненты взаимодействуют вместе
- Рендеринг на стороне клиента в порядке (SEO не важно)
Alpinejs
- Более чем несколько строк кода, бизнес -логика
- SEO важен
- Пользовательский UX (не из плагина jQuery)
В WiredViews , мы использовали Alpinejs в нашем Кентико Xperience Проекты, наряду с Vuejs и jQuery.
Я рекомендую использовать правильный инструмент 👩🏼🔧 для правильной работы, и, к счастью, Alpinejs отлично подходит для современного веб -разработки и Kentico Xperience.
Как всегда, спасибо за чтение 🙏!
Рекомендации
Мы собрали список на Учетная запись Kentico Github ресурсов разработчика. Иди проверь!
Если вы ищете дополнительный контент Kentico, проверьте теги Kentico или Xperience здесь, на разработке.
#Kentico
#xperience
Или моя серия блогов Kentico Xperience, например:
- Kentico Xperience Patterns Design
- Эксперименты по виджетам Kentico Xperience MVC
- Кусочки Xperience
Оригинал: “https://dev.to/seangwright/kentico-xperience-xplorations-why-we-should-be-using-alpinejs-3fka”