URL: https://linuxfr.org/users/outs/journaux/eleventy-presentation-et-mini-tutoriel Title: Eleventy, présentation et mini-tutoriel Authors: Joris R Date: 2025年04月09日T18:22:25+02:00 License: CC By-SA Tags: site_statique et web Score: 18 ## Présentation [Eleventy](https://www.11ty.dev/), de son petit nom `11ty`, est un générateur statique de site web (SSG - *Static Site Generator*). Générateur statique car l'ensemble des pages du site est généré en une fois avant d'être déployées sur le serveur web. C'est un logiciel écrit en javascript prévu pour s'exécuter dans l'environnement comme NodeJS. Les pages sont générées à l'aide de divers moteurs de *template* (comme Liquid ou Nunjucks) qui s'exécutent sur des données structurée et des contenus en HTML ou markdown. Il est également possible d'utiliser directement du javascript au lieu des moteurs de template. L'intéret d'Eleventy est de combiner ces outils ensembles. Le projet Eleventy est principalement développé par [Zach Leatherman](https://www.zachleat.com/) avec l'aide de la communauté. En ce moment Zach est rémunéré par [Font Awesome](https://blog.fontawesome.com/eleventy-joins-font-awesome/). Quelques mots sur les autres SSG, le plus connu est probablement [Jekyll](https://jekyllrb.com/). À un moment donné, le couple Jekyll et [GitHub Pages](https://pages.github.com/) était un grand classique pour les sites web perso ou pro des développeurs. On peut également citer [Hugo](https://gohugo.io/) ainsi que [Astro](https://astro.build/), même si ce dernier n'est pas seulement un SSG (il fait également du SSR - *Server-Side Rendering*). Eleventy est connu pour être rapide et avoir une liste réduite de dépendance JS/NPM. Un soin particulier est donné à cela, par exemple pour la v3, le nombre de dépendance a significativement baissé par rapport à la version v2.0.1 (voir la [Release note](https://github.com/11ty/eleventy/releases/tag/v3.0.0). Il est également connu pour être *unopinionated*, c'est à dire que l'utilisateur a un large choix quand à la façon d'utiliser Eleventy. Une douzaine de [moteur de template](https://www.11ty.dev/docs/languages/) sont gérés de base et on peut en ajouter des customs. Un ensemble de [plugins officiels](https://www.11ty.dev/docs/plugins/official/) est disponible pour les besoins plus spécifiques. ## Un peu vocabulaire spécifique à 11ty (ou aux SSG). Les fichiers de contenu (de pages, de billets, etc) sont appelés les [*template*](https://www.11ty.dev/docs/glossary/#template). C'est à dire que c'est ce qui va générer une page web par l'application d'un moteur de template sur des données ou des contenus textuels. Les [*Collection*](https://www.11ty.dev/docs/glossary/#collection) permettent d'organiser les templates (et donc les pages web) entre elles. Typiquement cela permet de d'organiser la suite de billets d'un blog, les catégories de pages et donc les menus d'un site web. Les [*layout*](https://www.11ty.dev/docs/glossary/#layout) servent à factoriser les différentes parties communes entre les pages (comme les menu, en-tête ou pied de page). Il sont également gérés par un moteur de template. Le [*Front Matter Data*](https://www.11ty.dev/docs/data-frontmatter/) est un entête qu'on peut placer dans n'importe quelle fichier de contenu (un *template* donc). En général au format YAML, il permet de définir des données structurées qui seront ensuite utilisées lors de la génération. C'est très pratique pour écrire des templates efficaces. En fait, Eleventy peut utiliser toutes sortes de sources de données : les *Front Matter* donc, mais aussi des fichiers JSON ainsi que des données distantes depuis des API (on peut le relier à un *headless* CMS par exemple) et plus généralement d'importe quel résultat d'exécution de javascript. La façon dont les données sont récupérée, générées et fusionnées s'appelle la [*data cascade*](https://www.11ty.dev/docs/glossary/#data-cascade). C'est un point central à comprendre pour utiliser Eleventy. En particulier, il faut avoir en tête que chaque *template* va avoir accès à un ensemble différent de données (selon sa place dans les répertoires, sa place dans les collections, son *front matter*, les *layouts* qu'il utilise). # Alors comment ca s'utilise en pratique ? Personnellement, j'aime beaucoup le projet mais j'ai eu du mal à rentrer dedans. Je n'ai pas trouvé la documention particulièrement accueillante. C'est déjà du au fait qu'il y a beaucoup de manières différentes d'utiliser Eleventy et qu'évidement il faut connaitre les technologies web (ce qui devient de plus en plus compliqué). Il n'y a pas vraiment de tutoriel officiel. Il y a beaucoup du [tutoriels communautaire](https://www.11ty.dev/docs/tutorials/) mais ont est tout de suite perdu dans la diversitée. En fait, on est en plein dans le modèle du [bazar](https://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar), c'est sympa, j'aime beaucoup la liberté qu'on y trouve, mais on s'y perd un peu. Je ne suis pas le seul à le penser d'ailleur, voir le ticket [Consider adding content to help new users with an opinionated guide to building a site.](https://github.com/11ty/eleventy/issues/2855). Une autre chose à comprendre, c'est qu'Eleventy utilise beaucoup de bibliotheques tierces. En particulier aucun des moteurs de *template* n'a été créé pour Eleventy, le projet va simplement réutiliser ce qui a été fait ailleurs. Donc, et par exemple, si on souhaite écrire des templates avec Nunjucks aller voir la [documentation Eleventy dédiée](https://www.11ty.dev/docs/languages/nunjucks/) n'apporte pas grand chose. Il faut plutot aller voir la [page officielle de Mozilla](https://mozilla.github.io/nunjucks/). En fait Eleventy est principalement un moteur qui va orchestrer le calcul de la *data cascade* et l'exécution d'outils tierces. Il ne suffit donc pas juste apprendre Eleventy, mais Eleventy et l'ensemble des langague et outils qu'on a choisi pour son projet. ## Pré-requis Il vous faudra NodeJS. Personnellement je vous conseille de prendre la dernière LTS (c'est à dire la v22 au moment où j'écris ces lignes). J'ai eu des soucis avec la v18 qui est recommandée par Eleventy et qui est dispo dans les paquets Debian stable. Pour cela, je vous propose d'utiliser [Node Version Manager](https://github.com/nvm-sh/nvm). Voir leur documentation, mais globalement il faut faire ceci (si vous acceptez d'exécuter un script bash téléchargé) : ``` curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash nvm install --lts ``` Il vous faudra évidement un éditeur de texte. N'importe lequel conviendra mais si vous voulez être à la mode *cool kids in town* et avoir accès à toutes les extensions du moment prenez [vscode](https://code.visualstudio.com/download). Alors évidement c'est [pas terrible](https://medium.com/@adnanribic/debunking-the-myth-why-visual-studio-code-isnt-truly-open-source-3b7b05a1d9fa) niveau philosophie du libre (j'ai pas encore essayé [VSCodium](https://vscodium.com/)). ## Installation Maintenant qu'on a l'environnement, il suffit des commandes ci-dessous pour installer Eleventy (localement dans un répertoire). Voir [la doc 11ty](https://www.11ty.dev/docs/#step-2-install-eleventy) pour plus d'info. ``` mkdir my_great_site && cd "$_" npm init -y npm pkg set type="module" npm install @11ty/eleventy ``` Alors petite chose à savoir, là on a configuré le [projet avec ESM](https://www.11ty.dev/docs/cjs-esm/) le nouveau standard de module JavaScript (celui avec `import()` et pas des `require`). C'est un peu pénible car il existe encore beaucoup de documentation sur le Net avec l'ancienne syntaxe. ## Mise en place On va configurer quelques petites choses. Créez un fichier `eleventy.config.js` avec le contenu ci-dessous. J'ai configuré les répertoires et j'ai choisi le moteur de template nunjucks pour les fichiers markdown et html. ``` export const config = { // Directory configuration dir: { input: "content", // default: "." includes: "../_includes", // default: "_includes" (`input` relative) data: "../_data", // default: "_data" (`input` relative) output: "_site" }, // Pre-process *.md files with nunjucks (default: `liquid`) markdownTemplateEngine: "njk", // Pre-process *.html files with nunjucks (default: `liquid`) htmlTemplateEngine: "njk", }; export default async function (eleventyConfig) { // Copy the contents of the `public` folder to the output folder // For example, `./public/css/` ends up in `_site/css/` eleventyConfig .addPassthroughCopy({ "./public/": "/" }) }; ``` Et créez les répertoires correspondants : ``` mkdir _data _includes content public public/{css,img} ``` On va aussi préparer l'usage de git. Créez le fichier `.gitignore` avec le contenu suivant. ``` node_modules _site .cache ``` On se retrouve normalement avec ceci : ``` ├── content # Ici c'est les pages web (les templates) ├── _data # là les donnéess structurées (typiquement en JSON) ├── _includes # les layouts └── public ├── css # les feuilles de style CSS └── img # et les images (qui doivent déjà être # optimisée pour le web) ``` ## Allez ca suffit là, on affiche quelque chose maintenant Donc, ouvrons un fichier `index.md` dans le répertoire `content` avec quelque lignes de textes dedans. Comme par exemple : ``` Bonjour le monde ! ``` Ca y est, vous y êtes ? Alors maintenant la commande magique : ``` npx @11ty/eleventy --serve ``` Et normalement vous voyez vos lignes à l'adresse [http://localhost:8080/](http://localhost:8080/). C'est un serveur de développement. Il est intégré à Eleventy et mise à jour le site automatiquement à chaque changement de fichiers. ## Le premier layout Donc pour le moment, on a pas encore d'HTML complet mais seulement un `
Bonjour le monde !
` qui provient de la transcription du fichier mardown `index.md`. Ouvrez donc, un fichier `base.njk` dans le répertoire `_includes` avec le contenu suivant ```