SMELUKOV_DEV Telegram 22
Неиспользуемые зависимости

Какие-то зависимости из package.json могут вовсе не использоваться, но при этом они будут установлены на npm install. Например, после рефакторинга забыли удалить из package.json зависимость, которая больше не нужна. В таких случаях помогут штуки вроде https://www.npmjs.com/package/depcheck
Этот инструмент проанализирует импорты внешних зависимостей и сравнит их со списком зависимостей из package.json

Недостижимые use-cases

Это отдельный класс проблем по поиску мертвого кода. Например, при нажатии на кнопку нужно выполнить какой-то код, но кнопка по какой-то причине не нажимается (съехала из вьюпорта, в принципе скрыта или в обработчике события ошибка, которая не дает выполниться части кода).
Здесь не поможет ни минификатор, ни типизация. Для таких кейсов нужно писать e2e тесты, эмулировать в них действия пользователя и делать проверки. Логика здесь следующая: выполнили тесты, составили отчет по code coverage и весь код, который помечен в отчете красным - недостижим. Но это очень скользкий способ т.к. нужно иметь ввиду, что код может быть недостижим просто потому, что мы не написали под него тест-кейс. Соответственно этот способ требует от разработчика/QA максимальной концентрации и пребывания в контексте бизнес-логики. Тут же встает вопрос о том, где эти тест-кейсы хранить и как их синхронизировать.

Более честным вариантом здесь будет отслеживать действия реальных пользователей и собирать по ним code coverage. Если в течение какого-то времени код так и не "покрасился" в зеленый, значит пользователи не попадают на этот кейс и код для них не достижим.
Вопрос который сразу здесь возникает - как снимать отчет по code coverage.
Если речь о e2e-тестах, то там мы используем реальный браузер (например, при помощи `puppeteer`) и можем снять отчет по code coverage через DevTools Coverage API. Он, к слову, снимает отчет еще и по использованию CSS. Проблема в том, что тестировать надо в разных браузерах и на разных разрешениях (например, чтобы получить coverage по CSS Media Query), а еще надо учитывать динамику изменения размера экрана и подобных кейсов (для кейсов типа `window.onresize`). А как только мы говорим про "тестировать в разных браузерах", то вся стройная концепция с DevTools Coverage API сыпется, т.к. не во всех браузерах это есть и не для всех браузеров есть "безголовый" режим.

Когда мы говорим о снятии отчета с браузера реальных пользователей, то здесь вообще нет способов получить доступ к DevTools Coverage API.
Что тут можно придумать? Например, можно инструментировать реальный продуктовый код. Это значит, что каждый вызов функции, строка или условие будут обернуты в специальные функции-обертки или будут "дописаны" специальными конструкциями (счетчиками). Как только интерпретатор будет доходить до этих конструкций, он будет помечать их как используемые. Для инструментирования кода есть специальные штуки, например https://github.com/istanbuljs/istanbuljs/tree/master/packages/istanbul-lib-instrument
Таким образом, можно собирать code coverage на реальных пользователях.
Здесь есть три проблемы:

- инструментированный код становится объемным и выполняется дольше, появляется оверхед
- в случае большой кодовой базы, отчет может быть довольно большим
- мы инструментируем минифицированный код
- не решает проблему сбора coverage по CSS

В качестве решения первой и второй проблем можно подумать над тем, чтобы раскатить инструментированный код лишь на какой-то процент пользователей (1-2%) и да, они будут страдать от объема получаемого кода и скорости его исполнения.
Для решения третьей проблемы, получаемые отчеты нужно будет маппить на source-map, чтобы понимать о каких конструкциях в исходнике идет речь о отчете.

Подводя итог: как видите, серебряной пули для поиска и устранения мертвого кода - нет. Задача нетривиальная и решается в несколько заходов, с разных углов и разными инструментами.
А как вы решаете эту задачу? Какие инструменты используете? Пишите в комментариях @wdxlabchat

#webdx #dce



tgoop.com/smelukov_dev/22
Create:
Last Update:

Неиспользуемые зависимости

Какие-то зависимости из package.json могут вовсе не использоваться, но при этом они будут установлены на npm install. Например, после рефакторинга забыли удалить из package.json зависимость, которая больше не нужна. В таких случаях помогут штуки вроде https://www.npmjs.com/package/depcheck
Этот инструмент проанализирует импорты внешних зависимостей и сравнит их со списком зависимостей из package.json

