Нужны ли нам все еще JavaScript-фреймворки?

Нужны ли нам все еще JavaScript-фреймворки?

От автора: как веб-разработчик, я стараюсь регулярно оценивать свой инструментарий и определять, могу ли я обойтись без того или иного инструмента. Недавно я исследовал, насколько легко разрабатывать сложные приложения без front-end фреймворка JavaScript.

Что такое JavaScript-фреймворк?

В общем, JavaScript-фреймворк — это инструмент, который вы можете использовать для разработки современных веб-приложений, особенно SPA.

В свое время веб-разработчики реализовали логику интерфейса, полагаясь в основном на vanilla JS и jQuery. Но по мере того, как приложения становились все более и более сложными, инструменты для решения этой проблемы стали развиваться.

Популярные на сегодняшний день фреймворки имеют несколько основных общих черт. Большинство интегрированных сред / библиотек, от Vue до React, предоставляют некоторую комбинацию следующего:

Синхронизация состояния и представления

Маршрутизация

Система шаблонов

Многоразовые компоненты

Фреймворки все еще необходимы?

Это зависит от. Многие утверждают, что front-end фреймворки не нужны и никогда не были нужны. Другие — что это очень полезные инструменты. Итак, вопрос в том, являются ли фреймворки jQuery сегодняшнего дня? Будут ли они решать важные проблемы?

Трудно сказать, но прогресс нативного JS, спецификации веб-компонентов и легко настраиваемые инструменты сборки сделали разработку SPA без фреймворка простой, как никогда ранее.

Чтобы изучить это глубже, я разработал одностраничное приложение, использующее только стандартный JavaScript, нативные веб-компоненты и Parcel. В процессе возникло несколько сложностей, которые подчеркивали сильные стороны JS.

В то же время, когда я преодолел эти препятствия, я был удивлен тем, насколько просто создать одностраничное приложение с использованием только vanilla JS.

Обзор

Приложение очень просто. Это приложение рецептов с основными возможностями CRUD. Пользователь может создавать, редактировать, удалять, добавлять в избранное и фильтровать список рецептов.

Главный экран

Экран создания рецепта

Компоненты

Создание веб-компонента также просто. Вы создаете класс, который расширяется HTMLElement (или HTMLParagraphElement и так далее), а затем используете этот класс для определения пользовательского элемента.

Вы также можете использовать хуки жизненного цикла, такие как connectedCallback, disconnectedCallback, attributeChangedCallback.

Компонент My Recipe Item для отображения рецептов в списке

Маршрутизация

Маршрутизация для приложения рецептов также довольно проста. Учитывая событие навигации, я установил для содержимого приложения соответствующий веб-компонент.

Первоначально я использовал npm-пакет под названием Vanilla JS Router. С помощью API истории браузера не так уж и сложно реализовать собственный контент менее чем в 100 строках кода! Примечание: я не реализую действительно сложную логику, такую как гард маршрута.

Я хочу сохранить размер этой статьи в разумных пределах. В последующих статьях я могу привести более подробные объяснения. Я реализовал несколько забавных функций, таких как бесконечная прокрутка, пользовательский перетаскиватель и многое другое!

Переосмысление

После создания приложения мне потребовалось некоторое время, чтобы подумать о плюсах и минусах всего процесса от начала до конца. Начну с плохих новостей.

Минусы

Спецификация все еще развивается

Спецификация веб-компонентов является и старой, и новой. Она используется уже намного дольше, чем я первоначально думал. Веб-компоненты были впервые представлены Алексом Расселом на конференции Fronteers 2011. Тем не менее, за последние год или два, их востребованность существенно возросла. Таким образом, в спецификации все еще много неразберихи. Например, импорт HTML является устаревшим, хотя большая часть документации / ресурсов по-прежнему ссылается на него.

Тестирование

Существует не так много выделенных ресурсов для тестирования нативных веб-компонентов. Есть несколько многообещающих инструментов, таких как skatejs ssr и web component tester от Polymer. Но эти инструменты на самом деле предназначены для использования с соответствующими библиотеками. Это создает некоторые трудности для их использования с нативными веб-компонентами.

Обнаружение изменений

Наличие базовой системы, автоматически поддерживающей синхронизацию представления с моделью данных, невероятно. Это то, что в первую очередь привлекает многих в Angular и других фреймворках.

Поддерживать синхронизацию состояния с представлением не так сложно в небольшом масштабе. Но все может очень быстро выйти из-под контроля, и вы обнаружите, что добавляете множество прослушивателей событий и селекторов запросов.

Shadow DOM

Я действительно в растерянности по поводу Shadow DOM. С одной стороны, мне нравится идея инкапсуляции. Это разумный шаблон проектирования, который делает каскад стилей более управляемым, упрощает задачи и так далее. Однако это также создает проблемы, когда вы хотите, чтобы определенные вещи проникали в эту инкапсуляцию (например, разделяемая таблица стилей), и о том, как лучше всего это сделать, ведутся постоянные споры.

Генерация структур DOM

Часть великолепия фреймворков / библиотек, таких как Angular и React, заключается в том, что они работают со своим DOMain. То есть они отлично справляются с эффективным рендерингом и рендерингом структур в DOM. Из блога Angular University: Angular не генерирует HTML, а затем передает его в браузер для анализа, вместо этого Angular генерирует структуры данных DOM напрямую!

