Site icon Blog ARC Optimizer

Premiers pas avec Eleventy –


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:

  1. le répertoire source src pour les fichiers source
  2. 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 . 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 :
 ‐‐‐
title: Politique de confidentialité
description: Nous gardons vos coordonnées confidentielles.
‐‐‐

Notre politique de confidentialité.
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 .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:
 {
   "layout" :   "page.njk" 
} 
Relancez npx eleventy --serve et examinez le dossier build pour voir comment le site commence à prendre forme:
  • 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é
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 . 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:
 npm  i @ 11ty / eleventy-navigation --save- dev
Les plugins doivent être référencés dans votre fichier de configuration .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:
  1. Une touche pour le menu de la page. Cela peut être identique au titre mais il est souvent plus court.
  2. Un parent facultatif qui fait référence à la clé de la page parente .
  3. Un
  4. facultatif numéro de commande ; les valeurs inférieures apparaissent en premier dans le menu.
La ​​page d'accueil de la page d'accueil dans src / index.md peut être mise à jour en conséquence:
 ‐‐‐
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
‐‐‐
La page à propos de src / about / index.md :
 ‐‐‐
title: À propos de nous
description: Ce que nous faisons.
onzeNavigation:
  clé: à propos
  commande: 200
‐‐‐
La page de l'équipe à src / about / team.md :
 ‐‐‐
title: Notre équipe
description: Informations sur nous.
onzeNavigation:
  clé: équipe
  parent: à propos
  commande: 210
‐‐‐
La page de politique de confidentialité à src / about / privacy.md :
 ‐‐‐
title: Politique de confidentialité
description: Nous gardons vos coordonnées confidentielles.
onzeNavigation:
  clé: confidentialité
  parent: à propos
  commande: 220
‐‐‐
Remarque: l'utilisation des valeurs 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 :
 {% include "partials / htmlhead.njk"%}

 < en-tête > 
   < nav > 
    {{collections.all | eleventyNavigation | eleventyNavigationToHtml | sûr }}
   </  nav > 
 </  en-tête > 

 < main > 
...
C'est un code magique du plugin Eleventy qui examine toutes les pages et les filtre avec une fonction 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. Vous pouvez maintenant accéder à n'importe quelle page définie dans les pages préliminaires de eleventyNavigation .

Améliorer la navigation

Le plugin de navigation renvoie une liste HTML de base:
 < 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 > 
