Создание новых элементов
У функции $ есть также последняя роль: создание новых элементов. Если в $() передаётся фрагмент HTML, то это создаст новый элемент в памяти — иными словами, элемент будет создан, но не добавлен на страницу, пока вы этого не сделаете.
Вы также можете создать элемент, передавая объект с информацией о его создании:
Обратите внимание, что мы должны указать свойство class в кавычках, поскольку class это в JavaScript и написание без кавычек вызовет ошибки в некоторых браузерах. Смотрите для получения подробной информации о разных свойствах, которые можно включать в объект
Мы рассмотрим как добавлять созданные элементы на страницу в следующем разделе, в котором рассказывается о передвижении по документу и манипуляции c ним.
Инструменты: тестирование
Тестирование — это процесс проверки и валидации того, что приложение соответствует ожидаемым бизнес и техническим требованиям. Подход, основанный на тестах, также помогает обнаруживать ошибки и, следовательно, его следует рассматривать как неотъемлемую часть современного процесса разработки.
Jest
Jest — это относительно новый фреймворк для тестирования, созданный в Facebook и хорошо принятый сообществом React. Существует распространенное заблуждение, что Jest специально разработан для работы с React; однако, согласно документации Jest:
Самое большое преимущество использования Jest над другими наборами тестов заключается в том, что вам требуется нулевая или минимальная конфигурация для того чтобы начать писать тесты. Фреймворк имеет встроенную библиотеку утверждений и поддерживает использование мок функций или шпионов.
Jest имеет функцию под названием snapshot testing, которая позволяет гарантировать, что пользовательский интерфейс приложения неожиданно не изменится. Разработчики в Facebook и другие участники недавно вложили много работы в этот проект, поэтому не удивительно, что Jest окажется самой популярной тестовой платформой для JavaScript в ближайшие годы.
Mocha
Mocha — это фреймворк для тестирования JavaScript, который предоставляет поддержку браузера, асинхронные вызовы, включая обещания, отчеты о тестовом покрытии и JavaScript API для запуска тестов. Mocha часто используется с библиотекой утверждений, такой как Chai, should.js, expect.js или better-assert, потому что у нее нет собственной библиотеки утверждений.
Jasmine
Jasmine — это фреймворк для тестирования JavaScript, ориентированный на поведение. Jasmine стремится стать браузером, платформой и независимым от платформы набором тестов. У Jasmine есть своя собственная библиотека утверждений, называемая matchers, которая дает ему чистый и легко читаемый синтаксис. Jasmine не имеет встроенной команды для выполнения тестов, и вам, возможно, придется использовать какую-нибудь общую, например, Karma.
И другие…
Плагин для плавных трансформаций и переходов. Вместо работы с таймерами, плагин использует CSS3 трансформации.
Noty — это jQuery плагин, с помощью которого без особых проблем и сложностей можно легко на своем сайте или блоге создать уведомления типа: information, error, alert, success, warning, или просто заменить стандартные уведомления на сайте, при регистрации например. Абсолютно каждое уведомление можно настроить, чтобы оно выводилось поочередно.
JQuery-плагин позволяет легко помещать маркеры на карте сайта с помощью Google Map API V3.
Плагин, который позволяет легко добавлять интерактивные карты на вашем сайте. Вы получите мощную API карту, настраиваемые маркеры и обработчик-событий.
Jплагин, который использует Scalable Vector Graphics (SVG) для рендера векторных карт. Онработает во всех браузерах, поддержка в старых версиях IE 6-8 осуществляется через VML.
Простой в использовании JQuery плагин для социальных виджетов сетей. В настоящее время он поддерживает Facebook, Twitter и Google+.
Tooltipster представляет собой легкий и простой в стиле JQuery плагин, который поможет вам легко создавать всплывающие подсказки.
BigVideo.js — jQuery плагин, который упрощает адаптирование фонового видео на веб-страницу. Вы можете использовать одно или несколько видео или использовать плагин в качестве проигрывателя, с отображением плей-листа.
С помощью плагина calendario вы сможете для своего сайта организовать замечательный календарь, в котором будут отмечаться все вам важные материалы и праздники, которые можно с легкостью задать самостоятельно.
Автор — Speckyboy Editors
Перевод — Дежурка.
Вас также могут заинтересовать:
jQuery Core — All 1.x Versions
- jQuery Core 1.12.4 — uncompressed, minified
- jQuery Core 1.12.3 — uncompressed, minified
- jQuery Core 1.12.2 — uncompressed, minified
- jQuery Core 1.12.1 — uncompressed, minified
- jQuery Core 1.12.0 — uncompressed, minified
- jQuery Core 1.11.3 — uncompressed, minified
- jQuery Core 1.11.2 — uncompressed, minified
- jQuery Core 1.11.1 — uncompressed, minified
- jQuery Core 1.11.0 — uncompressed, minified
- jQuery Core 1.10.2 — uncompressed, minified
- jQuery Core 1.10.1 — uncompressed, minified
- jQuery Core 1.10.0 — uncompressed, minified
- jQuery Core 1.9.1 — uncompressed, minified
- jQuery Core 1.9.0 — uncompressed, minified
- jQuery Core 1.8.3 — uncompressed, minified
- jQuery Core 1.8.2 — uncompressed, minified
- jQuery Core 1.8.1 — uncompressed, minified
- jQuery Core 1.8.0 — uncompressed, minified
- jQuery Core 1.7.2 — uncompressed, minified
- jQuery Core 1.7.1 — uncompressed, minified
- jQuery Core 1.7.0 — uncompressed, minified
- jQuery Core 1.7.0 — uncompressed, minified
- jQuery Core 1.6.4 — uncompressed, minified
- jQuery Core 1.6.3 — uncompressed, minified
- jQuery Core 1.6.2 — uncompressed, minified
- jQuery Core 1.6.1 — uncompressed, minified
- jQuery Core 1.6.0 — uncompressed, minified
- jQuery Core 1.5.2 — uncompressed, minified
- jQuery Core 1.5.1 — uncompressed, minified
- jQuery Core 1.5.0 — uncompressed, minified
- jQuery Core 1.4.4 — uncompressed, minified
- jQuery Core 1.4.3 — uncompressed, minified
- jQuery Core 1.4.2 — uncompressed, minified
- jQuery Core 1.4.1 — uncompressed, minified
- jQuery Core 1.4.0 — uncompressed, minified
- jQuery Core 1.3.2 — uncompressed, minified, packed
- jQuery Core 1.3.1 — uncompressed, minified, packed
- jQuery Core 1.3.0 — uncompressed, minified, packed
- jQuery Core 1.2.6 — uncompressed, minified, packed
- jQuery Core 1.2.5 — uncompressed, minified, packed
- jQuery Core 1.2.4 — uncompressed, minified, packed
- jQuery Core 1.2.3 — uncompressed, minified, packed
- jQuery Core 1.2.2 — uncompressed, minified, packed
- jQuery Core 1.2.1 — uncompressed, minified, packed
- jQuery Core 1.2.0 — uncompressed, minified, packed
- jQuery Core 1.1.4 — uncompressed, packed
- jQuery Core 1.1.3 — uncompressed, packed
- jQuery Core 1.1.2 — uncompressed, packed
- jQuery Core 1.1.1 — uncompressed, packed
- jQuery Core 1.1.0 — uncompressed, packed
- jQuery Core 1.0.4 — uncompressed, packed
- jQuery Core 1.0.3 — uncompressed, packed
- jQuery Core 1.0.2 — uncompressed, packed
- jQuery Core 1.0.1 — uncompressed, packed
- jQuery Core 1.0.0 — uncompressed, packed
jQuery Core — All 3.x Versions
- jQuery Core 3.6.0 — uncompressed, minified, slim, slim minified
- jQuery Core 3.5.1 — uncompressed, minified, slim, slim minified
- jQuery Core 3.5.0 — uncompressed, minified, slim, slim minified
- jQuery Core 3.4.1 — uncompressed, minified, slim, slim minified
- jQuery Core 3.4.0 — uncompressed, minified, slim, slim minified
- jQuery Core 3.3.1 — uncompressed, minified, slim, slim minified
- jQuery Core 3.3.0 — uncompressed, minified, slim, slim minified
- jQuery Core 3.2.1 — uncompressed, minified, slim, slim minified
- jQuery Core 3.2.0 — uncompressed, minified, slim, slim minified
- jQuery Core 3.1.1 — uncompressed, minified, slim, slim minified
- jQuery Core 3.1.0 — uncompressed, minified, slim, slim minified
- jQuery Core 3.0.0 — uncompressed, minified, slim, slim minified
Как использовать jQuery на странице
Использование jQuery рассмотрим на простом HTML5 документе. Для этого мы его создадим, подключим к нему эту библиотеку с помощью Google CDN, и произведём с помощью неё ряд изменений на странице. А именно, изменим цвет фона на , выровняем по центру и добавим в конец страницы элемент с контентом «Я люблю jQuery».
<!doctype html> <html lang="ru"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Страница, к которой подключен jQuery</title> <script defer src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> </head> <body> <h1>Моя страница, к которой подключён jQuery</h1> <script> document.addEventListener('DOMContentLoaded', function () { /* код на jQuery */ // установим body фон #eee $('body').css('background-color', '#eee'); // выровняем h1 по центру $('h1').css('text-align', 'center'); // добавим в конец страницы элемент div с контентом "Я люблю jQuery" $('body').append('<div style="text-align: center; font-size: 20px;">Я люблю jQuery</div>'); }); </script> </body> </html>
Синтаксис jQuery начинается с функции или с более короткого и красивого псевдонима — знака (как в этом примере).
Что делать при конфликте jQuery с другой библиотекой
Но что делать если знак у вас занят и используется другой библиотекой?
В этом случае, чтобы избежать конфликтов можно воспользоваться одним из следующих 3 способов.
1 способ: обращение к jQuery по её полному имени.
// вызываем метод noConflict jQuery.noConflict(); // обращаемся к jQuery по её полному имени jQuery('body').css('background-color', '#eee'); // ...
2 способ: обращение к jQuery по другому псевдониму, например .
// установка $j в качестве псевдонима функции jQuery var $j = jQuery.noConflict(); $j('body').css('background-color', '#eee'); // ...
3 способ: обращение к jQuery по .
Специализированные площадки: 7 сайтов
Помимо этого, существует немало специализированных площадок с полными текстами статей в открытом доступе:
- PubMed – большинство работ по биологии и медицине, бесплатный доступ к полным текстам частично;
- Jstor – крупная база с английскими статьями, журналами, научными трудами по разным направлениям;
- MedLine – самая большая платформа по поиску материалов на медицинские темы;
- Psyjournals – сайт содержит электронные версии популярных журналов по психологии и педагогике;
- SciFinder – самый полный и достоверный ресурс, содержащий публикации по химии, биологии и биомедицине, инженерии;
- Frontiers – сборники статей с подборками на любые темы;
- Scientific Commons – информационный портал из различных областей знаний на английском и немецком языках.
Essential Git
As the source code is handled by the Git version control system, it’s useful to know some features used.
Cleaning
If you want to purge your working directory back to the status of upstream, the following commands can be used (remember everything you’ve worked on is gone after these):
git reset --hard upstream/main git clean -fdx
Rebasing
For feature/topic branches, you should always use the flag to , or if you are usually handling many temporary «to be in a github pull request» branches, run the following to automate this:
git config branch.autosetuprebase local
(see for more information)
Handling merge conflicts
If you’re getting merge conflicts when merging, instead of editing the conflicted files manually, you can use the feature
. Even though the default tool looks awful/old, it’s rather useful.
The following are some commands that can be used there:
- — automerge as much as possible
- — jump to next merge conflict
- — change the order of the conflicted lines
- — undo a merge
- — mark a block to be the winner
- — mark a line to be the winner
- — save
- — quit
Как проверить подключен ли jQuery на странице?
Добавьте следующий код перед закрывающим тегом :
<script> $(document).ready(function(){ alert('Библиотека подключена и работает!'); }); </script>
Если библиотека подключена и работает, то скрипт вызовет всплывающее окно при открытии страницы.
Обратите внимание, что вызовы функций jQuery должны находится после подключения самой библиотеки. Если код подключения библиотеки будет находится после вызова, то ваша функция не сработает и скорее всего вызовет ошибку
Полный код примера:
<!doctype html> <html> <head> <title>jQuery</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> </head> <body> <h1>Подключение jQuery</h1> <script> $(document).ready(function(){ alert('Библиотека подключена и работает!'); }); </script> </body> </html>
Сохраните этот код в файл .html и запустите его. Вы увидите вот такое всплывающее окно:
Всплывающее окно на jQuery
Описание и возможности
Потребность в подобном дополнении у разработчиков появляется при воплощении в жизнь крайне сложных проектов. С помощью jQuery существенно упрощается поиск элементов, расположенных в разных разделах и категориях программного кода. Через фреймворк можно получить доступ к элементам страницы, манипулировать ими, классами, атрибутами и так далее.
Несмотря на то, что данная библиотека используется для решения многих задач, создатели не стали перегружать и усложнять ее лишним кодом. Средство реализовано в виде универсального ядра из библиотеки и сопутствующих плагинов. Подключается к веб-странице в качестве внешнего файла JavaScript. Рассмотрим основные возможности последней версии фреймворка:
- взаимодействие с кросс-браузерными CSS-селекторами Sizzle;
- переход по древу DOM с помощью команд;
- управление событиями, визуальными эффектами;
- работа с дополнениями AJAX и другими плагинами для JavaScript.
Используйте самую свежую версию jQuery.
Использование инновации, которые появляются в проекте jQuery, является одним из самых простых способов улучшить производительность вашего сайта. Каждая новая версия библиотеки содержит новые оптимизации кода и исправления ошибок. Весь процесс улучшения сводится к элементарной замене содержания тега .
Вы можете получать библиотеку jQuery напрямую с сервера Google, который организует бесплатное хранилище CDN для различных библиотек JavaScript.
<!-- Включаем определенную версию jQuery --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> <!-- Включаем самую свежую версию jQuery из ветки 1.6 --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>
Последний пример будет включать самую свежую версию jQuery 1.6.x автоматически, но учтите, что она кэшируется только на один час.
Устанавливайте глобальные функции и значения для AJAX по умолчанию.
При работе с запросами AJAX в вашем приложении часто требуется выводить индикацию о прогрессе процесса. Обычно отображается анимация загрузки или затемняющий слой. Управление индикатором в каждом или может быстро утомить.
Лучшим решением будет установить набор глобальных значений и функций AJAX по умолчанию с использованием методов jQuery.
// ajaxSetup удобна для установки глобальных значений по умолчанию: $.ajaxSetup({ url : '/ajax/', dataType : 'json' }); $.ajaxStart(function(){ showIndicator(); disableButtons(); }); $.ajaxComplete(function(){ hideIndicator(); enableButtons(); }); /* // Дополнительные методы, которые также можно использовать: $.ajaxStop(); $.ajaxError(); $.ajaxSuccess(); $.ajaxSend(); */
Делайте селекторы проще.
До недавнего времени получение элементов DOM в jQuery было достаточно сложным процессом, связанным с разбором строки селектора, циклом JavaScript и встроенными функциями API (такими как , и ). Но теперь все браузеры поддерживают функцию , которая воспринимает селекторы CSS, что существенно улучшает производительность.
Однако следует оптимизировать процесс получения элементов. Много пользователей продолжают использовать старые версии браузеров, которые вынуждают jQuery погружаться в разбор дерева DOM, что является медленным процессом.
$('li a') // Отлично, но медленно $('li.selected a') // Лучше $('#elem') // Самый лучший вариант
Выбор по id — самый быстрый вариант. Если вам нужно выбрать класс, предварите его имя тегом – . Такая оптимизация существенно влияет на процессы в старых браузерах и мобильных устройствах.
Доступ к DOM всегда будет самой медленной частью любого приложения JavaScript, поэтому минимизация в данном процессе необходима. Одним из способов оптимизировать процесс является кэширование результатов, которые выдает jQuery. Используйте переменные, которые будут содержать объект jQuery, чтобы использовать их в коде скрипта.
var buttons = $('#navigation a.button'); // Некоторые предпочитают использовать префикс $ в именах переменных jQuery: var $buttons = $('#navigation a.button');
Еще один момент, о котором следует помнить, заключается в том, что jQuery предоставляет вам большой набор дополнительных селекторов (таких как , , ), которые не являются селекторами CSS. В результате, если вы используете их, то библиотека не задействует функцию . Чтобы оптимизировать процесс следует сначала выбрать элементы, а затем фильтровать их:
$('a.button:animated'); // Не используется querySelectorAll() $('a.button').filter(':animated'); // В данном варианте используется querySelectorAll()
Результат выполнения выше приведенного примера одинаков, но второй вариант выдает результат быстрее.
Локальное хранилище и jQuery
Локальное хранилище чрезвычайно просто использовать для хранения информации на стороне клиента. Добавьте ваши данные к глобальному объекту :
localStorage.someData = "This is going to be saved across page refreshes and browser restarts";
Плохая новость заключается в том, что локальное хранилище не поддерживается в старых браузерах. Можно использовать один из плагинов jQuery, которые обеспечивают альтернативу, если недоступен. Таким образом, хранилище данных на стороне клиента всегда будет работать.
Пример использования плагина jQuery $.jStorage:
// Проверяем наличие "key" в хранилище var value = $.jStorage.get("key"); if(!value){ // Если нет - загружаем данные с сервера value = load_data_from_server(); // и сохраняем их $.jStorage.set("key",value); } // Используем значение
Что такое jQuery и её поддержка браузерами
jQuery — это быстрая, лёгкая и многофункциональная JavaScript библиотека, основанная на принципе «пиши меньше, делай больше».
Её создал Джон Резиг в начале 2006 года. В настоящее время jQuery разрабатывается и поддерживается распределенной группой разработчиков как проект с открытым исходным кодом.
Сейчас последней версией jQuery является 3.5.1. Она поддерживается во всех основных браузерах: Chrome, Firefox, Safari, Edge, Opera и Internet Explorer 9+.
Преимущества и недостатки jQuery
Преимущества, которые даёт нам библиотеки jQuery при её использовании для написания клиентских сценариев:
- компактность кода. Позволяет писать код более компактно чем на чистом javaScript, т.е. за гораздо меньшее количество строк кода.
- простой и понятный синтаксис. Значительно упрощает написание многих вещей, например, таких как манипулирование DOM элементами, обработку событий, добавление эффектов анимации на страницу, AJAX запросов и т.д.
- кроссбраузерность. Код написанный на jQuery будет гарантированно работать во всех основных браузерах. В то время как код, написанный на чистом JavaScript надо будет однозначно проверять во всех браузерах. Т.к. некоторые фрагменты кода могут не поддерживаться и их реализацию для этих браузеров нужно будет выполнять как-то по-другому, или например, использовать полифиллы.
- открытый код. Библиотека jQuery является полностью бесплатной как для личных, так и для коммерческих проектов.
Кроме преимуществ, приведённых выше, у библиотеки jQuery имеются конечно и недостатки.
К недостаткам jQuery можно отнести то, что она может немного увеличивать скорость загрузки веб-страницы (её сжатый размер составляет около 30КБ), а также немного снижать производительность выполнения кода, чем если он был бы написан на чистом JavaScript.
Статистика использования jQuery
Если перейти к статистике, то многие крупные компании, используют jQuery в своих приложениях и сайтах. При этом растущий тренд продолжается, несмотря на очень горячие дискуссии в ИТ сообществах на тему: «Стоит ли использовать jQuery или нет в 2021 году?»
Статистика использования jQuery 10k крупнейшими сайтами:
Преимущества jQuery
Легко учиться: jQuery легко научиться, потому что он поддерживает то же самое кодирование в стиле JavaScript.
Пишите меньше, делайте больше: jQuery предоставляет богатый набор функций, которые повышают производительность разработчиков за счет написания меньшего количества удобочитаемого кода.
Отличная документация по API: jQuery предоставляет отличную онлайн-документацию по API.
Кросс-браузерная поддержка: jQuery обеспечивает отличную кросс-браузерную поддержку без написания дополнительного кода.
Ненавязчивый: jQuery является ненавязчивым, что позволяет разделить проблемы путем разделения HTML и jQuery кода.
$.proxy()
Одним из недостатков использования возвратных функций в jQuery является то, что при их выполнении методами библиотеки контекст устанавливается для другого элемента. Например, если у вас есть разметка:
<div id="panel" style="display:none"> <button>Закрыть</button> </div>
Нужно скрывать панель при нажатии кнопки. Пробуем сделать код:
$('#panel').fadeIn(function(){ // this указывает на #panel $('#panel button').click(function(){ // this указывает на button $(this).fadeOut(); }); });
В результате имеем проблему — исчезает кнопка, а не панель. С помощью можно сделать так:
$('#panel').fadeIn(function(){ // Используем $.proxy чтобы привязать this: $('#panel button').click($.proxy(function(){ // this указывает на #panel $(this).fadeOut(); },this)); });
Теперь все выполняется так, как нужно. Функция получает два аргумента – оригинальную функцию и контекст. Она возвращает новую функцию, в которой значение this соответствует контексту.
Пример табов, в котором запоминается активная вкладка после перезагрузки страницы (с помощью cookie)
Пример табов, в котором запоминается активная вкладка после перезагрузки страницы (с помощью cookie). HTML и CSS остается тот же, меняется только скрипт.
$(function() { function createCookie(name,value,days) { if (days) { var date = new Date(); date.setTime(date.getTime()+(days*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); } else var expires = ""; document.cookie = name+"="+value+expires+"; path=/"; } function readCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } function eraseCookie(name) { createCookie(name,"",-1); } $('ul.tabs__caption').each(function(i) { var cookie = readCookie('tabCookie' + i); if (cookie) { $(this).find('li').removeClass('active').eq(cookie).addClass('active') .closest('div.tabs').find('div.tabs__content').removeClass('active').eq(cookie).addClass('active'); } }); $('ul.tabs__caption').on('click', 'li:not(.active)', function() { $(this) .addClass('active').siblings().removeClass('active') .closest('div.tabs').find('div.tabs__content').removeClass('active').eq($(this).index()).addClass('active'); var ulIndex = $('ul.tabs__caption').index($(this).parents('ul.tabs__caption')); eraseCookie('tabCookie' + ulIndex); createCookie('tabCookie' + ulIndex, $(this).index(), 365); }); }); })(jQuery);
MyBook
MyBook — это тоже проект «ЛитРес», но с другими принципами предоставления доступа к книгам. Если в «ЛитРес» вы покупаете каждую книгу по отдельности, то в MyBook вам предлагается оплатить единую подписку, куда будут включены все, как электронные, так и аудиокниги сервиса.
В MyBook можно читать книги онлайн, часть из них — бесплатно
Да, приложение, прежде всего, рассчитано на продажу подписки, однако и в бесплатном доступе представлено порядка 50 000 электронных книг, где можно найти зарубежную литературу, справочники и, конечно, классические произведения. Здесь есть Куприн, Омар Хайям, Карл Маркс, Зигмунд Фрейд, Стивен Кинг и Дина Рубина.
Для работы с сервисом регистрация не обязательна, однако она потребуется, если вы решите не ограничивать себя бесплатными книгами. Пользоваться услугами сервиса можно при помощи одноименного сайта или же просто скачав мобильное приложение для iOS либо Android. Скачивать контент система не дает.
DevExtreme
Мы не включили Angular, React и Vue в список, но будет несколько решений, которые хорошо интегрируются с этими популярными JavaScript-фреймворками. DevExtreme предлагает полный набор мощных компонентов в дополнение к Большой тройке.
Платформа поддерживает устройства с сенсорным экраном и настольные компьютеры. Компоненты включают DataGrid, PivotGrid, TreeList, Charts, Form, Maps и другие. В целом, в фреймворке имеется более 50 интуитивно понятных и простых в использовании инструментов. Встроенный конструктор тем Theme Builder позволяет разработчикам изменять имеющиеся темы и создавать собственные.
Блог не очень активен, но время от времени появляются интересные статьи. Демо, техническая поддержка и пробный период облегчают изучение продукта.
Плюсы:
- интеграция с React, Angular, Vue;
- широкий выбор компонентов;
- открытый исходный код.
Минусы:
- большой размер;
- неактивный блог.