Перейти в репозиторий / Перейти в демо / Прочитать на Github
Иногда кажется, что мы ходим по кругу ...
Я отправился в путешествие, чтобы найти лучший инструмент для создания повторно используемых компонентов для веб-приложений.
Вначале я хотел бы поговорить об эффективности. Как инженеров, нас часто просят найти лучшее решение проблемы. В разработке программного обеспечения это обычно означает получение большей ценности от наших продуктов по самой низкой цене.
efficiency = value / cost
Когда мы разрабатываем новую функцию для веб-приложения, мы можем учитывать такие факторы, как.
| Values | Costs | | --------------|-------------------| | Accessibility | A lot to learn | | Performance | More to code | | Usability | Hard to debug | | Security | High maintenance | | Etc... | Etc... |
Это не должно отстой. Это кажется очевидным, но мы часто забываем, что значит быть инженером.
Подход
Давайте построим что-нибудь значимое. Задача состоит в том, чтобы создать приложение, которое может использовать несколько повторно используемых компонентов и представляет собой то, что мы обычно используем. Как формы и таблицы с данными.
Требования
Компонент формы
- Отображает 3 поля с настраиваемыми значениями.
- Имеет два действия для отображения данных и для изменения данных.
- Вызывает компонент таблицы и передает значения полей.
Компонент таблицы
- Принимает параметры из компонента формы.
- Вызывает внешний API для получения данных.
- Отображает полученные данные в табличной форме.
Компонент ячейки
- Вызывает внешний API для отображения текста.
- В качестве параметров использует атрибуты.
Поддержка всех современных браузеров и IE11 :)
Правила честной игры
Решение должно включать как минимум 2 файла app.js или app.html и index.html.
- Не минифицировано.
- Используйте аналогичную структуру HTML.
- Используйте похожие стили кодирования с комментариями.
Все решения включают общие файлы:
- common.js с конфигурациями, API и аналитикой.
- Минимизированный загрузочный CSS и style.css с базовыми стилями для метрик будут загружены позже и исключены из метрик.
Решение может использовать неограниченное количество внешних библиотек.
- Внешние библиотеки можно минимизировать.
- Не используйте CDN. Все файлы решений должны обслуживаться из одного места.
Избегайте оптимизации визуализации таблиц.
- Отображение ячеек строка за строкой, столбец за столбцом.
- Мы не хотим повторять тест JS framework
- И здесь мы всегда можем использовать аналогичные оптимизации для каждого решения.
Загляните на демонстрационную страницу с решениями и тестами.
Полученные результаты
Я тестировал нативный JS, JQuery, X-Tag, Polymer и bBlocks. Мои показатели включают критический путь рендеринга, скорость отображения и скорость изменения для 1500 элементов. Я могу выполнить столько итераций, сколько нужно. Результаты сохраняются в хранилище локали, и вы можете видеть средние значения для каждого решения. Таким образом, он становится очень гибким. И вы можете попробовать разные браузеры и режимы.
Chrome (режим без кеширования).
IE11 (режим без кеширования).
Хром (с кешем).
Chrome (без кеша, хороший режим троттлинга 3G).
Размер кода решения
Размер зависимостей (уменьшен)
Мнения
Прежде всего, я хотел бы сказать, как я благодарен создателям библиотек, которые мы каждый день используем в наших приложениях. Пионеры исследуют новые способы разработки для Интернета. Часто это требует дополнительных затрат. Но в то же время я считаю, что наши строительные блоки должны быть максимально эффективными.
Собственный Javascript
- Это может быть основой для сравнения других решений.
- Я не использовал никаких новых API-интерфейсов браузера, таких как Custom Elements.
- Я использовал наблюдатель мутаций для обнаружения изменений атрибутов компонента ячейки.
- Он показал лучшую производительность с 1 КБ дополнительных зависимостей.
- Спорно, это решение было не самым быстрым для меня в IE11: ¯ \ _ (ツ) _ / ¯.
- Как и ожидалось, собственный Javascript требует написания большего количества кода, что увеличивает затраты.
- Но это не увеличит кривую обучения.
jQuery
- Старый друг и сильный соперник.
- Самое медленное решение из-за накладных расходов при использовании методов jquery вместо собственных.
- Стабильная, простая в освоении, богатая экосистема.
- Последняя тонкая версия имеет относительно небольшой размер 68 КБ.
- Может быть победителем, если он уже является частью приложения. Что может быть верно для ~ 70% Интернета. Таким образом, это не требует дополнительных затрат.
Полимер
- Я использовал микропакет Polymer v1.
- По скорости он приближается к родному Javascript. Но тяжелее из-за полифиллов и размера библиотеки.
- Polymer предлагает использовать все новые API, такие как Custom Elements, HTML Imports, Shadow DOM, Templates. У каждого есть несколько предостережений.
- Это вносит некоторую двусмысленность при использовании многих нестабильных технологий. В конечном итоге вы платите более высокие затраты, тратя больше времени и включая более тяжелые полифиллы и библиотеки.
X-Tag
- Меньшая библиотека, построенная на основе Custom Elements API.
- Предоставляет помощники DOM и API для определения свойств и наблюдения за атрибутами. Как раз то, что нам нужно.
- Тяжелее, чем могло бы быть, в основном из-за лишних полифиллов.
- Показал лучшую производительность и меньший размер раствора по сравнению с Polymer.
bБлоки
- Можем ли мы сделать лучше? Я постарался создать наиболее эффективный.
- Легкий. Минимизировано только 4 КБ. Чрезвычайно модульный и гибкий. Всего 2 основных API для создания компонентов и функций, которые я могу поддерживать вечно.
- Я смог добиться лучших результатов с меньшим количеством кода и минимумом обучения.
- Для этого требуется всего несколько легких полифиллов для IE11 и лучший полифил Custom Elements. Только 14 КБ в зависимостях.
- Он не требует транспиляции и может работать с классами или прототипами.
- Я создал модуль с помощниками DOM. Пример того, как мы можем сделать наши решения компактными.
Согласен или не согласен, все мнения приветствуются! ✌️
Перейти в репозиторий / Перейти в демо / Прочитать на Github