Например, Angular, в отличие от jQuery, визуализирует структуры данных DOM напрямую. То есть, вместо того, чтобы передавать HTML в браузер, он должен быть проанализирован, а затем преобразован в структуры данных DOM. Это более эффективно, так как устраняет этот шаг анализа. Виртуальный DOM также весьма полезен, поскольку он позволяет вам не перерисовывать все каждый раз, когда вам нужно обновить представление.

Плюсы

С другой стороны, есть несколько неоспоримых преимуществ для разработки веб приложений таким образом:

Размер пакета

Конечный продукт может быть (с акцентом на может быть) намного меньше и компактнее, чем что-либо, разработанное с использованием современного фреймворка. Например, финальная сборка моего полнофункционального приложения с рецептами была меньше, чем половина сборки Angular.

Размер пакета Angular

Пакет приложения рецептов

Примечание. Это обновленные оптимизированные размеры пакетов.

Понимание

Если вы на самом деле разрабатывали только с помощью фреймворка и его интерфейса командной строки, это может быть отличным упражнением для создания веб-приложения без дополнительных инструментов. Как человеку, который хочет достичь определенного уровня мастерства (насколько это возможно) в веб-разработке, мне было важно получить больше практического опыта с инструментами сборки, API-интерфейсами браузера, шаблонами проектирования и т. д.

Производительность

То, что эти front-end фреймворки и библиотеки делают под капотом, удивительно. Однако это может стоить вам производительности; нет такого понятия, как бесплатный сыр. Существует множество потенциальных проблем производительности: масштабные повторные рендеринги, избыточные прослушиватели, глубокое сравнение объектов или ненужные и масштабные манипуляции с DOM. Вы можете избавиться от многих сложностей, реализуя все с нуля.

Похоже, что команды Angular и React знают об этих подводных камнях и предоставляют в качестве средства дальнейшей оптимизации производительности такие вещи, как переопределения методов shouldUpdate и onPush ChangeDetection.

Простота и управление кодом

Вы рискуете всякий раз, когда вводите сторонний код. Этот риск уменьшается с помощью проверенных и протестированных библиотек / фреймворков, но никогда не устраняется. Если вы пишите код самостоятельно или с вашей командой, вы можете уменьшить этот риск и поддерживать кодовую базу, которую вы знаете, как внутри, так и снаружи.

Примечания

У меня был отличный опыт работы с Parcel. Иногда он немного более ограничен, чем Webpack, когда пытается обойти определенные пограничные случаи, но я обнаружил, что утверждение ‘zero config’ по большей части справедливо.
Мне также ясно, что многие называют React «библиотекой», а Vue — «прогрессивным» фреймворком. Хотя я понимаю причины этого, я думаю, что React, Vue и Angular решают во многом те же проблемы. Таким образом, я рассматриваю их все вместе, как «фреймворки».

Почему бы не использовать Stencil or Polymer? Я хотел по возможности избегать использования пакетов, библиотек и фреймворков. И посмотреть, насколько стали хороши веб-стандарты, чтобы соответствовать современным потребностям разработкам (не учитывая инструментов сборки).

Я уверен, что есть много других способов разработки SPA или приложения в целом без фреймворка или библиотеки, я попробовал один способ, и хотел бы услышать о других от вас!

Подводя итоги

Отличная эвристика для решения использовать или не использовать фреймворк — это то, что я называю «переломным моментом». По мере роста вашего приложения наступает момент, когда вы в конечном итоге создаете свою собственную платформу для повторного использования функционала и структуры. Например, у вас есть куча форм, и вы хотите создать повторно используемую логику для реактивной проверки.

Если вы окажетесь на этом этапе, вам придется решить, стоит ли тратить время на создание систем, чтобы добиться того, чего вы можете быстро достичь с помощью фреймворка или библиотеки. У вас будут разные переломные моменты в зависимости от того, какие у вас временные или бюджетные ограничения, но фреймворки по-прежнему очень актуальны в определенных сценариях.

Тем не менее, с течением времени многое из того, что делают фреймворки, вероятно, станет легче реализовать с помощью небольших библиотек и / или собственного кода. Возьмите мой пост в качестве примера. В то же время, если большие фреймворки и библиотеки остаются универсальными, они могут изменяться, адаптироваться. В противном случае они могут закончить так же, как jQuery — по большей части инструмент из прошлого.

Заключение

В заключение, существуют многообещающие способы разработки сложных интерфейсных приложений без фреймворков. Тем не менее, спецификации для таких вещей, как веб-компоненты, все еще развиваются, и есть некоторые вещи, которые необходимо проработать. Фреймворки по-прежнему делают много удивительных вещей и могут сделать разработку намного более гладкой.

На данный момент, насколько я могу судить, плюсы использования фреймворка часто перевешивают минусы. Однако если фреймворки не начнут решать новые проблемы и не будут развиваться, они в конечном итоге исчезнут.

Автор: Luke Joliat

Источник: //medium.freecodecamp.org/

Редакция: Команда webformyself.

Метки:

Похожие статьи:

Комментарии Вконтакте: