Ein Eleventy-Starter mit Tailwind CSS und Alpine.js

Avatar of Greg Wolanski
Greg Wolanski am

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

Als ich beschloss, meine aktuelle persönliche Website auf Eleventy zu basieren, wollte ich das Rad nicht neu erfinden: Ich testete alle Eleventy-Starter, die mit Tailwind CSS erstellt wurden und die ich in den Starter Projects aus der Dokumentation finden konnte.

Viele der Starter schienen Tailwind CSS auf eine umständliche Weise zu integrieren. Außerdem schienen einige von ihnen davon auszugehen, dass niemand die Tailwind-Konfiguration während der Arbeit an einer Website im laufenden Betrieb aktualisiert. Deshalb habe ich Eleventy selbst mit Tailwind CSS und Alpine.js integriert. Ich habe Grund zu der Annahme, dass Ihnen die Einfachheit meiner Lösung gefallen wird.

Gutes Design ist so wenig Design wie möglich.

— Dieter Rams, 10 Prinzipien für gutes Design

Wenn Sie sich nicht für die Details interessieren, können Sie gerne meinen Starter herunterladen und direkt loslegen.

Erste Schritte

Ich gehe davon aus, dass Sie ein allgemeines Verständnis von Tailwind CSS, HTML, JavaScript, Nunjucks, der Kommandozeile und npm haben.

Beginnen wir mit einem neuen Ordner, wechseln dann mit cd in diesen Ordner und initialisieren ihn mit einer package.json-Datei.

npm init -y

Jetzt können wir Eleventy und Tailwind CSS installieren.

npm install -D @11ty/eleventy tailwindcss@latest

Wir müssen eine Seite erstellen, um zu testen, ob wir die Dinge erfolgreich eingerichtet haben. In einem echten Anwendungsfall werden unsere Seiten Vorlagen verwenden, also werden wir das auch hier tun. Dort kommt Nunjucks ins Spiel und dient als Vorlagen-Engine.

Erstellen wir eine neue Datei namens index.njk im Projektordner. Wir werden sie als Homepage festlegen.

{% extends "_includes/default.njk" %}


{% block title %}It does work{% endblock %}


{% block content %}
  <div class="fixed inset-0 flex justify-center items-center">
    <div>
      <span class="text-change">Good design</span><br/>
      <span class="change">is<br/>as little design<br/>as possible</span>
    </div>
  </div>
{% endblock %}

Grundlegende Vorlagenverwaltung

Erstellen wir nun einen neuen Ordner im Projektordner namens _includes (und ja, der Ordnername ist wichtig). Innerhalb dieses neuen Ordners erstellen wir eine Datei namens default.njk, die wir als Standardvorlage für unser Layout verwenden werden. Wir halten die Dinge einfach mit einem grundlegenden HTML-Boilerplate.

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>
      {% block title %}Does it work?{% endblock %}
    </title>
    <meta charset="UTF-8"/>
    {% if description %}
      <meta name="description" content="{{description}}"/>
    {% endif %}
    <meta http-equiv="x-ua-compatible" content="ie=edge"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"/>
    <link rel="stylesheet" href="/style.css?v={% version %}"/>
    {% block head %}{% endblock %}
  </head>
  <body>
    {% block content %}
      {{ content | safe }}
    {% endblock %}
  </body>
</html>

Konfigurieren von Tailwind CSS

Kümmern wir uns um einen Test für Tailwind CSS mit so wenigen Schritten wie möglich. Erstellen Sie zuerst einen neuen Unterordner namens styles und darin eine Datei namens tailwind.config.js.

module.exports = {
  content: ['_site/**/*.html'],
  safelist: [],
  theme: {
    extend: {
      colors: {
        change: 'transparent',
      },
    },
  },
  plugins: [],
}

Erstellen Sie dann eine Datei namens tailwind.css im selben styles-Ordner.

@tailwind base;
@tailwind components;
@tailwind utilities;

@layer utilities {
  .change {
    color: transparent;
  }
}

Starten und Erstellen des Projekts

Erstellen wir nun eine weitere neue Datei im selben Stammverzeichnis namens .gitignore. Dies ermöglicht es uns zu definieren, welche Dateien beim Übertragen des Projekts in ein Repository, z. B. auf GitHub, übersprungen werden sollen.

_site/
.DS_Store
node_modules/

Als Nächstes erstellen wir eine Datei namens .eleventy.js (beachten Sie den führenden Punkt), die Eleventy im Grunde konfiguriert und ihm mitteilt, welche Dateien überwacht und wo seine Arbeit gespeichert werden soll.

const now = String(Date.now())

module.exports = function (eleventyConfig) {
  eleventyConfig.addWatchTarget('./styles/tailwind.config.js')
  eleventyConfig.addWatchTarget('./styles/tailwind.css')


  eleventyConfig.addPassthroughCopy({ './_tmp/style.css': './style.css' })


  eleventyConfig.addShortcode('version', function () {
    return now
  })
};

Wir können nun die Datei package.json mit allen Skripten aktualisieren, die wir benötigen, um die Website während der Entwicklung zu starten und zu erstellen. Die Abhängigkeiten sollten nach der anfänglichen Einrichtung bereits vorhanden sein.

{
  "scripts": {
    "start": "eleventy --serve & npx tailwindcss -i styles/tailwind.css -c styles/tailwind.config.js -o _site/style.css --watch",
    "build": "ELEVENTY_PRODUCTION=true eleventy && NODE_ENV=production npx tailwindcss -i styles/tailwind.css -c styles/tailwind.config.js -o _site/style.css --minify"
  },
  "devDependencies": {
    "@11ty/eleventy": "^1.0.0",
    "tailwindcss": "^3.0.0"
  }
}