Недостижимые use-cases

Это отдельный класс проблем по поиску мертвого кода. Например, при нажатии на кнопку нужно выполнить какой-то код, но кнопка по какой-то причине не нажимается (съехала из вьюпорта, в принципе скрыта или в обработчике события ошибка, которая не дает выполниться части кода).
Здесь не поможет ни минификатор, ни типизация. Для таких кейсов нужно писать e2e тесты, эмулировать в них действия пользователя и делать проверки. Логика здесь следующая: выполнили тесты, составили отчет по code coverage и весь код, который помечен в отчете красным - недостижим. Но это очень скользкий способ т.к. нужно иметь ввиду, что код может быть недостижим просто потому, что мы не написали под него тест-кейс. Соответственно этот способ требует от разработчика/QA максимальной концентрации и пребывания в контексте бизнес-логики. Тут же встает вопрос о том, где эти тест-кейсы хранить и как их синхронизировать.

Более честным вариантом здесь будет отслеживать действия реальных пользователей и собирать по ним code coverage. Если в течение какого-то времени код так и не "покрасился" в зеленый, значит пользователи не попадают на этот кейс и код для них не достижим.
Вопрос который сразу здесь возникает - как снимать отчет по code coverage.
Если речь о e2e-тестах, то там мы используем реальный браузер (например, при помощи `puppeteer`) и можем снять отчет по code coverage через DevTools Coverage API. Он, к слову, снимает отчет еще и по использованию CSS. Проблема в том, что тестировать надо в разных браузерах и на разных разрешениях (например, чтобы получить coverage по CSS Media Query), а еще надо учитывать динамику изменения размера экрана и подобных кейсов (для кейсов типа `window.onresize`). А как только мы говорим про "тестировать в разных браузерах", то вся стройная концепция с DevTools Coverage API сыпется, т.к. не во всех браузерах это есть и не для всех браузеров есть "безголовый" режим.

Когда мы говорим о снятии отчета с браузера реальных пользователей, то здесь вообще нет способов получить доступ к DevTools Coverage API.
Что тут можно придумать? Например, можно инструментировать реальный продуктовый код. Это значит, что каждый вызов функции, строка или условие будут обернуты в специальные функции-обертки или будут "дописаны" специальными конструкциями (счетчиками). Как только интерпретатор будет доходить до этих конструкций, он будет помечать их как используемые. Для инструментирования кода есть специальные штуки, например https://github.com/istanbuljs/istanbuljs/tree/master/packages/istanbul-lib-instrument
Таким образом, можно собирать code coverage на реальных пользователях.
Здесь есть три проблемы:

- инструментированный код становится объемным и выполняется дольше, появляется оверхед
- в случае большой кодовой базы, отчет может быть довольно большим
- мы инструментируем минифицированный код
- не решает проблему сбора coverage по CSS

В качестве решения первой и второй проблем можно подумать над тем, чтобы раскатить инструментированный код лишь на какой-то процент пользователей (1-2%) и да, они будут страдать от объема получаемого кода и скорости его исполнения.
Для решения третьей проблемы, получаемые отчеты нужно будет маппить на source-map, чтобы понимать о каких конструкциях в исходнике идет речь о отчете.

Подводя итог: как видите, серебряной пули для поиска и устранения мертвого кода - нет. Задача нетривиальная и решается в несколько заходов, с разных углов и разными инструментами.
А как вы решаете эту задачу? Какие инструменты используете? Пишите в комментариях @wdxlabchat

#webdx #dce

BY Сергей Мелюков


Share with your friend now:
tgoop.com/smelukov_dev/22

View MORE
Open in Telegram


Telegram News

Date: |

The channel also called on people to turn out for illegal assemblies and listed the things that participants should bring along with them, showing prior planning was in the works for riots. The messages also incited people to hurl toxic gas bombs at police and MTR stations, he added. When choosing the right name for your Telegram channel, use the language of your target audience. The name must sum up the essence of your channel in 1-3 words. If you’re planning to expand your Telegram audience, it makes sense to incorporate keywords into your name. 5Telegram Channel avatar size/dimensions The administrator of a telegram group, "Suck Channel," was sentenced to six years and six months in prison for seven counts of incitement yesterday. “Hey degen, are you stressed? Just let it all out,” he wrote, along with a link to join the group.
from us


Telegram Сергей Мелюков
FROM American