Подтвердить что ты не робот

Найти мертвый код JavaScript?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Не смотря на что-то слишком сложное:

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

Ответ 3

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

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

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

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

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

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

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

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

Ответ 4

Вы можете использовать оптимизаторы кода в качестве 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

Ответ 5

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

Ответ 6

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

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

Подробнее об этом .

Откат от Chrome 59

tools

Ответ 7

Если вы хотите автоматизировать это, я бы посмотрел на 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/