03 / Пример с реальным пакетом / Чтение: 7 мин
slugify: почему в моём URL всё ещё есть «!»?
«Déjà Vu!» превращается в «deja-vu!», а вы хотели «deja-vu». Изучите пакет JavaScript с REA, найдите настройку пунктуации и проверьте результат.
На этой странице
КРАТКИЙ ОТВЕТ
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. Результаты ниже получены локальным запуском этого выпуска.
Попробуйте заголовок ниже. Затем включите удаление пунктуации , чтобы увидеть разницу.
Остался «!»? Включите удаление пунктуации.
{ 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 slugify@1.6.6
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 rea-agents@6.4.0 analyze-javascript-application ./package --json > analysis.jsonREA определила пакет как slugify, версия 1.6.6, с точкой входа ./slugify.js. В отчёте отмечены три соответствующих файла и ноль ошибок разбора. Общий охват графа также помечен как частичный; мы сохранили эту оценку в опубликованном резюме.
Это дистрибутив JavaScript с читаемым кодом. REA предоставила список артефактов и контекст анализа; последующее изучение исходников и прямые проверки установили поведение. Декомпиляция нативного кода не применялась.
03. Найдите параметр, удаляющий пунктуацию
В поставляемом файле slugify.js строки 33–42 нормализуют строку, применяют замены локали или таблицы символов и фильтруют символы. Фильтр по умолчанию явно разрешает восклицательный знак.
// 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, включая исходный вопрос и несколько смежных особенностей поведения.
Исходный пакет · Node.js 22.23.1 · macOS arm64
| Ввод | Параметры | Наблюдаемый результат |
|---|---|---|
| Déjà Vu! | По умолчанию | Deja-Vu! |
| Déjà Vu! | lower | deja-vu! |
| Déjà Vu! | lower + strict | deja-vu |
| hello world (с пробелами по краям) | По умолчанию | hello-world |
| Rock & Roll | По умолчанию | Rock-and-Roll |
| Äpfel | Немецкая локаль + lower | aepfel |
| Пустая строка | По умолчанию | Пустая строка |
| 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? · Как мы проверяем руководства