Hey, großartige Arbeit! Wir haben es geschafft. Starten wir die Website offiziell.

npm start

Öffnen Sie die Seite https://:8080 in Ihrem Browser. Sie wird nicht nach viel aussehen, aber überprüfen Sie den Seitentitel in der Browser-Registerkarte.

Es funktioniert!

Wir können noch ein wenig mehr überprüfen, um sicherzustellen, dass alles in Ordnung ist. Öffnen Sie /styles/tailwind.config.js und ändern Sie den Wert der transparent-Farbe in etwas anderes, z. B. black. Die Tailwind-Konfiguration sollte zusammen mit der Seite in Ihrem Browser neu geladen werden.

Verlieren Sie Ihren Browser nicht aus den Augen und bearbeiten Sie /styles/tailwind.css, indem Sie transparent wieder in black ändern. Ihre CSS-Datei sollte neu geladen und in Ihrem Browser aktualisiert werden.

Jetzt können wir gut mit Eleventy und Tailwind CSS arbeiten!

Optimieren der Ausgabe

Zu diesem Zeitpunkt funktioniert Tailwind CSS mit Eleventy, aber das generierte HTML ist nicht perfekt, da es Dinge wie überflüssige Zeilenumbruchzeichen enthält. Lassen Sie uns das bereinigen.

npm install -D html-minifier

Fügen Sie die folgende Zeile am Anfang der Datei .eleventy.js hinzu.

const htmlmin = require('html-minifier')

Wir müssen auch htmlmin in .eleventy.js konfigurieren.

eleventyConfig.addTransform('htmlmin', function (content, outputPath) {
    if (
      process.env.ELEVENTY_PRODUCTION &&
      outputPath &&
      outputPath.endsWith('.html')
    ) {
      let minified = htmlmin.minify(content, {
        useShortDoctype: true,
        removeComments: true,
        collapseWhitespace: true,
      });
      return minified
    }


    return content
})

Wir verwenden hier einen Transform, was eine Eleventy-Sache ist. Transforms können die Ausgabe einer Vorlage ändern. Zu diesem Zeitpunkt sollte .eleventy.js wie folgt aussehen.

const htmlmin = require('html-minifier')

const now = String(Date.now())

module.exports = function (eleventyConfig) {
  eleventyConfig.addWatchTarget('./styles/tailwind.config.js')
  eleventyConfig.addWatchTarget('./styles/tailwind.css')

  eleventyConfig.addShortcode('version', function () {
    return now
  })

  eleventyConfig.addTransform('htmlmin', function (content, outputPath) {
    if (
      process.env.ELEVENTY_PRODUCTION &&
      outputPath &&
      outputPath.endsWith('.html')
    ) {
      let minified = htmlmin.minify(content, {
        useShortDoctype: true,
        removeComments: true,
        collapseWhitespace: true,
      })
      return minified
    }

    return content
  })
}

Lassen Sie uns npm start erneut ausführen. Sie werden sehen, dass sich nichts geändert hat, und das liegt daran, dass die Optimierung nur während des Builds erfolgt. Versuchen Sie stattdessen npm run build und schauen Sie sich dann den Ordner _site an. Es sollte kein einziges unnötiges Zeichen in der Datei index.html vorhanden sein. Das Gleiche gilt für die Datei style.css.

Ein so erstelltes Projekt ist nun bereit für die Bereitstellung. Gut gemacht! 🏆

Integration von Alpine.js

Ich habe mich entschieden, von Gatsby.js zu Eleventy zu wechseln, da es mir einfach zu viel JavaScript war. Ich bin mehr an einer vernünftigen Dosis Vanilla JavaScript gemischt mit Alpine.js interessiert. Wir werden hier nicht auf die Besonderheiten von Alpine.js eingehen, aber es lohnt sich, Hugo DiFrancescos Primer zu lesen, da er ein perfekter Ausgangspunkt ist.

So können wir es über die Kommandozeile in unser Projekt installieren.

npm install -D alpinejs

Jetzt müssen wir .eleventy.js mit dieser Funktion aktualisieren, die Dinge an Alpine.js weitergibt.

eleventyConfig.addPassthroughCopy({
  './node_modules/alpinejs/dist/cdn.js': './js/alpine.js',
})

Zuletzt öffnen wir _includes/default.njk und fügen Alpine.js direkt vor dem schließenden </head>-Tag hinzu.

<script src="/js/alpine.js?v={% version %}"></script>

Wir können überprüfen, ob Alpine funktioniert, indem wir dies zu index.njk hinzufügen.

{% extends "_includes/default.njk" %}


{% block title %}It does work{% endblock %}


{% block content %}
  <div class="fixed inset-0 flex justify-center items-center">
    <div>
      <span class="text-change">Good design</span><br/>
      <span class="change">is<br/>as little design<br/>as possible</span><br/>
      <span x-data="{message:'🤖 Hello World 🤓'}" x-text="message"></span>
    </div>
  </div>
{% endblock %}

Starten Sie das Projekt.

npm start

Wenn Alpine.js funktioniert, sehen Sie "Hello World" in Ihrem Browser. Glückwunsch, doppelt! 🏆🏆


Ich hoffe, Sie sehen, wie schnell ein Eleventy-Projekt eingerichtet werden kann, einschließlich der Integration von Nunjucks für die Vorlagenverwaltung, Tailwind für Stile und Alpine.js für Skripte. Ich weiß, dass die Arbeit mit neuer Technologie überwältigend und sogar verwirrend sein kann. Wenn Sie also Probleme beim Start haben oder eine Idee haben, wie dies noch weiter vereinfacht werden kann, können Sie mir gerne eine E-Mail an [email protected] senden.