Vier Killer-Features von Nunjucks

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Nunjucks nennt sich selbst „Eine reichhaltige und mächtige Template-Sprache für JavaScript“, was ziemlich treffend klingt. Es ist nicht absichtlich super leichtgewichtig wie Mustache oder das etwas robustere (aber immer noch recht leichte) Handlebars. Es ist eine vollwertige Sprache, vollgepackt mit allem, was man beim Schreiben von Templates gebrauchen könnte.

Man *kann* es im Browser ausführen, aber man sollte es wahrscheinlich nicht. Dies ist dafür gedacht, in Node.js ausgeführt und zum serverseitigen Kompilieren von Templates verwendet zu werden.

Anders ausgedrückt: Es ist ein richtig schicker HTML-Präprozessor. Schauen wir uns einige Features an, die ich an Nunjucks besonders cool finde.

Ehrliche Warnung: Das ist sehr subjektiv und basiert auf nur geringer Erfahrung! Ich nutze hier nur etwa 10% dessen, wozu Nunjucks fähig ist!

Nunjucks ist ein Node-Ding, also installiert man es mit npm und arbeitet damit über die Kommandozeile, Build-Tools und diese ganze Welt.

Hier ist ein einzelner Screenshot, der zeigt, wie ich ein Node-Skript ausführe, das ein Nunjucks-Template rendert

Ich habe mein Node-Skript ausgeführt, das die Ergebnisse von nunjucks.render() in die Konsole ausgibt

1. Es ist nur HTML

Beachten Sie, dass die Datei, die wir an nunjucks.render() übergeben haben, eigentlich nur HTML mit einer {{ handlebars }}-ähnlichen Template-Syntax war. Ich habe sie `index.njk` genannt, aber das ist nicht wirklich notwendig, ich mag es einfach, explizit bezüglich der Absicht zu sein.

Ich wette, es gibt eine gute Anzahl von Front-End-Entwicklern, die es bevorzugen, in HTML zu arbeiten, selbst wenn das HTML letztendlich verarbeitet wird. Ich mag Pug manchmal, aber es ist eine eigenständige, whitespace-abhängige Sprache. Nunjucks zu bevorzugen ist so ähnlich wie ERB gegenüber HAML zu bevorzugen.

Hier ist ein perfekt legitimes Template

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>{{ page_title }}</title>
</head>

<body>

  {% for feature in features %}
    <div class="module">
      <h3>{{ feature.name }}</h3>
      <p>{{ feature.description }}</p>
    </div>
  {% endfor %}

</body>

</html>

Was sind features? Daten! Man übergibt sie an die render Funktion.

nunjucks.render(
  'index.njk', {
    page_title: "Cool Product",
    features: [
      {
        name: "Speed",
        description: "It's fast."
      },
      {
        name: "Reliability",
        description: "You can count on it."
      },
      {
        name: "Security",
        description: "You don't have to worry about it."
      }
    ]
  }
);

Man kann sich vorstellen, dass diese Daten aus einer Datenbank oder einer API stammen, da bin ich mir sicher. Man kann Daten auch direkt in der View definieren, wenn nötig.

<div>
  {% set foo = "bar" %}
  {{ foo }}
</div>

2. Includes

Manchmal nutze ich eine Sprache *nur für die Includes*. Zum Beispiel hat CodeKit eine Sprache, die quasi nur für Includes da ist, weil sie wissen, wie nützlich diese sind.

So einfach sind Includes in Nunjucks

<body>

  {% include "_header.njk" %}

  <main>
    ...
  </main>

  {% include "_footer.njk" %}

</body>

3. Extends / Blocks

Extends heben Includes auf die nächste Stufe. Extends erlauben es Ihnen, ein Template-Dokument mit „Blocks“ darin zu definieren, die dazu dienen, Inhaltsblöcke aufzunehmen.

