Eleventy (ou 11ty) est un générateur de site statique (SSG) Node.js. Les SSG effectuent la plupart des travaux de rendu au moment de la construction pour créer un ensemble de fichiers HTML, CSS et JavaScript statiques. Les pages résultantes n'ont pas besoin d'avoir des dépendances côté serveur telles que des runtimes ou des bases de données.
Cela conduit à plusieurs avantages clés:
- l'hébergement est simple: vous servez des fichiers HTML
- les systèmes sont sécurisés: il n'y a rien à pirater
- les performances peuvent être excellentes.
Eleventy est devenu de plus en plus populaire et a attiré l'attention de grands noms du développement Web. Il est idéal pour les sites de contenu et les blogs, mais il a été adapté pour les boutiques en ligne et les systèmes de reporting.
Dans la plupart des cas, vous utiliserez Eleventy pour générer des pages HTML à partir de documents Markdown qui insèrent du contenu dans des modèles alimentés par des moteurs tels que Nunchucks . Cependant, ce didacticiel montre également comment utiliser Eleventy en tant que système de construction complet pour tous les actifs. Vous n'avez pas nécessairement besoin d'un système séparé tel que les scripts npm, webpack ou Gulp.js, mais vous pouvez toujours profiter des compilations automatisées et du rechargement en direct.
Avez-vous besoin d'un framework JavaScript?
Quelques SSG adoptent le client- côté des frameworks JavaScript tels que React ou Vue.js. Vous pouvez utiliser un framework avec Eleventy, mais il n’est pas appliqué.
À mon avis, un framework JavaScript est probablement inutile, sauf si vous créez une application complexe . Et si vous créez une application, un SSG n'est pas le bon outil! Les fans de Gatsby peuvent ne pas être d'accord, alors s'il vous plaît défiez-moi / ridiculisez-moi sur Twitter !
Montre-moi le code
Eleventy prétend être simple, mais cela peut être intimidant quand on va au-delà Les bases. Ce tutoriel montre comment créer un site simple avec des pages et des articles de blog / articles – une tâche souvent gérée par WordPress.
Le code complet est disponible sur https://github.com/craigbuckler/11ty-starter . Vous pouvez le télécharger, l'installer et le lancer sous Windows, macOS ou Linux en entrant les commandes suivantes dans votre terminal:
git clone https://github.com/craigbuckler/11ty-starter
cd 11ty-starter
npm i
npx onze --serve
Accédez ensuite à la page d'accueil à l'adresse http: // localhost: 8080 dans votre navigateur.
Les étapes ci-dessous décrivent comment créer le site à partir de zéro.
Installez Eleventy
Comme tout projet Node.js, commencez par créer un répertoire et initialiser un fichier package.json
:
mkdir mysite
cd monsite
npm init
Ensuite, installez Eleventy en tant que dépendance de développement:
npm i @ 11ty / eleventy --save-dev
Remarque: ce projet installe des modules en tant que dépendances de développement car ils ne doivent être exécutés que sur une machine de développement. Certains hôtes avec des processus de construction automatisés peuvent vous demander d'utiliser des dépendances d'exécution standard.
Rendre votre première page
Créez un répertoire src
dans lequel tous les fichiers source résideront, puis créez un index . md
à l'intérieur. Ajoutez du contenu de page d'accueil tel que:
‐‐‐
titre: 11ty site de démarrage
‐‐‐
Ceci est un site Web de démonstration utilisant le [ 11ty site générateur statique ] (https://www.11ty.dev/) . Il affiche des pages, des articles de blog, des listes et des balises.
L'ensemble du processus de construction est géré via 11ty.
Le contenu entre les marqueurs de tableau de bord ‐‐‐
est connu sous le nom de avant-plan . Il définit les métadonnées nom-valeur de la page qui peuvent être utilisées pour définir les paramètres d'Eleventy et des modèles. Seul un titre
est défini ici, mais vous ajouterez sous peu des descriptions, des dates, des balises et d'autres données.
Un fichier de configuration Eleventy nommé .eleventy.js
doit être créé dans le dossier racine de votre projet. Cet exemple de code simple renvoie un objet, qui spécifie ce qui suit:
- le répertoire source
src
pour les fichiers source - le répertoire
build
où les fichiers du site Web seront créés
module . exports = config => {
return {
dir : {
entrée : 'src'
sortie : 'build'
}
} ;
} ;
Pour créer le site et démarrer un serveur de rechargement en direct optimisé par Browsersync entrez ce qui suit:
npx onze --serve
Eleventy restitue tout ce qu'il trouve dans le répertoire src
et affiche le contenu résultant dans build
:
$ npx onzeventy --serve
Écriture de build / index.html à partir de ./src/index.md.
A écrit 1 fichier en 0,12 seconde ( v0.11.0 )
Regarder .. .
[ Browsersync ] URL d'accès:
---------------------------------------
Local: http: // localhost: 8080
Externe: http://172.27.204.106:8080
---------------------------------------
Interface utilisateur: http: // localhost: 3001
Interface utilisateur externe: http: // localhost: 3001
---------------------------------------
[ Browsersync ] Fichiers à diffuser à partir de: build
Dans ce cas, un seul fichier build / index.html
est créé, accessible en chargeant l'URL http: // localhost: 8080 dans votre navigateur.
Le fichier HTML créé à build / index.html
contient le contenu rendu à partir du fichier de démarque à src / index.md
:
] < p > Ceci est un site Web de démonstration utilisant le < a href = " https: //www.11ty .dev / " > 11ty générateur de site statique </ a > . Il affiche des pages, des articles de blog, des listes et des balises. </ p >
< p > L'ensemble du processus de construction est géré via 11ty. </ p >
Le serveur Eleventy peut être arrêté avec Ctrl | Cmd + C .
Remarque: il est rarement nécessaire d'arrêter Eleventy pendant le développement du site, car les nouveaux fichiers sont automatiquement rendus. Cependant, les sections ci-dessous ajoutent d'autres options de configuration, donc un redémarrage est nécessaire.
Création de modèles
Eleventy peut utiliser presque n'importe quel moteur de création de modèles JavaScript. Nunchucks est une bonne option car il est complet et utilisé tout au long de la documentation à 11ty.dev .
Remplacez le début de src / index.md
par ceci:
‐‐‐
titre: 11ty site de démarrage
description: Il s'agit d'un site Web de démonstration généré à l'aide du générateur de site statique 11ty.
mise en page: page.njk
‐‐‐
Ceci indique à Eleventy d'utiliser le modèle page.njk
Nunchucks pour la mise en page. Par défaut, Eleventy recherche les modèles dans un sous-répertoire _includes
du répertoire source ( src /
). Tous les fichiers qui s'y trouvent ne sont pas rendus eux-mêmes mais sont utilisés pendant le processus de construction.
Créez ce nouveau modèle à src / _includes / page.njk
:
{% include "partials / htmlhead.njk "%}
< main >
{% block content%}
< h1 > {{title}} </ h1 >
{{contenu | sûr }}
{% endblock%}
</ main >
{% include "partials / htmlfoot.njk"%}
Le modèle place le titre
défini dans l'avant-propos de la page dans un en-tête
et remplace {{content}}
par le HTML généré à partir du Markdown. (Il utilise le safe
Nunchucks filter pour générer du HTML sans guillemets ni crochets.)
Les deux {% include%}
définitions de fichiers de référence inclus dans le modèle . Créez un fichier d'en-tête HTML à src / _includes / partials / htmlhead.njk
qui utilise également le titre de la page
et la description
:
< html lang = " en " >
< tête >
< meta charset = " UTF-8 " />
< meta name = " viewport " content = " width = device- largeur, échelle initiale = 1,0 " />
< titre > {{title}} </ titre >
< meta name = " description " content = " {{description} } " >
</ tête >
< carrosserie >
Ensuite, créez le pied de page HTML à src / _includes / partials / htmlfoot.njk
:
</ body >
</ html >
Arrêtez et redémarrez Eleventy avec npx eleventy --serve
.
Le fichier build index.html
contient désormais une page HTML entièrement formée:
< html lang = " en " >
< tête >
< meta charset = " UTF-8 " />
< meta name = " viewport " content = " width = device- largeur, échelle initiale = 1,0 " />
< title > 11ty starter site </ title >
< meta nom = " description " content = " Ceci est une démonstration site Web généré à l'aide du générateur de site statique 11ty. " >
</ tête >
< carrosserie >
< h1 > 11ty site de démarrage </ h1 >
< p > Ceci est un site Web de démonstration utilisant le < a href = " https: // www .11ty.dev / " > 11ty générateur de site statique </ a > . Il affiche des pages, des articles de blog, des listes et des balises. </ p >
< p > L'ensemble du processus de construction est géré via 11ty. </ p >
</ corps >
</ html >
Remarque: lorsque vous affichez la source dans un navigateur, vous verrez également qu'un a été ajouté par BrowserSync après l'élément Le module inline-source peut gérer toutes les situations pour vous. Installez-le avec ceci: Maintenant, ajoutez un nouveau fichier Enregistrez la transformation dans Ajoutez maintenant les attributs . Ceci est utilisé pour déclencher des rechargements en direct et ne sera pas présent dans la version finale (voir la section «Créer un site de production» ci-dessous).
Créer d'autres pages
Vous pouvez maintenant créer du contenu supplémentaire, tel qu'un "obligatoire" À propos de nous ».
src / about / index.md
:
‐‐‐
title: À propos de nous
description: Ce que nous faisons.
‐‐‐
Quelques informations sur nous.
src / about / team.md
:
‐‐‐
title: Notre équipe
description: Informations sur nous.
‐‐‐
Qui sommes-nous et ce que nous faisons.
src / about / privacy.md
:
Aucun de ces fichiers ne fait référence à un modèle dans leur présentation. Eleventy vous permet de définir les valeurs par défaut pour tous les fichiers d'un répertoire en créant un fichier ‐‐‐
title: Politique de confidentialité
description: Nous gardons vos coordonnées confidentielles.
‐‐‐
Notre politique de confidentialité.
.json
. Dans ce cas, il s’appelle src / about / about.json
. Il définit les valeurs JSON à utiliser lorsqu'elles ne sont pas explicitement définies dans la page d'accueil de la page:
Relancez {
"layout" : "page.njk"
}
npx eleventy --serve
et examinez le dossier build
pour voir comment le site commence à prendre forme:
Vous pouvez donc utiliser une URL de type slug dans votre navigateur. Par exemple, http: // localhost: 8080 / about / team / affiche le fichier de la page d'équipe index.html
: la page d'accueil about / index.html
: page à propos de nous about / team / index.html
: page d'équipe about / privacy / index.html
: page de politique de confidentialité index.html
.
Malheureusement, il est impossible de naviguer entre les pages! Vous avez besoin d'un menu…
Eleventy fournit un plug-in de navigation standard qui est installé en entrant ce qui suit:
Les plugins doivent être référencés dans votre fichier de configuration npm i @ 11ty / eleventy-navigation --save- dev
.eleventy.js
avant l'instruction finale return
:
module . exports = [19659033] config => {
config . addPlugin ( require ( '@ 11ty / eleventy-navigation' ) ) ;
return [19659035] {
dir : {
entrée : 'src'
sortie : 'build'
}
} ;
} ;
eleventyNavigation:
les sections préliminaires doivent être définies dans chaque page que vous souhaitez dans le menu. La section définit les éléments suivants:
La page d'accueil de la page d'accueil dans
pour le menu de la page. Cela peut être identique au titre
mais il est souvent plus court. facultatif
qui fait référence à la clé de la page parente
. numéro de commande
; les valeurs inférieures apparaissent en premier dans le menu. src / index.md
peut être mise à jour en conséquence:
La page à propos de ‐‐‐
titre: 11ty site de démarrage
description: Il s'agit d'un site Web de démonstration généré à l'aide du générateur de site statique 11ty.
mise en page: page.njk
onzeNavigation:
clé: maison
commande: 100
‐‐‐
src / about / index.md
:
La page de l'équipe à ‐‐‐
title: À propos de nous
description: Ce que nous faisons.
onzeNavigation:
clé: à propos
commande: 200
‐‐‐
src / about / team.md
:
La page de politique de confidentialité à ‐‐‐
title: Notre équipe
description: Informations sur nous.
onzeNavigation:
clé: équipe
parent: à propos
commande: 210
‐‐‐
src / about / privacy.md
:
Remarque: l'utilisation des valeurs ‐‐‐
title: Politique de confidentialité
description: Nous gardons vos coordonnées confidentielles.
onzeNavigation:
clé: confidentialité
parent: à propos
commande: 220
‐‐‐
order
en multiples de 10 ou plus permet d'insérer les pages entre les autres ultérieurement sans aucune renumérotation manuelle.
Un menu de navigation peut maintenant être ajouté à le modèle de page à src / _includes / page.njk
:
C'est un code magique du plugin Eleventy qui examine toutes les pages et les filtre avec une fonction {% include "partials / htmlhead.njk"%}
< en-tête >
< nav >
{{collections.all | eleventyNavigation | eleventyNavigationToHtml | sûr }}
</ nav >
</ en-tête >
< main >
...
eleventyNavigation ()
pour créer une liste hiérarchique. Le rendu de cette liste est rendu au format HTML à l'aide d'une fonction eleventyNavigationToHtml ()
.
Redémarrer npx eleventy --serve
charger n'importe quelle page pour afficher le menu.
eleventyNavigation
.
Améliorer la navigation
Le plugin de navigation renvoie une liste HTML de base:
Ce sera suffisant pour la plupart des sites, mais vous pouvez l'améliorer. Par exemple:
< ul >
< li > < a href = " / " > domicile </ a > </ li >
< li >
< a href = " / about / " > about </ a >
< ul >
< li > < a href = " / about / team / " > équipe </ a > </ li >
< li > < a href = " / about / privacy / " > confidentialité </ a > </ li >
</ ul >
</ li >
</ ul >
Une façon d'y parvenir est de créer un shortcode réutilisable qui sera familier à tous ceux qui ont utilisé WordPress. Un shortcode et tous les arguments facultatifs exécutent une fonction qui renvoie une chaîne HTML placée dans le modèle.
Arrêtez votre serveur Eleventy et mettez à jour le modèle src / _includes / page.njk
pour utiliser un {% navlist%}
shortcode dans les sections
et
:
Le shortcode {% include "partials / htmlhead.njk"%}
< en-tête >
< nav >
{% navlist collections.all | onzeventyNavigation, page, 1%}
</ nav >
</ en-tête >
< main >
{% block content%}
< h1 > {{title}} </ h1 >
{{contenu | sûr }}
{% endblock%}
</ main >
< pied de page >
< nav >
{% navlist collections.all | onzeventyNavigation, page, 2%}
</ nav >
</ pied de page >
{% include "partials / htmlfoot.njk"%}
navlist
reçoit trois paramètres:
Le shortcode eleventyNavigation ()
qui renvoie une liste hiérarchique d'objets page. Chaque page définit un tableau children
de sous-pages. actuelle
. facultatif
. Une valeur de 1
renvoie le HTML pour le niveau supérieur uniquement. 2
renvoie le niveau supérieur et toutes les pages enfants immédiates. navlist
doit être enregistré à l'aide d'une fonction .addShortcode ()
dans . eleventy.js
avant la déclaration return
. Il a passé un nom de shortcode et la fonction à appeler:
Vous pouvez maintenant exporter une fonction dans
config . addShortcode ( 'navlist' require ( '. /lib/shortcodes/navlist.js'[19659040[/)[19659040[/)[19659040Often;
lib / shortcodes / navlist.js
. Le code ci-dessous examine récursivement toutes les pages pour générer le HTML approprié (ne vous inquiétez pas si cela est difficile à suivre).
Remarque: le fichier shortcode a été créé en dehors du dossier src
puisqu'il ne fait pas partie du site, mais vous pouvez également le définir dans src / _includes
.
Relancez
const
listType = 'ul'
elementActive = 'fort'
classActive = 'actif'
classOpen = 'open' ;
module . exports = ( pageNav page maxLevel = 999 ]) => {
function navRecurse ( entry level = 1 ) {
let childPages = '' ;
if ( level < maxLevel ) [19659035] {
pour ( let enfant de entrée . enfants ) {
childPages + = navRecurse ( child level ++ ) ;
}
}
laissez
active = ( entrée . url === page . url )
classList = [] ;
if ( ( active && childPages ) || childPages . includes ( ` < $ { elementActive } > " ] ) ) classList . push ( classOpen ) ;
if ( active ) classList . push ( classActive ) ;
return (
'<li' +
( classList . length ? ` class =" $ { classList . join ( '' ) } "` : '' ) +
'> « +
( actif ? ` < $ { elementActive } > ` : ` < a href = " $ { entrée . url } "> " ) +
entrée . title +
( active ? ` </ $ { elementActive } > ` : '' ) +
( childPages ? « < $ { listType } > $ { childPages } </ $ { listType } > « : » ) +
«»
) [19659040];
}
let nav = '' ;
for ( let entry of pageNav ) {
nav + = navRecurse ( entry ) ;
}
return ` < $ { listType } > $ { nav } </ $ { listType } > ` ;
} ;
npx eleventy --serve
et accédez à la page About . L'en-tête
HTML contient désormais les éléments suivants:
Le pied de page < ul >
< li > < a href = " / " > domicile </ a > </ li >
< li class = " active " > < strong > environ </ strong > </ li >
</ ul >
HTML contient ceci:
< ul >
< li > < a href = " / " > domicile </ a > </ li >
< li class = " open active " >
< fort > environ </ fort >
< ul >
< li > < a href = " / about / team / " > équipe </ a > </ li >
< li > < a href = " / about / privacy / " > confidentialité </ a > </ li >
</ ul >
</ li >
</ ul >
Ajout d'articles / de billets de blog
Les articles ou articles de blog diffèrent des pages standard. Ils sont normalement datés et affichés sur une page d’index dans l’ordre chronologique inverse.
Créez un nouveau répertoire src / articles
et ajoutez des fichiers Markdown. Dans cet exemple, six fichiers nommés artice-01.md
à article-06.md
ont été créés, bien que vous utilisiez normalement de meilleurs noms pour créer des URL optimisées pour le référencement. .
Exemple de contenu pour article / article-01.md
:
Chaque message se voit attribuer une date et une ou plusieurs balises ( ‐‐‐
title: Le premier article
description: Ceci est le premier article.
date: 2020-09-01
Mots clés:
- HTML
- CSS
‐‐‐
Ceci est un article d'article.
## Sous-titre
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
HTML
et CSS
sont utilisées ici). Eleventy crée automatiquement une collection pour chaque balise. Par exemple, une collection HTML
est un tableau de tous les articles balisés avec HTML
. Vous pouvez utiliser cette collection pour indexer ou afficher ces pages de manière intéressante.
Le fichier article-06.md
le plus récent a une valeur brouillon
définie et une date dans l'extrême futur:
Ceci indique que le message ne doit pas être publié (sur le site en ligne) tant que la date n'est pas passée et que le ‐‐‐
title: Le sixième article
description: Ceci est le sixième article.
brouillon: vrai
date: 2029-09-06
Mots clés:
- HTML
- CSS
- JavaScript
‐‐‐
brouillon
n'a pas été supprimé. Eleventy n'implémente pas cette fonctionnalité, vous devez donc créer votre propre collection personnalisée qui omet les brouillons de messages.
Ajoutez quelques lignes en haut de .eleventy.js
pour détecter le mode de développement et renvoyer le date / heure actuelle:
Définissez ensuite une collection nommée
const
dev = global . dev = ( process . env . ELEVENTY_ENV == = 'développement' )
maintenant = nouvelle Date () ;
module . exports = config => {
...
}
post
en appelant .addCollection ()
avant l'instruction return
. Le code suivant extrait tous les fichiers md
dans le répertoire src / articles
mais supprime tout endroit où draft
ou une date de publication future est définie (sauf si vous utilisez le développement mode):
Créez un nouveau modèle
config . addCollection ( 'post' collection =>
collection
. getFilteredByGlob ( './ src / articles / *. Md' )
. filter ( p = > dev || (! p . data . draft && p . date <= maintenant ) )
) ;
src / _includes / post.njk
pour les messages. Ceci est basé sur le modèle page.njk
mais le bloc content
affiche également la date de l'article, le nombre de mots et les liens suivant / précédent extraits de ce message
collection:
Enfin, définissez un fichier {% étend "page.njk"%}
{% block content%}
< h1 > {{title}} </ h1 >
{% if date%} < p class = " time " > < time datetime = " {{date}} " > {{date}} </ time > </ p > {% endif%}
< p class = " words " > {{content | wordcount}} mots </ p >
{{contenu | sûr }}
{% set nextPost = collections.post | getNextCollectionItem (page)%}
{% if nextPost%} < p > Article suivant: < a href = " {{nextPost .url}} " > {{nextPost.data.title}} </ a > </ p > {% endif%}
{% set previousPost = collections.post | getPreviousCollectionItem (page)%}
{% if previousPost%} < p > Article précédent: < a href = " {{previousPost .url}} " > {{previousPost.data.title}} </ a > </ p > {% endif%}
{% endblock%}
src / articles / article.json
pour définir post.njk
comme modèle par défaut:
Exécutez {
"layout" : "post.njk"
}
npx eleventy --serve
et accédez à http: // localhost: 8080 / articles / article-01 / :
messages
collection créée ci-dessus.
Créez un nouveau fichier à src / articles / index.md
avec le contenu suivant:
La configuration de l'avant-plan effectue les opérations suivantes:
‐‐‐
title: Index des articles
description: Une liste d'articles publiés sur ce site.
mise en page: page.njk
onzeNavigation:
clé: articles
commande: 900
pagination:
données: collections.post
alias: pagelist
inverse: vrai
taille: 3
‐‐‐
Les articles suivants sont disponibles.
Modifiez maintenant le bloc page.njk
. articles
. pagelist
à partir de collections.post
l'inverse (les messages les plus récents en premier) et autorise jusqu'à trois éléments par page. Avec six articles, Eleventy générera deux pages avec trois articles sur chacun. content
dans src / _includes / page.njk
pour inclure un nouveau pagelist.njk
partiel:
Créez ce partiel à {% block content%}
< h1 > {{title}} </ h1 >
{{contenu | sûr }}
{% include "partials / pagelist.njk"%}
{% endblock%}
src / _includes / partials / pagelist.njk
avec du code pour parcourir l'objet de pagination pagelist
et afficher le lien, le titre, la date et la description de chaque article:
Sous ce code, vous pouvez ajouter les liens suivant et précédent pour naviguer dans l'index paginé:
{% if pagelist%}
< à part classe = " pagelist " >
{% - pour le message dans la liste de pages -%}
< article >
< h2 > < a href = " {{post.url}} " > {{post.data.title}} </ a > </ h2 >
{% if post.data.date%} < p class = " time " > [19659060] < time datetime = " {{post.data.date}} " > {{post.data. date}} </ heure > </ p > {% endif%}
< p > {{post.data.description}} </ p >
</ article >
{% - endfor -%}
</ mis à part >
{% fin si %}
Avant de redémarrer le processus de construction, définissez la variable d'environnement {% si pagination.href.previous ou pagination.href.next %}
< nav class = " pagenav " >
{% if pagination.href.previous%}
< p > < a href = " {{pagination.href.previous}} " > précédent </ a > </ p >
{% fin si %}
{% if pagination.href.next%}
< p > < a href = " {{pagination.href.next}} " > suivant </ a > </ p >
{% fin si %}
</ nav >
{% fin si %}
ELEVENTY_ENV
sur development
pour vous assurer que les brouillons et les publications futures sont inclus dans la construction. Sous Linux / macOS, entrez:
ou à l'invite Windows ELEVENTY_ENV = development
cmd
:
ou Windows Powershell:
set ELEVENTY_ENV = development
Relancez $ env : ELEVENTY_ENV = "development"
npx eleventy --serve
et actualisez votre navigateur. Un nouveau lien articles sera apparu dans le menu qui affiche les trois articles les plus récents sur http: // localhost: 8080 / articles / :
Creating Custom Filters
] Les captures d'écran ci-dessus montrent les dates sous forme de chaînes JavaScript peu conviviales. Eleventy fournit des filtres qui peuvent modifier les données et renvoyer une chaîne. Vous l'avez déjà vu utilisé lorsque le contenu généré par Markdown est passé à travers un filtre sûr
pour générer du HTML non codé: {{content | safe}}
.
Créez un nouveau fichier lib / filters / dateformat.js
avec le code suivant. Il exporte deux fonctions:
ymd ()
qui convertit une date en format lisible par machine YYYY-MM-DD
pour l'attribut HTML datetime
et friendly ()
qui convertit une date en un format lisible par l'homme, par ex. 1er janvier 2020
.
Vous pouvez également créer un filtre qui affiche le nombre de mots dans un article arrondi à la dizaine supérieure et formaté avec des séparateurs par virgule ainsi que le temps de lecture estimé. Créez
const toMonth = new Intl . DateTimeFormat ( ' fr ' { mois : ' long ' } ) ;
module . exportations . ymd = date => (
date instanceof Date ?
` $ { date . getUTCFullYear () } - $ { Chaîne ( date . getUTCMonth () + 1 ) ) [19659040]. padStart ( 2 '0' ) } - $ { String ] ( date . getUTCDate () ) . padStart ( 2 » 0 ') } « : »
) ;
module . exportations . amical = date => (
date instanceof Date ?
date . getUTCDate () + '' + au mois . format ( date ) + ',' + date . getUTCFullYear () : ''
) ;
lib / filters / readtime.js
avec le code suivant:
Enregistrez les filtres dans
const
roundTo = 10
readPerMin = 200
numFormat = nouveau Intl . NumberFormat ( 'en' ) ;
module . exports = count => {
const
words = Math . ceil ( count / roundTo ) * roundTo
mins = Math . ceil ( count / readPerMin ) ;
return `[19659469] $ { numFormat . format ( mots ) } mots, $ { numFormat . format ( min ) } -minute read " ;
} ;
.eleventy.js
n'importe où avant l'instruction return
:
Puis mettez à jour
const dateformat = require ] ( './ lib / filters / dateformat' ) ;
config . addFilter ( 'datefriendly' dateformat . friendly ) ;
config . addFilter ( 'dateymd' dateformat . ymd ) ;
config . addFilter ( 'readtime' require ( './ lib / filters / readtime' ) ) ;
src / _includes / post.njk
pour utiliser les filtres dateymd
datefriendly
et readtime
:
Puis changez l'index partiel de l'article à {% if date%} < p class = " time " > < heure datetime = " {{date | dateymd}} " > {{date | datefriendly}} </ heure > </ p > {% endif%}
< p class = " words " > {{content | wordcount | heure de lecture}} </ p >
src / _includes / partials / pagelist.njk
pour utiliser les filtres dateymd
et datefriendly
:
Redémarrez la compilation avec {[19659225]% if post . data . date % } < p class = "time" > < time datetime = "{{post.data.date | dateymd}}" > { ] { post . data . date | datefriendly } } < / time > < / p > {% endif % }
npx eleventy --serve
et actualisez votre navigateur. Chargez n'importe quel article pour voir des dates conviviales, un nombre de mots formaté et une estimation du temps de lecture:
< p class [19659062] = " heure " > < time datetime = " 2020- 09-05 " > 5 septembre 2020 </ time > </ p >
< p class = " words " > 80 mots, 1 minute de lecture </ p >
Traiter les images avec des modèles JavaScript
Eleventy peut copier des fichiers de n'importe quel dossier en utilisant la fonction .addPassthroughCopy ()
dans .eleventy.js
. Par exemple, pour copier tous les fichiers de src / images /
vers build / images /
vous ajouteriez:
Cela peut convenir si vos images sont déjà optimisées, mais l'optimisation automatique au moment de la construction garantit des réductions de fichiers. À ce stade, les développeurs se tournent souvent vers un autre système tel que config . addPassthroughCopy ( 'src / images' ) ;
npm
scripts, webpack ou Gulp.js, mais cela peut ne pas être nécessaire.
JavaScript est une option de création de modèles de premier ordre dans Eleventy . Tout fichier se terminant par .11ty.js
sera traité lors de la construction. Le fichier doit exporter une classe JavaScript
avec:
Pour réduire la taille des images, installez imagemin et des plugins pour Fichiers JPEG PNG et SVG :
data ()
qui renvoie les paramètres de front-matière sous forme d'objet JavaScript render ()
- qui renvoie généralement une chaîne, mais qui peut également exécuter des processus synchrones ou asynchrones et renvoyer true
.
Créez un répertoire npm i imagemin imagemin-mozjpeg imagemin-pngquant imagemin-svgo --save-dev
images
dans src
ajoutez quelques images, puis créez un nouveau fichier src / images / images.11ty.js
avec le code suivant :
Relancez
const
dest = './ build / images'
fsp = require ( 'fs' ) . promises
imagemin = require ( 'imagemin' )
plugins = [
require ( 'imagemin-mozjpeg' ) ()
require ([19659248] 'imagemin-pngquant' ) ( { strip : true } )
require ( 'imagemin-svgo' ) ()
] ;
module . exports = class {
data () {
return {
permalien : false
eleventyExcludeFromCollections : true
} ;
}
async render () {
try {[19659439] laissez dir = attendre fsp . stat ( dest ) ;
if ( dir . isDirectory () ) return true ;
}
catch ( e ) {}
console . log ( 'optimizing images' ) ;
attendent imagemin ( [ 'src / images / *' '! Src / images / *. Js' ] {
destination : dest
plugins
} ) ;
return true ;
}
} ;
npx eleventy --serve
et les versions optimisées de vos images seront copiées dans le dossier build / images /
.
Remarque: le code ci-dessus se termine si un répertoire build / images
est trouvé. Il s'agit d'une solution simple pour abandonner le retraitement des mêmes images à chaque build et garantir qu'Eleventy reste rapide. Si vous ajoutez d'autres images, supprimez d'abord le dossier build / images
pour vous assurer qu'elles sont toutes générées. De meilleures options sont disponibles, mais elles nécessitent beaucoup plus de code!
Des images peuvent maintenant être ajoutées dans des fichiers Markdown ou des modèles. Par exemple, le
défini dans src / _includes / page.njk
peut avoir un logo et une image de héros:
Une valeur < header >
< p class = " logo " > < a href = " / " > < img src = " / images / logo.svg " largeur = " 50 " hauteur = " 50 " alt = " 11ty starter " > 11ty starter </ a > </ p >
< nav >
{% navlist collections.all | onzeventyNavigation, page, 1%}
</ nav >
< chiffre > < img src = " / images / {% if hero%} {{hero }} {% else%} orb.jpg {% endif%} " largeur = " 400 " hauteur [19659062] = " 300 " alt = " décoration " /> [19659060] </ chiffre >
</ en-tête >
hero
peut être définie dans l'avant-plan si nécessaire - par exemple, dans src / articles / articles.json
:
{
"layout" : "post.njk"
"hero" : "phone.jpg"
}
Traiter le CSS avec des transformations
Vous pourriez traiter le CSS de la même manière ou utiliser tout autre système de construction. Cependant, Onze transformations sont une bonne option dans cette situation. Les transformations sont des fonctions qui reçoivent le contenu de la chaîne rendue actuelle et un chemin de fichier. Ils renvoient ensuite une version modifiée de ce contenu.
J'ai envisagé d'utiliser Sass pour le prétraitement CSS, mais PostCSS avec quelques plugins peut implémenter une alternative légère qui prend toujours en charge les partiels, les variables , mixins et nidification. Installez les modules PostCSS dans votre projet:
Puis créez un fichier npm i postcss postcss-advanced-variables postcss-nested postcss-scss cssnano --save-dev
lib / transforms / postcss.js
avec le code suivant. Il vérifie qu'un fichier .css
est passé avant le traitement, la réduction et l'ajout de cartes source lorsque la construction s'exécute en mode development
:
La transformation doit être enregistrée à l'aide d'une fonction
const
postcss = require ( 'postcss' )
postcssPlugins = [
require ( 'postcss-advanced-variables' )
require ( 'postcss-nested «)
require (« cssnano »)
]
postcssOptions = {
de : 'src / scss / entry.scss'
syntaxe : require ( 'postcss-scss' )
carte : dev ? { inline : true } : false
} ;
module . exports = async ( content outputPath ) => {
if (! Chaîne ( outputPath ) . endsWith ( '. Css' ) ) return content ;
return (
await postcss ( postcssPlugins ) . process [19659040] ( content postcssOptions )
) . css ;
} ;
.addTransform ()
dans .eleventy.js
avant l'instruction return
. Un appel .addWatchTarget ()
déclenchera une reconstruction complète du site chaque fois qu'un fichier change dans le répertoire src / scss /
:
Créez un fichier
config . addTransform ] ( 'postcss' require ( './ lib / transforms / postcss' ) ) ;
config . addWatchTarget ( './ src / scss /' ) ;
src / scss / main.scss
et incluez le code SCSS ou CSS dont vous avez besoin. L'exemple de code importe d'autres fichiers SCSS:
Eleventy ne traitera pas les fichiers CSS ou SCSS directement, vous devez donc créer un nouveau fichier modèle à
@import '01 -settings / _variables ';
@import '01 -settings / _mixins' [19659040];
@import '02 -generic / _reset ';
@import '03 -elements / _primary' ;
src / scss / main.njk
avec le code suivant:
Ceci importe votre fichier ‐‐‐
permalien: /css/main.css
eleventyExcludeFromCollections: true
‐‐‐
@import 'main.scss';
main.scss
et le restitue dans build / css / main.css
avant que la fonction de transformation ne le traite en conséquence. Des fichiers SCSS / CSS et .njk
similaires peuvent être créés si vous avez besoin de plusieurs fichiers CSS.
Réexécutez npx eleventy --serve
et vérifiez le contenu des fichiers CSS construit à build / css / main.css
. La carte source garantit que l'emplacement du fichier source d'origine de la déclaration CSS est disponible lors de l'inspection des styles dans les outils de développement de votre navigateur.
Minification du HTML avec des transformations
Une transformation similaire peut être utilisée pour réduire le HTML avec html-minifier ]. Installez-le comme ceci:
Créez un nouveau fichier npm i html-minifier --save-dev
lib / transforms / htmlminify.js
avec le code suivant. Il vérifie qu'un fichier .html
est en cours de traitement et renvoie une version minifiée:
Comme précédemment, enregistrez la transformation dans
const htmlmin = require ( 'html- minifier ») ;
module . exports = ( content outputPath = '. html' ) => [19659035] {
if (! String ( outputPath ) . endsWith ( '. Html' ) ) return content ;
return htmlmin . minify ( content ] {
useShortDoctype : true
removeComments : true
collapseWhitespace : true
} ) ;
} ;
.eleventy.js
quelque part avant l'instruction return
:
Remarque: vous pourriez envisager de ne pas réduire ou même embellir HTML pendant le développement. Cela dit, les espaces HTML peuvent affecter le rendu du navigateur. Il est donc généralement préférable de créer le code de la même manière que pour la production. La visualisation de la source deviendra plus difficile, mais les outils de développement de navigateur affichent le DOM résultant.
config . addTransform ( ] 'htmlminify' require ( './ lib / transforms / htmlminify' ) ) ;
Inlining Assets with Transforms
Il est souvent nécessaire d'intégrer d'autres éléments dans votre code HTML. Les SVG sont des candidats de premier ordre car les images font partie du DOM et peuvent être manipulées avec CSS. Il peut également être pratique de réduire les requêtes HTTP en insérant du CSS dans les éléments
du JavaScript dans les éléments ou des images encodées en base64 dans les éléments .
npm i inline-source --save-dev
lib / transforms / inline.js
avec le code suivant pour vérifier et traiter le contenu HTML:
const { inlineSource } = requiert ( 'inline-source' ) ;
module . exports = async ( content outputPath ) => {
if (! Chaîne ( outputPath ) . endsWith ( '. Html' ) ) return content ;
return await inlineSource ( content {
compress : true
rootpath : './ build /'
} ) ;
} ;
.eleventy.js
avant l'instruction return
:
config . addTransform ( 'inline' nécessitent ( './ lib / transforms / inline' ) ) ;
en ligne
à n'importe quelle balise ou . Par exemple:
Lors de la construction, la transformation remplacera la balise < img src = " /images/logo.svg " width = " 50 " hauteur = " 50 " alt = " 11ty starter " inline >
par le code importé
.
Traitement JavaScript avec des modèles JavaScript
Le JavaScript côté client peut être géré par une transformation, mais les modèles JavaScript nommés .11ty.js
sont également une option car ils sont automatiquement traités par Eleventy (voir la section «Traiter les images avec des modèles JavaScript» ci-dessus).
L'exemple de code fournit ES6 scripts pour implémenter un simple changement de thème sombre / clair. Rollup.js est utilisé pour regrouper tous les modules référencés par main.js
dans un seul fichier et effectuer tree-shaking pour supprimer toutes les fonctions inutilisées. Le plugin terser réduit ensuite le code résultant.
Installez les modules Rollup.js avec les éléments suivants:
Créez ensuite un répertoire npm i rollup rollup-plugin-terser --save-dev
js
dans src
et ajoutez vos scripts ES6. Un seul script d'entrée src / js / main.js
doit être défini qui en importe les autres. Par exemple:
Créez un nouveau fichier import * as theme from './ lib / theme.js' ;
src / js / javascript.11ty.js
avec le code suivant pour traiter src / js / main.js
en un seul bundle et ajoutez une carte source lors de la construction en mode développement:
Any changes to your JavaScript files can trigger rebuilds by adding the following line to
const
jsMain = 'js / main.js'
rollup = requiert ( 'rollup' )
terser = require ( 'rollup-plugin-terser' ) . terser
inputOpts = {
entrée : './ src /' + jsMain
}
outputOpts = {
format : 'es'
sourcemap : dev
plugins : [
terser ( {
mangle : {
toplevel : true
}
compresser : {
drop_console : ! dev
drop_debugger : ! dev
}
output: {
quote_style: 1
}
})
]
}
;
module.exports = class {
data() {
return {
permalink: jsMain,
eleventyExcludeFromCollections: true
};
}
async render() {
const
bundle = await rollup.rollup(inputOpts),
{ output } = await bundle.generate(outputOpts),
out = output.length && output[0];
let code = '';
if (out) {
code = out.code;
if (out.map) {
let b64 = new Buffer.from(out.map.toString());
code += '//# sourceMappingURL=data:application/json;base64,' + b64.toString('base64');
}
}
return code;
}
};
.eleventy.js
before the return
:
The resulting script can then be included in your pages — for example, in config.addWatchTarget('./src/js/');
src/_includes/partials/htmlfoot.njk
:
Note: the sample code builds ES6 modules rather than transpiling to ES5. The script is smaller, but browser compatibility will be more limited. That said, it’s a progressive enhancement and the site works without JavaScript.
Restart <script type="module" src="/js/main.js"></script>
</ corps >
</ html >
npx eleventy --serve
and your minified script will load and run. The final site can now be viewed in its award-winning glory:
Build a Production Site
Once you’re happy with your site, you can build it in production mode without source maps and other development options.
Delete the build
folder and set ELEVENTY_ENV
to production
on Linux/macOS:
or the Windows ELEVENTY_ENV=production
cmd
prompt:
or Windows Powershell:
set ELEVENTY_ENV=production
Then run $env:ELEVENTY_ENV="production"
npx eleventy
to build the full site.
The resulting files in the /build
directory can be uploaded to any host. Some static site specialist services can automatically build and publish your site whenever new code is pushed to GitHub or similar repositories.
Your Next Steps with Eleventy
This example project demonstrates the basics of Eleventy with some options for building different types of content. However, Eleventy is flexible, and you’re free to use whatever techniques you prefer. There are dozens of starter projects and each takes a slightly different approach.
Suggestions for further site features:
feed.xml
file listing all posts.sitemap.xml
file listing all pages..htaccess
file for Apache).favicon.ico
or a service worker.Is Eleventy for You?
Static site generators are an ideal solution for any web site that primarily serves content which does not change too frequently. Pages can be versioned in Git repositories, development is easier to control, testing is simple, performance is excellent, and security issues disappear. (I get immense joy laughing at all the failed wp-login.php
attempts in server logs!)
There are many SSGs to choose frombut Eleventy is a great choice if you:
Good luck!
Source link