Svelte + Symfony, ma cure d’amincissement

S

Ca faisait pas mal de temps que je voulais me mettre sérieusement à Svelte, encore une librairie Javascript qui a pourtant déjà pas mal d’années, et qui est pas mal utilisée depuis 2019 et la version 3.

Parmi ses qualités : Du code simple, léger, avec la même courbe d’apprentissage que vueJs, ici pas question de manipuler le DOM, c’est Svelte qui s’en occupe !

Et enfin, niveau performance cette librairie est une des plus rapide du marché.

On commence par créer notre projet Symfony, super facile :

symfony new svelte

A l’heure où j’écris ces lignes pas encore de Symfony 6, on sera donc en 5.3, on va installer tout ce que l’on a besoin pour faire du front :

composer req twig
composer req symfony/webpack-encore-bundle

Et comme on est de gros fainéants, on va bien sûr utiliser le maker bundle :

composer req doctrine/annotations
composer req --dev symfony/maker-bundle

On va créer notre controller qui va affichera du svelte :

bin/console make:controller

On va maintenant installer tout ce qu’il nous faut pour Svelte, et pour Webpack on a besoin de svelte-loader :

yarn install
yarn add svelte-loader svelte

On commence à être pas mal et on devrait bientôt pouvoir s’amuser, encore un peu de configuration, le plus important, le fichier webpack.config.js, on va tout d’abord supprimer tout ce qui concerne Stimulus :

.enableStimulusBridge('./assets/controllers.json')

On en profite aussi pour vider le répertoire assets, nous allons tout recreer.

Toujours dans le fichier webpack.config.js, on va ajouter notre loader, donc par exemple après la ligne setPublicPath :

    .addLoader({
            test: /\.svelte$/,
            loader: 'svelte-loader',
        },
        {
            // required to prevent errors from Svelte on Webpack 5+, omit on Webpack 4
            test: /node_modules\/svelte\/.*\.mjs$/,
            resolve: {
                fullySpecified: false
            }
        }
    )

Et en fin de fichier, remplacer la ligne :

module.exports = Encore.getWebpackConfig();

par :

let config = Encore.getWebpackConfig();
config.resolve.mainFields = ['svelte', 'browser', 'module', 'main'];
config.resolve.extensions = ['.mjs', '.js', '.svelte'];

let svelte = config.module.rules.pop();
config.module.rules.unshift(svelte);

module.exports = config;

Voilà pour la partie installation/configuration, on va passer aux choses sérieuses et s’amuser un peu !

Dans le fichier template twig (default/index.html.twig), on va ajouter ces lignes, elles vont permettre d’afficher notre application (CSS + JS) :

{% block stylesheets %}
    {{ encore_entry_link_tags('app') }}
{% endblock %}

{% block javascripts %}
    {{ encore_entry_script_tags('app') }}
{% endblock %}

C’est encore trop tôt pour aller voir ce que ça donne (vous aurez un message d’erreur), nous allons maintenant enfin coder du Javascript ! Et créer de suite le point d’entrée de notre application, le fichier assets/app.js et y ajouter ces quelques lignes :

import App from './App.svelte';

const app = new App({
    target: document.body,
});

Et nous allons créer le composant dans le fichier assets/App.svelte (il peut aussi contenir le css de votre composant) :

<script>
    let count = 0;
    $: doubled = count * 2;

    function handleClick() {
        count += 1;
    }
</script>

<button on:click={handleClick}>
    Clicked {count} {count === 1 ? 'time' : 'times'}
</button>

<p>{count} doubled is {doubled}</p>

Remarquer au passage pour faire du reactif, il suffit de mettre un $, génie !

Pour que tout fonctionne on va compiler tout ce petit monde :

yarn dev

and F5 !!! C’est pas beautiful ??!!

Enjoy !

A propos de l'auteur

Ajouter un commentaire

Guillaume

Get in touch

Je suis un développeur web passionné par les technologies Symfony et ChatGPT. J'aime partager mes connaissances et mon expérience à travers des articles que j'écris sur ces sujets. Avec une solide expertise en développement web, je m'efforce de fournir des contenus utiles et instructifs pour aider les développeurs à créer des applications web de qualité supérieure.