Обнаружение скриптов: как найти нужный JS код
Способы поиска JavaScript в коде
При работе с проектами часто требуется найти определённый JavaScript код: функцию, переменную, строку. Рассмотрим эффективные методы.
Как быстро найти все упоминания функции или переменной во всех файлах проекта?
Наиболее эффективное решение — использование утилиты grep с регулярными выражениями. Это позволяет искать по всем файлам в директории, игнорируя регистр и бинарные файлы.
grep -rn "myFunction" --include="*.js" .Js found (найден javascript)
Пояснение: -r рекурсивно, -n выводит номера строк, --include="*.js" фильтрует только JS файлы, точка означает текущую директорию.
Для поиска всех вызовов console.log используйте регулярное выражение:
grep -rn "console\.\(log\|warn\|error\)" --include="*.js" .src/app.js:12: console.log('начало');
src/utils.js:45: console.error('ошибка');Частая ошибка:
не экранировать точку в регулярном выражении (без обратного слеша точка означает любой символ). Решение: используйте\..Также возможна проблема с кодировкой, если файлы в UTF-16. Тогда используйте grep -r -a для обработки как текста.
Как найти строку в JavaScript коде через браузерные инструменты разработчика?
В Chrome DevTools можно нажать Ctrl+Shift+F (или Cmd+Shift+F на Mac) для поиска по всем загруженным файлам. Эта возможность полезна для отладки на работающем сайте.
// В панели Sources: Ctrl+Shift+F, ввести "fetch"Результат покажет все вхождения во всех файлах, включая минифицированные.
Типичная ошибка:
поиск не находит данные, загруженные динамически или из Webpack. Решение: отключите фильтр "Ignore content scripts" или используйте поиск по всей странице (Ctrl+U).Как проверить наличие определённой подстроки в JavaScript строке?
Для поиска в коде на JavaScript используются методы indexOf, includes, search, match, test. Например, чтобы узнать, содержит ли переменная str подстроку "error":
if (str.indexOf('error') !== -1) { ... } // старый способ
if (str.includes('error')) { ... } // ES6
if (str.search(/error/i) !== -1) { ... } // регулярное выражение
if (/error/.test(str)) { ... } // тестВыбор зависит от требуемой точности. Для простого вхождения лучше includes, для шаблонов — test или match.
Распространённая ошибка:
забыть про-1 при использовании indexOf. В результате код ложно срабатывает. Используйте includes для избежания этой ошибки.Как найти все вхождения подстроки с учётом регистра?
Методы indexOf и includes по умолчанию чувствительны к регистру. Для регистронезависимого поиска приведите обе строки к одному регистру:
str.toLowerCase().includes('error'.toLowerCase());Или используйте регулярное выражение с флагом i:
/error/i.test(str);Проблема:
преобразование к нижнему регистру может изменить оригинальный смысл (например, в URL). Лучше использовать регулярные выражения, если нужен точный поиск с игнорированием регистра.Расширенные примеры поиска JavaScript
Дополнительные техники для глубокого анализа кода.
Пример 1: Поиск всех вызовов глобальных функций с помощью grep и обратных ссылок
grep -rnP "(\w+)\.\s*\(.*\)" --include="*.js" . | head -20Ищет вызовы методов с именем, состоящим из букв, затем точка и скобки. Флаг -P включает Perl-совместимые regex.
src/main.js:5: app.init();
src/lib.js:15: utils.log('test');Пример 2: Использование ripgrep (rg) для более быстрого поиска
rg -n "import.*from" --type jsНаходит все импорты в JS файлах. ripgrep по умолчанию игнорирует .gitignore и работает быстрее grep.
src/index.js:1: import React from 'react';
Пример 3: Поиск уязвимостей с помощью регулярных выражений (eval, innerHTML)
grep -rn "eval\s*(" --include="*.js" .
grep -rn "innerHTML\s*=" --include="*.js" .Полезно при аудите безопасности.
src/app.js:25: eval(result); src/view.js:10: elem.innerHTML = data;
Пример 4: Поиск по AST с помощью инструментов вроде eslint или jscodeshift
# eslint правило: no-console
# jscodeshift -t transform.js src/*.jsПозволяет искать по структуре кода, а не по тексту, избегая ложных совпадений.