Was Sie dort brauchen, ist ein bisschen Templating

Avatar of Chris Coyier
Chris Coyier am

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

Ich hatte neulich einen Mann, der mir geschrieben hat. Er hatte etwas HTML, CSS und JavaScript, und es verhielt sich einfach nicht so, wie er es erwartet hätte. Das HTML enthielt einige Platzhalter und das JavaScript enthielt einige Daten, und die Annahme war, dass die Daten die Platzhalter füllen würden.

Für diejenigen von uns mit einem gewissen Webwissen können wir uns das ansehen und verstehen, warum es nicht so funktioniert, wie er es sich vorgestellt hat. Aber ich denke, es ist auch wertvoll, die Dinge aus dieser Perspektive zu betrachten und dann nach Lösungen zu suchen, die hoffentlich so einfach sind, wie das ursprüngliche Problem zu sein scheint.

Der HTML-Code sah ungefähr so ​​aus…

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Test</title>
  <link rel="stylesheet" href="test.css">
  <script src="data.js"></script>
</head>
<body>
  <section>
    <div>{company_name}</div>
  </section>
</body>
</html>

Der JavaScript-Code sah ungefähr so ​​aus…

var company_data = {
  "{company_name}" : "SOME COMPANY",
};

Hier passiert nichts Ungültiges.

Das ist alles vollkommen gültiger Code. Er ist richtig verknüpft. Er wird ausgeführt. Er tut nichts anderes, als {company_name} auf dem Bildschirm anzuzeigen. Die Erwartung war, dass stattdessen SOME COMPANY auf dem Bildschirm angezeigt wird, wobei der Platzhalter {company_name} durch die Daten aus der JavaScript-Datei ersetzt wird.

Lassen Sie uns das mit einer Einzeiler-Lösung beheben.

In diesem genauen Szenario müssen wir, um den richtigen Firmennamen anzuzeigen, dieses Element im DOM auswählen und seinen Inhalt durch unsere Daten ersetzen. Wir könnten das tun, indem wir diese eine zusätzliche Zeile zu JavaScript hinzufügen

var company_data = {
  "{company_name}": "SOME COMPANY"
};

document.querySelector("div").innerHTML = company_data["{company_name}"];

Das ist nicht besonders wiederverwendbar oder robust, aber hey, es ist auch kein Overthinking oder Overtooling.

Die Erwartung war Templating

Ich denke, wir können zu diesem Zeitpunkt erkennen, dass das, was er hoffte, passieren würde, dass diese Art von Templating automatisch stattfinden würde. Bereitstellen eines Objekts mit Schlüsseln, die mit denen im HTML übereinstimmen, und der Inhalt in diesem HTML wird automatisch ausgetauscht. Mit reinen Webtechnologien funktioniert das einfach nicht so.

Kein Witz, es gibt Hunderte von Möglichkeiten, dies zu handhaben. Hier sind ein paar, die mir spontan einfallen:

  • Verwenden Sie eine Templating-Sprache wie Handlebars oder Mustache
  • Verwenden Sie einen statischen Website-Generator wie Eleventy, der standardmäßig Liquid verwendet
  • Erstellen Sie ein HTML-<template>-Element und schreiben Sie Ihr eigenes Skript, um es zu verwenden
  • Erstellen Sie eine Web Component
  • Verwenden Sie stattdessen eine Backend-Sprache oder eine Sprache wie Nunjucks, um die Verarbeitung im Voraus durchzuführen
  • Verwenden Sie einen Präprozessor wie Pug

Als allgemeine Präferenz würde ich sagen, dass es am besten ist, das Templating serverseitig oder während eines Builds durchzuführen – warum das DOM manipulieren, wenn es nicht nötig ist?

Aber um diesen Rat für eine Sekunde zu ignorieren, hier ist ein Beispiel, wie man es clientseitig mit Handlebars macht, nur damit der Mann aus der ursprünglichen E-Mail ein funktionierendes Beispiel hat, wie das funktionieren kann