Hier ist ein Template mit einigen Includes, aber auch einem Block genau in der Mitte

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>{{ page_title }}</title>
</head>

<body>

  {% include "parts/_header.njk" %}

  {% block main %}
    This is the default content
  {% endblock %}

  {% include "parts/_footer.njk" %}

</body>

</html>

Nun kann jede andere Datei dieses Template erweitern und muss sich nicht um den ganzen Boilerplate-HTML kümmern, der wahrscheinlich bei allen Seiten der Website dabei ist. Unser `index.njk` wird beispielsweise

{% extends "parts/_template.njk" %}

{% block main %}
  {% for feature in features %}
    <div class="module">
      <h3>{{ feature.name }}</h3>
      <p>{{ feature.description }}</p>
    </div>
  {% endfor %}
{% endblock %}

Ich wette, Sie können sich vorstellen, wie das Ausfüllen aussieht. Vielleicht mehrere Templates für verschiedene Arten von Seiten. Mehr Blöcke geben Ihnen die Möglichkeit, zusätzliche Stylesheets oder Skripte einzufügen. Mehr Blöcke für Bereiche der Website, wie das, was in die Seitenleiste und den Footer kommt.

4. Makros

Wo wir gerade beim Thema sind, Templates auf die nächste Stufe zu heben, Makros tun das noch einmal.

Makros sind wie **Imports mit Parametern**. Wie Funktionen! Man gibt ihnen einige Werte und sie geben einem etwas zurück.

Stellen Sie sich ein Modul vor, das drei Werte aufnimmt. Zur Veranschaulichung, sagen wir eine „Farbprobe“ (als ob wir eine Pattern-Bibliothek erstellen würden), die den Farbwert, den Namen und Notizen aufnimmt.

Wir könnten das so aufbauen

{% macro cardSwatch(colorName, colorValue, colorNotes) %}
  <div class="color-swatch-tile">
    
    <div class="color-swatch"
         style="background-color: {{ colorValue }};">
    </div>
    
    <div class="color-name">
      {{ colorName }}
    </div>
    
    <div class="color-notes">
      {{ colorNotes }}
    </div>
    
  </div>
{% endmacro %}

Jetzt kann ich das immer wieder verwenden

{{ cardSwatch("brandColor", "#f06d06", "Our main color.") }}
{{ cardSwatch("brandHighlight", "#d0b000", "For callouts and highlights.") }}
{{ cardSwatch("grayDark", "#333333", "For things like code block backgrounds.") }}

Noch besser, ich kann die Makros in eigene Dateien verschieben und sie bei Bedarf importieren. Hier importiere ich ein macro, extend ein Template und iteriere durch colors Daten, wobei ich ein macro aufrufe

{% from "macros/swatch.njk" import swatch %}

{% extends "parts/_template.njk" %}

{% block main %}

  {% for color in colors %}
    {{ swatch(color.color_name, color.color_value, color.color_notes) }}
  {% endfor %}

{% endblock %}

CodePen Projects unterstützt Nunjucks

Ja, in der Tat! Was schön ist, denn es erfordert keinerlei Einrichtung. (Sie kennen doch CodePen Projects, oder?) Benennen Sie einfach eine Datei mit der Endung `.njk` und CodePen weiß, dass es diese als Nunjucks verarbeiten soll.

Hier ist eine zum Anschauen.

Nunjucks mit Gulp

Wenn Sie lokal mit Nunjucks arbeiten, werden Sie fast sicher ein Build-Tool wie Gulp benötigen, um die Dateien zu verarbeiten. Glücklicherweise gibt es gulp-nunjucks, um es noch einfacher zu machen.

gulp.task('default', () =>
  gulp.src('index.html')
    .pipe(nunjucks.compile({
      my_data: "is here"
    }))
    .pipe(gulp.dest('dist'))
);

Repo

Ich habe einen erstellt, während ich für die Erstellung dieses Artikels mit Nunjucks gespielt habe.

Weitere Informationen