Измерение производительности компиляции Babel (для каждого файла или модуля)

Я пытаюсь выяснить, как извлечь некоторую информацию из babel процесса компиляции.

В частности, когда я запускаю babel (независимо от того, использую ли Webpack babel-loader), тестовые фреймворки трансформеры, CLI Babel и т. д.) мне нужно извлечь некоторую информацию для каждого скомпилированный файл. Нравиться:

  • Путь к файлу
  • время, затраченное на компиляцию
  • любые другие метаданные?

Что я пробовал до сих пор

Плагин Speed ​​Measure для Webpack (ссылка)

Работает нормально, но обеспечивает только время работы загрузчиков Webpack. Нет информации об отдельных скомпилированных файлах.

Подключитесь к экземпляру компилятора/компиляции Webpack

Я решил написать плагин Webpack для подключения к процесс компиляции, как описано здесь, но я не смог найти подходящие хуки для распознавания файла, обработано babel.

Обновления

Думаю, @kidroca указал правильное направление. В частности, я понимаю, что параметр Babel wrapPluginVisitorMethod является ключом к подключению к процессу компиляции Babel.

См. плагин синхронизации от babel-minify.

Связанные темы:

Обновления 28.04.18

В конце концов я попытался обернуть решение в инструмент, который назвал babel-timing.


person Andrea Carraro    schedule 05.04.2019    source источник
comment
Просто идея, вместо того, чтобы создавать еще один плагин, просто перехватите babel-loader.   -  person Keith    schedule 05.04.2019
comment
^ зачем останавливаться на загрузчике, перехватывать babel.transform. Втисните логику измерений прямо в исходный код babel, если это возможно.   -  person hackape    schedule 08.04.2019
comment
Я определенно хотел бы найти решение, включающее только Babel, чтобы иметь возможность измерять время компиляции независимо от окружающих инструментов.   -  person Andrea Carraro    schedule 08.04.2019
comment
Плагин-тайминг и бенчмарк babel-minify кажутся подходящим способом для прослушивания внутри Babel. Я не уверен, можно ли передать wrapPluginVisitorMethod из внешней конфигурации, такой как .babelrc. Если это возможно, это позволит вам интегрировать этот тест/анализ без модификации кода babel и запускать его для любого проекта, использующего babel.   -  person kidroca    schedule 15.04.2019


Ответы (1)


Вы можете использовать @babel/core и babel.transformSync(code), которые будут возвращать информацию Abstract Syntax Tree (AST) вместе с некоторыми другими данными. . И вы также можете добавить некоторую логику для измерения производительности этого метода.

Я настроил минимальное репо и сам немного поиграл с ним: https://github.com/kidroca/babel-meta

По сути, вы можете запустить npm run analyze-file ./es6-src/es6-module.js или npm run analyze-dir ./es6-src/es6-module.js и проверить результаты.

Это вернет:

{
  "filename": "/full/path/to/src/file.js",
  "cwd": "current/dir",
  "ast": "ast information json - lines, comments, and other info",
  "executionTime": "execution time in ms",
  /* a lot of other info */
}

Вы можете изменить файл analyze.js, чтобы отфильтровать нужную информацию
Вы можете изменить файл .babelrc, чтобы контролировать преобразование и добавлять/удалять плагины.

person kidroca    schedule 14.04.2019