Во фронтенде часто попадаются сложные формы. Создавая их, мы хотим, чтобы пользователю было удобно все заполнять. Числа нужно правильно форматировать, чтобы с первого взгляда было видно, что нет лишнего нолика. Когда вводишь номер кредитной карты, сверять его удобно блоками по 4 цифры, как он напечатан на пластике. Пользователь может вбивать номер телефона, дату рождения, номер паспорта и тому подобное — существует масса случаев, когда пользовательский ввод нужно форматировать на лету. Этим занимается маска.

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

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

Кто такой Maskito и зачем он вам

Maskito — это набор библиотек для маскирования ввода с акцентом как на пользовательском, так и на разработческом опыте. В нашей документации вы найдете множество примеров и подробное руководство по API. Раздел «Начало работы» объяснит основы и быстро познакомит вас с концепциями и вариантами использования.

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

Я знаю, что у нас уже есть здесь некоторая аудитория инженеров, которые ценят наш вклад в open source. Ниже я приведу аргументы, с которыми вы сможете прийти к менеджеру или тимлиду, когда встанет вопрос о выборе технологии для маски. Если вас интересует только технически полезный контент, вы можете прочитать другую статью от ведущего разработчика Maskito Никиты Барсукова, а эту пропустить.

Поддержка крупного бизнеса

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

У нашей команды есть ряд успешных проектов, таких как Taiga UI и Web APIs для Angular, к примеру. Мы относимся к ним очень серьезно, потому что это не пет-проекты или хобби (хотя мы любим их, как если бы так и было). Поэтому вы можете ожидать, что наша документация будет понятной, примеров будет много, а на ваши вопросы вы получите своевременные ответы в нашем телеграм-канале.

Независимость от фреймворка

Неважно, используете вы React, Vue или Angular для вашего продукта или полагаетесь на какой-либо другой фреймворк или даже на ванильный JavaScript, — Maskito вам подойдет. Наш основной пакет не имеет зависимостей и может использоваться в любом фронтенд-приложении. То же самое касается и масок, которые мы рассмотрим дальше.

У нас есть специальные пакеты для комфортного использования Maskito в React, Vue и Angular. Поскольку публичный API довольно лаконичен, будет легко расширить поддержку на другие популярные фреймворки. Фактическая конфигурация маскирования остается той же и может быть легко пошарена между различными проектами и архитектурами.

Независимость от среды

Maskito работает во всех современных браузерах независимо от среды, в которой вы его запускаете. Вы можете использовать Web Components с Shadow DOM или применять SSR для улучшения TTI и SEO — поля ввода не будут вызывать проблем, пытаясь получить доступ к window под nodejs или путаясь в инкапсулированном фокусе. 

Maskito также будет корректно работать на сенсорных устройствах и виртуальных клавиатурах как для полей ввода, так и для элементов textarea или даже contenteditable. Взаимодействие с буфером обмена, Undo/Redo, перетаскивание текста или автозаполнение браузера поддерживаются.

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

Качественный код

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

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

Не только мы

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

В своей уверенности мы не одни: Ionic, знаменитый кроссплатформенный UI-фреймворк, принял Maskito в качестве своей официальной библиотеки маскирования. Их команда провела исследование существующих альтернатив и рассматривала возможность разработки собственной маски. Они решили, что Maskito удовлетворит потребности их крайне разнообразной пользовательской базы и добавили примеры маскирования своих компонентов в документацию.

Сообщество Maskito продолжает расти, на GitHub уже больше 1300 звезд, и библиотеку можно встретить в зависимостях самых разных компаний — от АльфаБанка до турецкого Trandyol. Возможно, она станет решением и для вас.

Готово к использованию

Maskito поставляется с отдельным пакетом готовых к использованию масок. Мы поддерживаем огромную библиотеку компонентов, которая включает ввод чисел, кредитные карты, телефоны, даты и так далее. Она используется в десятках приложений в нашей экосистеме, где требуется дополнительное маскирование для почтовых индексов, IP-адресов, серийных номеров и так далее. Как только эти маски реализованы и должным образом протестированы, все общие решения попадают в @maskito/kit.

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

Благодаря хорошей обособленности Maskito будет таким маленьким или таким обширным, как вам нужно. Основной пакет весит всего около 3 КБ в сжатом виде, а неиспользованные пресеты отбросит tree-shaking, так что размер вашего бандла в надежных руках.

Резюме

Maskito бесплатный как для личного, так и для коммерческого использования и выпущен под лицензией Apache 2.0. Я горжусь тем результатом, которого мы достигли, и верю, что это лучшее решение для данной задачи, которое будет продолжать развиваться и становиться лучше. 

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

Комментарии (5)


  1. xztv
    15.10.2024 11:30

    Хотелось бы в документации Тайги видеть побольше примеров использования масок Москито, а то самый развернутый пример находится только в компоненте Input (legacy).

    Либо это уже я невнимательно искал.


    1. Waterplea Автор
      15.10.2024 11:30

      Когда всё перепишем на новые текстфилды – будет побольше, наверное. Но там будет всё ровно как с нативным инпутом:

      <tui-textfield>
        <input tuiTextfield [maskito]="mask" />
      </tui-textfield>
      


  1. Metotron0
    15.10.2024 11:30

    Сходил посмотреть https://taiga-ui.dev/components/chip, там в блоке с интерактивными примерами надписи Checkbox 1, Checkbox 2 не кликабельные, если кликать прямо по тексту. А если попасть рядом, но внутри рамки, то чекбокс переключается. Это так и было задумано?


    1. Waterplea Автор
      15.10.2024 11:30

      Это ты набрёл на косяк документации, который вчера зарепортили, а сегодня кто-то из сообщества уже любезно его поправил. Спасибо open source :)


      1. Metotron0
        15.10.2024 11:30

        Угораздило же попасть именно на него.