03 / Пример с реальным пакетом / Чтение: 7 мин

slugify: почему в моём URL всё ещё есть «!»?

«Déjà Vu!» превращается в «deja-vu!», а вы хотели «deja-vu». Изучите пакет JavaScript с REA, найдите настройку пунктуации и проверьте результат.

На этой странице
slugify 1.6.6 / MITREA 6.4.0Проверено 12 октября 2026 г.

КРАТКИЙ ОТВЕТ

lower: true только переводит заглавные буквы в строчные. Добавьте strict: true , чтобы также убрать пунктуацию. Этот параметр нужно включить; это не ошибка библиотеки.

Рабочая конфигурация
slugify("Déjà Vu!", { lower: true, strict: true })
// → "deja-vu"

01. Какой URL мы хотели получить

slug — читаемая последняя часть URL, например deja-vu в example.com/posts/deja-vu. В этом примере используется настоящий выпуск slugify 1.6.6 из npm. Результаты ниже получены локальным запуском этого выпуска.

Попробуйте заголовок ниже. Затем включите удаление пунктуации , чтобы увидеть разницу.

Попробуйте настоящий пакет slugify 1.6.6
СФОРМИРОВАННЫЙ URL
example.com/posts/deja-vu!

Остался «!»? Включите удаление пунктуации.

Параметры JavaScript{ lower: true, strict: false }

Работает в вашем браузере. Ничего не отправляется на сервер. REA используется в письменном разборе.

То же сравнение на JavaScript:

Фактическое поведение пакета
slugify("Déjà Vu!")
// → "Deja-Vu!"

slugify("Déjà Vu!", { lower: true })
// → "deja-vu!"

Диакритический знак исчез, а восклицательный остался. Мы использовали REA, чтобы найти главный файл пакета, прочитать код фильтрации и проверить, какой параметр удаляет знак. Эти шаги можно повторить ниже.

02. Скачайте пакет и исследуйте его с REA

Мы скачали архив npm зафиксированной версии и распаковали его без установки или запуска пакета. Следующие подготовительные команды работают в оболочке с tar:

Терминал
mkdir rea-slugify-case
cd rea-slugify-case
npm pack [email protected]
tar -xzf slugify-1.6.6.tgz

Затем для распакованного каталога package мы запустили анализатор приложений JavaScript REA:

Если предпочитаете программирующего агента, замените путь и вставьте этот запрос:

Скопируйте в своего программирующего агента
Используй REA для анализа /absolute/path/to/rea-slugify-case/package. Я использую slugify для URL статей. Почему slugify('Déjà Vu!', { lower: true }) сохраняет восклицательный знак? Найди входной файл, покажи разрешающий этот знак код и определи параметр, который его удаляет. Не изменяй пакет.

Или соберите анализ прямо в терминале:

Терминал
npx -y [email protected] analyze-javascript-application ./package --json > analysis.json

REA определила пакет как slugify, версия 1.6.6, с точкой входа ./slugify.js. В отчёте отмечены три соответствующих файла и ноль ошибок разбора. Общий охват графа также помечен как частичный; мы сохранили эту оценку в опубликованном резюме.

Это дистрибутив JavaScript с читаемым кодом. REA предоставила список артефактов и контекст анализа; последующее изучение исходников и прямые проверки установили поведение. Декомпиляция нативного кода не применялась.

03. Найдите параметр, удаляющий пунктуацию

В поставляемом файле slugify.js строки 33–42 нормализуют строку, применяют замены локали или таблицы символов и фильтруют символы. Фильтр по умолчанию явно разрешает восклицательный знак.

slugify.js · строки 41–47
// remove not allowed characters
.replace(options.remove || /[^\w\s$*_+~.()'"!\-:@]+/g, '')
}, '');

if (options.strict) {
  slug = slug.replace(/[^A-Za-z0-9\s]/g, '');
}

Ветвь strict выполняется затем и удаляет всё, кроме букв, цифр и пробельных символов. Перевод в нижний регистр — отдельная операция в строках 57–58. Отсюда проверяемое предсказание:

Предсказание
slugify("Déjà Vu!", { lower: true, strict: true })
// should return "deja-vu"

Тот же файл объясняет, почему несколько пробелов превращаются в один разделитель, почему & превращается в and и почему немецкая локаль меняет Ä на AE.

04. Запустите проверки на настоящем пакете

Мы выполнили восемь проверок утверждений для неизменённого выпуска 1.6.6, включая исходный вопрос и несколько смежных особенностей поведения.

8 / 8
Проверки пройдены.

Исходный пакет · Node.js 22.23.1 · macOS arm64

ВводПараметрыНаблюдаемый результат
Déjà Vu!По умолчаниюDeja-Vu!
Déjà Vu!lowerdeja-vu!
Déjà Vu!lower + strictdeja-vu
hello world (с пробелами по краям)По умолчаниюhello-world
Rock & RollПо умолчаниюRock-and-Roll
ÄpfelНемецкая локаль + loweraepfel
Пустая строкаПо умолчаниюПустая строка
42 (число)По умолчаниюВыдаёт ошибку «string argument expected»

Прочитайте записанные результаты проверок или попробуйте интерактивную демонстрацию пакета выше. Она запускает ту же зафиксированную версию пакета в вашем браузере.

05. Что мы проверяли

Для этого выпуска и этих входных данных код согласуется с наблюдаемыми выходами. Если нужен deja-vu, используйте вместе lower: true и strict: true.

Границы проверки важны. Восемь проверок не охватывают все особенности Unicode и локалей. Граф REA частичен; отсутствие связи в нём не доказывает её отсутствия. Мы не воссоздавали нативный бинарный файл и не восстанавливали недоступный исходный код.

Поскольку поставляемый код читаем, обычное изучение исходников тоже подходит. Этот пример демонстрирует весь подход: определить артефакт, изучить одно правило, затем проверить вывод на исходной реализации.

06. Скачайте и запустите этот пример

Скачайте небольшой набор для воспроизведения. В него входят зафиксированная зависимость, все восемь проверок и шаги для сбора собственных данных REA.

Скачать набор для воспроизведения

Внутри распакованного набора
npm install --ignore-scripts
node verify.mjs

Средство проверки выводит каждый результат и завершает работу с ошибкой при неудаче. Node.js выполняет пакет npm только на этом этапе проверки; предшествующий статический анализ REA его не запускает.

Попробуйте другое руководствоНайдите, куда приложение сохраняет экспортированные файлы.

Данные: Резюме анализа REA · результаты проверок · изученный исходный код · лицензия MIT. Пакет создан simov и участниками проекта. Анализ и проверки выполнения проведены локально 12 октября 2026 г. Локальные пути файловой системы исключены из общедоступных резюме.

Впервые используете инструмент? Что такое REA? · Как мы проверяем руководства