Ce sera suffisant pour la plupart des sites, mais vous pouvez l'améliorer. Par exemple:
  • offre une option pour afficher le menu à un niveau spécifique - tel que le niveau supérieur uniquement dans l'en-tête et toutes les pages du pied de page
  • mettre en évidence la page active tout en la rendant non cliquable
  • définir les classes de style pour les éléments de menu actifs et ouverts.
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
:
 {% 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"%}
Le shortcode navlist reçoit trois paramètres:
  1. Chaque page filtrée via la fonction eleventyNavigation () qui renvoie une liste hiérarchique d'objets page. Chaque page définit un tableau children de sous-pages.
  2. La page actuelle .
  3. Un niveau 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.
Le shortcode 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:
  

  
   config .  addShortcode  ( 'navlist'   require  ( '. /lib/shortcodes/navlist.js'[19659040[/)[19659040[/)[19659040Often;
Vous pouvez maintenant exporter une fonction dans 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 .

  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 }  >  ` ; 

} ; 
Relancez npx eleventy --serve et accédez à la page About . L'en-tête HTML contient désormais les éléments suivants:
 < ul > 
   < li >   < a   href  =  " / "  >  domicile  </  a >   </  li > 
   < li   class  =  " active "  >   < strong >  environ  </  strong >   </  li > 
 </  ul > 
Le pied de page 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 :
 ‐‐‐
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.
Chaque message se voit attribuer une date et une ou plusieurs balises ( 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:
 ‐‐‐
title: Le sixième article
description: Ceci est le sixième article.
brouillon: vrai
date: 2029-09-06
Mots clés:
   -  HTML
   -  CSS
   -  JavaScript
‐‐‐
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 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:

  const 
  dev  =  global .  dev    =   ( process .  env .  ELEVENTY_ENV   == =   'développement' ) 
  maintenant  =   nouvelle   Date  () ; 

module .  exports   =   config   =>   {
 ... 
} 
Définissez ensuite une collection nommée 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):
  
   config .  addCollection  ( 'post'   collection   => 

    collection
      .  getFilteredByGlob  ( './ src / articles / *. Md' ) 
      .  filter  ( p   = >  dev  ||   (!  p .  data .  draft   &&  p .  date   <=  maintenant ) ) 

  ) ; 
Créez un nouveau modèle 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:
 {% é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%}
Enfin, définissez un fichier src / articles / article.json pour définir post.njk comme modèle par défaut:
 {
   "layout"  :   "post.njk" 
} 
Exécutez npx eleventy --serve et accédez à http: // localhost: 8080 / articles / article-01 / : http: // localhost: 8080 / articles / pour afficher tous les messages dans l'ordre chronologique inverse (le plus récent en premier). Eleventy fournit une fonction pagination qui peut créer n'importe quel nombre de pages en parcourant un ensemble de données - comme les messages collection créée ci-dessus. Créez un nouveau fichier à src / articles / index.md avec le contenu suivant:
 ‐‐‐
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.
La configuration de l'avant-plan effectue les opérations suivantes:
  1. Elle définit le modèle standard page.njk .
  2. Elle ajoute la page en tant qu'élément de menu articles .
  3. ] Il crée une liste nommée 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.
Modifiez maintenant le bloc content dans src / _includes / page.njk pour inclure un nouveau pagelist.njk partiel:
 {% block content%}

   < h1 >  {{title}}  </  h1 > 

  {{contenu | sûr }}

  {% include "partials / pagelist.njk"%}

{% endblock%}
Créez ce partiel à 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:
 {% 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 %}
Sous ce code, vous pouvez ajouter les liens suivant et précédent pour naviguer dans l'index paginé:
 {% 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 %}
Avant de redémarrer le processus de construction, définissez la variable d'environnement ELEVENTY_ENV sur development pour vous assurer que les brouillons et les publications futures sont inclus dans la construction. Sous Linux / macOS, entrez:
  ELEVENTY_ENV  =  development
ou à l'invite Windows cmd :
  set   ELEVENTY_ENV  =  development
ou Windows Powershell:
  $ env : ELEVENTY_ENV  =  "development" 
Relancez 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 / : Le lien next mène à une autre page d'articles sur http: // localhost: 8080 / articles / 1 / .

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:
  1. ymd () qui convertit une date en format lisible par machine YYYY-MM-DD pour l'attribut HTML datetime et
  2. friendly () qui convertit une date en un format lisible par l'homme, par ex. 1er janvier 2020 .

  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  ()  :   '' 

 ) ; 
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 lib / filters / readtime.js avec le code suivant:

  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  " ; 

}  ; 
Enregistrez les filtres dans .eleventy.js n'importe où avant l'instruction return :
  

  
    const  dateformat  =   require  ] ( './ lib / filters / dateformat' ) ; 
  config .  addFilter  ( 'datefriendly'  dateformat .  friendly ) ; 
  config .  addFilter  ( 'dateymd'  dateformat .  ymd ) ; 

  
  config .  addFilter  ( 'readtime'   require  ( './ lib / filters / readtime' )  ) ; 
Puis mettez à jour src / _includes / post.njk pour utiliser les filtres dateymd datefriendly et readtime :
 {% if date%}  < p   class  =  " time "  >   < heure   datetime  =  " {{date | dateymd}} "  >  {{date | datefriendly}}  </  heure >   </  p >  {% endif%}

   < p   class  =  " words "  >  {{content | wordcount | heure de lecture}}  </  p > 
Puis changez l'index partiel de l'article à src / _includes / partials / pagelist.njk pour utiliser les filtres dateymd et datefriendly :
 {[19659225]%   if  post .  data .  date  % }  < p  class  =  "time" >  < time datetime  =  "{{post.data.date | dateymd}}" >  { ] { post .  data .  date   |  datefriendly } }  < /  time >  < /  p >  {%  endif % } 
Redémarrez la compilation avec 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: Le HTML résultant:
 < 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:
 config .  addPassthroughCopy  (  'src / images' ) ; 
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 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:
  1. une méthode data () qui renvoie les paramètres de front-matière sous forme d'objet JavaScript
  2. a render () - qui renvoie généralement une chaîne, mais qui peut également exécuter des processus synchrones ou asynchrones et renvoyer true .
Pour réduire la taille des images, installez imagemin et des plugins pour Fichiers JPEG PNG et SVG :
 npm  i imagemin imagemin-mozjpeg imagemin-pngquant imagemin-svgo --save-dev
Créez un répertoire images dans src ajoutez quelques images, puis créez un nouveau fichier src / images / images.11ty.js avec le code suivant :

  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 ; 

  } 
} ; 
Relancez 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:
 < 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 > 
Une valeur 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:
 npm  i postcss postcss-advanced-variables postcss-nested postcss-scss cssnano --save-dev
Puis créez un fichier 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 :




 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 ; 

} ; 
La transformation doit être enregistrée à l'aide d'une fonction .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 / :
  
   config .  addTransform  ] ( 'postcss'   require  ( './ lib / transforms / postcss' ) ) ; 
  config .  addWatchTarget  ( './ src / scss /' ) ; 
Créez un fichier src / scss / main.scss et incluez le code SCSS ou CSS dont vous avez besoin. L'exemple de code importe d'autres fichiers SCSS:

 @import   '01 -settings / _variables '; 
 @import   '01 -settings / _mixins' [19659040]; 


 @import   '02 -generic / _reset '; 


 @import   '03 -elements / _primary' ; 


Eleventy ne traitera pas les fichiers CSS ou SCSS directement, vous devez donc créer un nouveau fichier modèle à src / scss / main.njk avec le code suivant:
 ‐‐‐
permalien: /css/main.css
eleventyExcludeFromCollections: true
‐‐‐
@import 'main.scss';
Ceci importe votre fichier 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:
 npm  i html-minifier --save-dev
Créez un nouveau fichier 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:

  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 
  } ) ; 

} ; 
Comme précédemment, enregistrez la transformation dans .eleventy.js quelque part avant l'instruction return :
  
   config .  addTransform  ( ] 'htmlminify'   require  ( './ lib / transforms / htmlminify' ) ) ; 
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.

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 .

Le module inline-source peut gérer toutes les situations pour vous. Installez-le avec ceci:

 npm  i inline-source --save-dev

Maintenant, ajoutez un nouveau fichier 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 /' 
  } ) ; 

} ; 

Enregistrez la transformation dans .eleventy.js avant l'instruction return :

  
   config .  addTransform  ( 'inline'   nécessitent  ( './ lib / transforms / inline' ) ) ; 

Ajoutez maintenant les attributs en ligne à n'importe quelle balise ou . Par exemple:

 < img   src  =  " /images/logo.svg "   width  =  " 50 "   hauteur  =  " 50 "   alt  =  " 11ty starter  "  inline > 
Lors de la construction, la transformation remplacera la balise 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:
 npm  i rollup rollup-plugin-terser --save-dev
Créez ensuite un répertoire 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:
  import   *   as  theme  from   './ lib / theme.js' ; 
Créez un nouveau fichier 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:




 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;

  }
};
Any changes to your JavaScript files can trigger rebuilds by adding the following line to .eleventy.js before the return:
  config.addWatchTarget('./src/js/');
The resulting script can then be included in your pages — for example, in src/_includes/partials/htmlfoot.njk:
<script type="module" src="/js/main.js"></script>

 </  corps > 
 </  html > 
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 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:
ELEVENTY_ENV=production
or the Windows cmd prompt:
set ELEVENTY_ENV=production
or Windows Powershell:
$env:ELEVENTY_ENV="production"
Then run 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:
  • Create an index page for each tag listing the associated articles. Remember Eleventy automatically creates separate collections for each tag.
  • Generate an RSS feed.xml file listing all posts.
  • Create a sitemap.xml file listing all pages.
  • Build a 404 error page and generate appropriate code to handle it (such as an .htaccess file for Apache).
  • Generate other root files such as favicon.ico or a service worker.
  • Use Eleventy’s pagination feature to generate pages from data.
  • And score bonus points for importing WordPress content into static pages.

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:
  • are new to SSGs or unhappy with your current option
  • like Node.js and want to use JavaScript during development
  • want to jump on the latest cool thing!
Good luck!




Source link

Quitter la version mobile