Библиотека Choices.js
относится к категории lightweight UI-решений для улучшения стандартных
HTML-элементов <select> и <input>.
Основная задача библиотеки — предоставить расширенный пользовательский
интерфейс для выбора элементов, множественного выбора, тегов и поиска по
спискам без зависимости от крупных фреймворков.
На фоне альтернатив Choices.js выделяется несколькими особенностями:
Сравнение Choices.js с альтернативами важно из-за большого количества похожих библиотек, решающих одинаковые задачи разными способами.
Select2 исторически создавался как jQuery-плагин. Вся архитектура тесно связана с экосистемой jQuery.
Choices.js ориентирован на современный JavaScript без внешних зависимостей.
$('#country').select2();
const choices = new Choices('#country');
| Возможность | Choices.js | Select2 |
|---|---|---|
| Зависимость от jQuery | Нет | Да |
| Размер библиотеки | Меньше | Больше |
| Поддержка ES Modules | Да | Ограниченно |
| Vanilla JS | Полная поддержка | Нет |
| Современная архитектура | Да | Частично |
| Поддержка старых браузеров | Ограниченно | Лучше |
Choices.js обычно показывает лучшую производительность при:
Select2 может оказаться тяжелее из-за:
const choices = new Choices('#cities', {
searchEnabled: true,
shouldSort: false
});
$('#cities').select2({
minimumResultsForSearch: 10
});
При нескольких тысячах элементов Choices.js чаще работает быстрее при открытии dropdown и фильтрации.
Select2 имеет более зрелую встроенную систему AJAX.
$('#users').select2({
ajax: {
url: '/api/users',
dataType: 'json'
}
});
Choices.js требует ручной загрузки данных:
fetch('/api/users')
.then(response => response.json())
.then(data => {
choices.setChoices(data, 'id', 'name', true);
});
| Характеристика | Choices.js | Select2 |
|---|---|---|
| Встроенный AJAX | Нет | Да |
| Гибкость загрузки | Высокая | Средняя |
| Контроль fetch | Полный | Ограниченный |
| Интеграция с API | Современная | Legacy-oriented |
Choices.js предоставляет более простой подход к стилизации.
.choices__inner {
border-radius: 12px;
background: #f5f5f5;
}
Select2 использует более сложную структуру DOM.
Choices.js легче интегрируется в:
Tom Select является современным форком Selectize.js.
Архитектурно Tom Select ближе к Choices.js, чем Select2.
Обе библиотеки:
Choices.js обычно легче.
| Параметр | Choices.js | Tom Select |
|---|---|---|
| Размер ядра | Меньше | Больше |
| Количество плагинов | Небольшое | Большое |
| Сложность API | Ниже | Выше |
| Порог входа | Низкий | Средний |
Tom Select содержит более развитую plugin-систему.
Tom Select поддерживает большое количество встроенных расширений.
new TomSelect('#tags', {
plugins: ['remove_button']
});
Choices.js ориентирован на минимализм.
new Choices('#tags', {
removeItemButton: true
});
Tom Select часто лучше подходит для:
Choices.js эффективнее при:
Selectize.js долгое время считался популярным решением для tag input и autocomplete.
Однако у проекта возникали проблемы:
Choices.js создавался уже с учетом современных требований frontend-разработки.
| Возможность | Choices.js | Selectize.js |
|---|---|---|
| ES6 | Да | Частично |
| TypeScript | Лучше | Ограниченно |
| jQuery dependency | Нет | Да |
| Tree shaking | Возможен | Нет |
| Современная сборка | Да | Ограниченно |
Choices.js генерирует более предсказуемый DOM.
<div class="choices">
<div class="choices__inner">
...
</div>
</div>
У Selectize.js структура сложнее и менее последовательна.
Это влияет на:
Нативный <select> остается самым быстрым и
надежным решением.
Стандартный select плохо подходит для:
Choices.js становится предпочтительным при наличии:
Стандартный select предпочтителен:
React Select является популярным React-решением.
Choices.js:
React Select:
В React-приложениях Choices.js иногда создает проблемы:
React Select интегрируется естественнее.
<Select
options={options}
isMulti
/>
useEffect(() => {
new Choices(ref.current);
}, []);
React Select предлагает:
Choices.js проще, но менее интегрирован в React.
Во Vue и Angular часто используются специализированные компоненты.
Такие решения:
Choices.js остается внешней DOM-библиотекой.
Несмотря на наличие native-компонентов, Choices.js применяют:
Choices.js делает акцент на небольшом количестве методов.
choices.setChoices();
choices.setValue();
choices.clearChoices();
choices.removeActiveItems();
Некоторые конкуренты предоставляют значительно более сложный API.
$('#users').select2('destroy');
$('#users').val('1').trigger('change');
control.addOption(data);
control.refreshOptions();
control.sync();
Choices.js проще в изучении.
element.addEventListener('addItem', event => {
console.log(event.detail.value);
});
$('#users').on('select2:select', function (e) {
console.log(e.params.data);
});
Choices.js использует более современную модель событий браузера.
Choices.js поддерживает:
Однако native select обычно остается лучшим вариантом по accessibility.
Choices.js предоставляет:
Многие альтернативы реализуют аналогичные функции, но различаются деталями UX.
Современные версии имеют улучшенную поддержку TypeScript.
const choices = new Choices(element, {
searchEnabled: true
});
| Библиотека | TypeScript |
|---|---|
| Choices.js | Хорошо |
| Select2 | Слабо |
| Selectize.js | Ограниченно |
| Tom Select | Хорошо |
| React Select | Отлично |
Хорошо работает с:
import Choices fr om 'choices.js';
Select2 и Selectize.js менее удобны для современных bundler-сценариев.
Проблемы:
| Библиотека | Размер |
|---|---|
| Native select | 0 KB |
| Choices.js | Небольшой |
| Tom Select | Средний |
| Select2 | Крупный |
| React Select | Крупный |
Размер особенно важен:
Choices.js особенно эффективен в проектах:
Select2 подходит:
Tom Select предпочтителен:
React Select выбирают:
Нативный select остается лучшим вариантом: