найти мертвый код JavaScript? - PullRequest
58 голосов
/ 09 ноября 2010

Мы проводим рефакторинг устаревшего веб-приложения и в результате «убиваем» довольно много кода JavaScript, но боимся удалить то, что мы считаем мертвым кодом из-за неуверенности.Есть ли какой-либо инструмент / метод для положительной идентификации мертвого кода в JavaScript?

Ответы [ 7 ]

10 голосов
/ 09 ноября 2010

Там grep .Используйте его для поиска вызовов функций.Предположим, у вас есть метод с именем dostuff().Используйте grep -r "dostuff()" * --color в корневом каталоге вашего проекта.Если вы не найдете ничего, кроме определения, вы можете безопасно стереть его.

ack также является заметной альтернативой grep .

9 голосов
/ 09 ноября 2010

Не ища ничего слишком сложного:

  • JSLint (на самом деле не статический анализатор, но если вы дадите ему свой каскадный код разработки, вы увидите, какие методы никогда не вызываются, по крайней мере, в очевидных контекстах области видимости)
  • Google Closure Compiler
  • Google Closure Linter
8 голосов
/ 09 ноября 2010

Если в вашем коде используется «eval», довольно сложно получить гарантию того, что где-то код не собирает строку каким-либо неясным способом и вычисляет ее, вызывая ваш мертвый код.(И действительно неприятные вещи могут вызвать eval для строки, содержащей eval ...).

Вам также нужно беспокоиться о вызовах из за пределами вашего кода;многие веб-страницы используют HTML-атрибуты «on» для вызова кода JavaScript.

Итак, вам нужно найти методы / объявления, которые кажутся мертвыми, найти и проверить все вызовы eval, а также найти и проверитьвсе атрибуты «вкл.».

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

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

Вы можете взглянуть на нашу поисковую систему исходного кода SD (SCSE) , которая можетвыполнять поиск по языку для многих языков, включая HTML-страницы различных типов и JavaScript.Вы можете легко ограничить SCSE проверять только вызовы функций в коде JavaScript (например, игнорировать комментарии и строки) для оставшихся кандидатов и / или eval, а также проверять только атрибуты «on *» на страницах HTML (например, чтобыигнорировать весь другой текст на страницах HTML).Он использует графический интерфейс пользователя, чтобы принять ваш поисковый запрос, показать попадания и получить исходный текст, содержащий попадание, для удобства просмотра.Это даже приведет вас к вашему редактору при ударе, если это необходимо.

Для решения статического анализа вам нужны инструменты, которые могут анализировать код и определять, какие имена относятся к каким объектам;сфера имеет значение.Затем вы должны быть в состоянии определить вероятные пути выполнения через код, по модулю структуру динамического объекта и эти неприятные уловки.Для этого вам понадобится довольно сложный движок и, вероятно, немного инженерных разработок, если только у кого-то это не случится, у меня все в порядке, в чем я сомневаюсь.

Наш инструментарий реинжиниринга программного обеспечения DMS является именно таким движком и имеет полный JavaScript (и HTML) парсер.Хотя мы не использовали DMS для этого для JavaScript, мы создали такой инструмент для удаления мертвого кода для Java с использованием DMS.Вы передаете ему Java-код, и он создает «кажущийся мертвым» список классов, методов и полей (включая транзитивное закрытие мертвых: если класс А мертв и ссылки В, ссылки А не учитываются).в качестве реальных ссылок на B), и модифицированная версия кода с удалением всех «мертвых» вещей.Вы решаете, верите ли вы в отчет;если вы делаете, вы держите код.Если вы этого не сделаете, вы измените код, чтобы убедиться, что эта явно мертвая вещь не мертва, и запустите ее снова.

7 голосов
/ 13 августа 2013

IDE WebStorm от JetBrains может выделить мертвый код и неиспользуемые переменные в вашем проекте.

6 голосов
/ 09 ноября 2010

Вы можете использовать оптимизаторы кода в качестве Google Closure Compiler , однако он часто используется для минимизации кода.

function hello(name) {
alert('Hello, ' + name);
}

function test(){
alert('hi');
}

hello('New user');

приведет к

alert("Hello, New user");

Например.

Еще одна вещь, которую вы можете сделать, - это использовать Chrome Developer Tools (или Firebug), чтобы увидеть все вызовы функций. В разделе Профили вы можете видеть, какие функции вызываются во времени, а какие нет.

DT Profiles

4 голосов
/ 07 июля 2017

В Chrome появилась новая функция, которая позволяет разработчику видеть покрытие кода , т. Е. Какие строки кода были выполнены.

Это, безусловно, не универсальное решение, но оно может помочь разработчикам в понимании кода.

Проверьте ссылку для подробностей

Прокат, кроме Chrome 59 выпуск

tools

2 голосов
/ 09 июля 2017

Если вы хотите автоматизировать это, я бы посмотрел на https://github.com/joelgriffith/navalia,, который предоставляет автоматизированный API для этого:

const { Chrome } = require('navalia');
const chrome = new Chrome();

chrome.goto('http://joelgriffith.net/', { coverage: true })
  .then(() => chrome.coverage('http://joelgriffith.net/main.bundle.js'))
  .then((stats) => console.log(stats)) // Prints { total: 45913, unused: 5572, 
  percentUnused: 0.12135996340905626 }
  .then(() => chrome.done());

Подробнее здесь: https://joelgriffith.github.io/navalia/Chrome/coverage/

...