Rails скомпилировал отладку актива javascript - PullRequest
0 голосов
/ 22 апреля 2019

В производственной среде, где мои ресурсы javascript связаны, при обнаружении ошибки javascript я получаю строку и столбец, например:

d86c04c8f3.js:2:9588

Теперь, так какфайл минимизирован и т. д., его трудно перепроектировать и найти проблемную строку в исходном коде.Имеется ли в пакете ресурсов rails способ обратного инжиниринга, учитывая строку / col, чтобы найти оригинальную линию?Это должно быть возможно, так как у компоновщика ресурсов есть вся необходимая информация.

Нам нужен простой вариант, чтобы запустить комплектные exec rake assets: прекомпилировать RAILS_ENV = production снова, но на этот раз укажите line + colи затем грабли выведут исходный файл + строку, которая соответствует строке актива + столбец.Таким образом, мы можем легко отлаживать исключения, которые перехватываются на стороне клиента (и которые отправляются на сервер для целей мониторинга).

EDIT1

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

1 Ответ

1 голос
/ 22 апреля 2019

Для отладки минимизированных сценариев есть исходные карты, однажды загруженные в браузер - вы можете увидеть там незавершенный код.

Планируется поддержка Sprockets для исходных карт в 4.0, которая еще не выпущена (только бета).

Webpack поддерживает исходные карты и rails 6, переключенные на webpacker по умолчанию, поэтому преобразование сценариев в пакеты кажется логичным, хотя и является большой задачей для больших проектов

Обновление: если у вас есть исходная карта для вашей сборки, вы можете использовать такой инструмент, как:

npx source-map-cli resolve d86c04c8f3.js.map 2 9588

Это скажет вам, где в вашем коде эта позиция в минимизированном файле отображается в виде:

Maps to webpack:///app/javascript/components/CountrySelector.jsx:14:0

    fetch(`/control/autocomplete/countries`).then(r => r.json()).then(countries => this.setState({countries}))
    ^
...