Cleave.js предоставляет мощный инструмент для динамического форматирования пользовательского ввода. При рефакторинге существующего кода одной из ключевых задач является устранение дублирования и непоследовательного форматирования. Часто в проектах встречаются ручные обработки строк и чисел, которые можно заменить единым подходом через Cleave.js, что повышает читаемость и уменьшает вероятность ошибок.
Пример: раньше форматирование телефонного номера могло выглядеть как последовательность регулярных выражений и условных конструкций:
function formatPhoneNumber(value) {
value = value.replace(/\D/g, '');
if (value.length > 10) value = value.slice(0, 10);
return value.replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');
}
После рефакторинга с Cleave.js код становится компактным и декларативным:
const cleavePhone = new Cleave('.phone-input', {
phone: true,
phoneRegionCode: 'US'
});
Ключевой эффект — уменьшение количества ручного кода и интеграция с обработкой событий ввода без дополнительных проверок.
При работе с формами часто встречается ситуация, когда один и тот же тип данных (телефон, дата, кредитная карта) форматируется в нескольких местах по-разному. Рефакторинг предполагает создание централизованных конфигураций Cleave.js для повторного использования.
const formattingRules = {
phone: { phone: true, phoneRegionCode: 'US' },
date: { date: true, datePattern: ['Y', 'm', 'd'] },
creditCard: { creditCard: true }
};
function applyCleave(selector, type) {
return new Cleave(selector, formattingRules[type]);
}
Теперь добавление нового поля с определённым форматом сводится к
вызову applyCleave('.input', 'phone'), что значительно
упрощает поддержку и рефакторинг.
При рефакторинге важно сохранить поведение бизнес-логики. Cleave.js позволяет работать на уровне ввода без изменения структуры данных в приложении. Например, форматирование чисел с разделителями тысяч или ограничение длины ввода:
const cleaveNumber = new Cleave('.number-input', {
numeral: true,
numeralThousandsGroupStyle: 'thousand'
});
Существующий код, использующий parseInt или
Number, остаётся корректным, так как Cleave.js изменяет
только отображение в поле ввода, а значение можно получить через
cleaveNumber.getRawValue().
Использование Cleave.js уменьшает количество условных операторов, регулярных выражений и ручных манипуляций со строками. Это повышает читаемость, позволяет новым разработчикам быстрее понять структуру проекта и снижает вероятность регрессий.
Пример рефакторинга нескольких полей формы:
document.querySelectorAll('.form-input').forEach(input => {
const type = input.dataset.type; // 'phone', 'date', 'creditCard'
applyCleave(input, type);
});
Такой подход централизует применение правил и делает добавление новых типов ввода тривиальным.
Cleave.js поддерживает кастомные блоки и разделители, что позволяет легко интегрировать сложные форматы, например, серийные номера или внутренние коды продуктов:
const cleaveSerial = new Cleave('.serial-input', {
delimiters: ['-', '-', '-'],
blocks: [4, 4, 4],
uppercase: true
});
Рефакторинг старого кода, где подобное форматирование делалось через
цепочку substring и replace, приводит к
уменьшению кода и повышению гибкости.
После рефакторинга необходимо убедиться, что изменения не нарушают
существующий функционал. Cleave.js облегчает тестирование, так как
форматирование и логика ввода отделены от бизнес-логики. Использование
метода getRawValue() гарантирует, что внутренние данные
остаются в прежнем виде.
const rawValue = cleavePhone.getRawValue(); // возвращает номер без форматирования
Это позволяет постепенно интегрировать Cleave.js в крупные проекты без риска нарушить работу уже реализованных функций.
Использование Cleave.js при рефакторинге позволяет системно подходить к обработке ввода, улучшает структуру кода и ускоряет разработку новых форматов данных.