Оптимизация webpack в CI

Источник: «Optimiser webpack dans la CI»
Компиляция ресурсов с помощью webpack отнимает много времени. Каждый раз, когда проект собирается в CI, ресурсы приходится компилировать снова и снова.

Чтобы избежать этого, можно настроить кэш. Но в статье мы хотим рассмотреть другой способ решения этой задачи.

Существуют определённые условия, при которых сборка ресурсов не является обязательной. Например, если в приложении нет функциональных тестов на JavaScript (например, с помощью Panther, Cypress или Playwright).

В таком случае зачем тратить время на компиляцию артефактов, которые не используются? Во-первых, потому что приложение не сможет запуститься, если файл entrypoints.json не существует:

An exception has been thrown during the rendering of a template ("Could not find the entrypoints file from Webpack: the file "/var/www/public/build/entrypoints.json" does not exist.")

Но что это за файл и каково его назначение? Этот файл генерируется webpack'ом, чтобы Symfony знала, где компилируются файлы, которые нужно включить из точки входа. Например, если в приложении есть точка входа app, то файл будет выглядеть следующим образом:

{
"entrypoints": {
"app": {
"js": [
"/build/runtime.js",
"/build/0.js",
"/build/vendors~app.js",
"/build/app.js"
],
"css": [
"/build/vendors~app.css",
"/build/app.css"
]
}
}
}

Чтобы обойти эту проблему, отключим все плагины webpack, не являющиеся необходимыми для компиляции ресурсов. Для этого добавьте следующие строки в конец файла webpack.config.js,

const AssetsPlugin = require('assets-webpack-plugin');
const ManifestPlugin = require('webpack-manifest-plugin');

if (process.env.WEBPACK_DUMP_CONFIG) {
config.module = {};
config.plugins = config.plugins.filter((plugin) => (plugin instanceof AssetsPlugin || plugin instanceof ManifestPlugin));
}

// Эта строка уже существует в конфигурации по умолчанию
module.exports = config;

Наконец, в CI можно скомпилировать ресурсы с помощью следующей команды:

WEBPACK_DUMP_CONFIG=1 yarn encore dev || true

Вот и всё 🎉 Благодаря этому хаку мы смогли сэкономить более двух минут на каждой сборке! Разработчики теперь быстрее получают обратную связь, расходы на CI сокращаются, а мы экономим электроэнергию. Эти 4 маленькие строки внедряются очень быстро, так зачем себя ограничивать?

Вам наверняка интересно, как это работает. Отключив все ненужные плагины, webpack всё равно переместит ресурсы и сгенерирует файл public/build/entrypoints.json.

Дополнительные материалы

Предыдущая Статья

PHP 8.4: Объявление параметров с неявным nullable объявлено устаревшим

Следующая Статья

SASS vs CSS