Symfony 4: Encore та компіляція ассетів

Symfony 4: Encore та компіляція ассетів

Робота з ассетами в Symfony 4 досить схожа на аналогічну процедуру в Laravel, що не дуже то й дивно, оскільки згідно з документацією "Encore is inspired by Webpacker and Mix". Що ж, давайте подивимося.

ОС: Ubuntu 18.04, Framework: Symfony 4.2.5.

Передбачається, що на машині вже є Node.js і Yarn. Також переконайтеся, що додаток використовує Symfony Flex

Спочатку встановлюємо encore і js-залежності:

composer require encore

yarn install

 

В результаті виконання цих команд буде:

  • встановлений та активований WebpackEncoreBundle,
  • доданий каталог assets в корінь проекту
  • створений файл webpack.config.js
  • доданий node_modules/ в .gitignore

Далі за допомогою yarn інсталюємо encore:

yarn add @symfony/webpack-encore --dev

 

Після чого в директорії assets з'являться наступні файли:

  • assets/js/app.js
  • assets/css/app.css

Однак, не особливо хочеться мати справу з чистим сss - пропоную використовувати Sass. Тому перейменуємо вищевказаний app.css в app.scss. І цей же файл будемо підключати в app.js:

// assets/js/app.js

require('../css/app.scss');

 

Встановимо необхідні залежності: 

yarn add sass-loader@^7.0.1 node-sass --dev

 

Відразу ж подумаємо і про autoprefixer. Виконаємо в консолі команду:

yarn add postcss-loader autoprefixer --dev

 

У файлі webpack.config.js розкоментуємо рядок з Sass і, щоб мати можливість додавати автопрефікси, пропишемо завантажувач PostCss (не раджу видаляти коментарі з оригінального файлу, оскільки вони досить чітко описують значення майже кожної інструкції):

var Encore = require('@symfony/webpack-encore');

Encore
    .setOutputPath('public/build/')
    .setPublicPath('/build')
    .addEntry('app', './assets/js/app.js')
    .splitEntryChunks()
    .enableSingleRuntimeChunk()
    .cleanupOutputBeforeBuild()
    .enableBuildNotifications()
    .enableSourceMaps(!Encore.isProduction())
    .enableVersioning(Encore.isProduction())
    .configureBabel(() => {}, {
        useBuiltIns: 'usage',
        corejs: 3
    })

    .enableSassLoader()
    .enablePostCssLoader()
;

module.exports = Encore.getWebpackConfig();

 

Також слід додати browserslist в package.json, оскільки autoprefixer повинен розуміти які браузери ми хочемо підтримувати:

{
    ...

    "browserslist": [
        "> 0.5%",
        "last 2 versions",
        "Firefox ESR",
        "not dead"
    ]
}

 

Давайте підключимо і css-фреймворк. Bootstrap вже набрид, тому мій вибір (на даний момент) - materialize-css. ставимо:

yarn add materialize-css@next

 

Допишемо імпорт фреймворка у файлі assets/css/app.scss:

@import '~materialize-css/sass/materialize';

 

і в assets/js/app.js:

require('materialize-css');
...
require('../css/app.scss');

 

Нарешті скомпілюємо ассети. Залежно від цілей запустіть одну з трьох команд:

yarn encore dev

// або
yarn encore dev --watch

// або
yarn encore production

 

І останній крок - підключимо ассети в шаблоні, для чого скористаємося відповідними методами Encore. Відкриваємо base.html.twig і редагуємо:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}
            {{ encore_entry_link_tags('app') }}
        {% endblock %}
    </head>
    <body>
        {% block body %}{% endblock %}
        
        {% block javascripts %}
            {{ encore_entry_script_tags('app') }}
        {% endblock %}
    </body>
</html>

 

Готово! Треба визнати, що в статті розглянуто лише необхідний мінімум. Тому рекомендую ознайомитися з повною документацією по цій темі - там ще досить багато корисного.

Успіхів!