Javascript Template Literals

Ein Template String oder Template Literal setzt Variablen mit ${…} direkt in Strings. Das vermeidet die wiederholten +-Zeichen für die Konkatenation und verkraftet Zeilenumbrüche. Damit hat Javascript nun endlich eine native elegante Templates-Engine.

Template Literal

Backtick: Das invertierte Hochkomma

Template Literals sitzen in invertierten Hochkommas ` (Backtick) und sehen ein bißchen aus wie Strings. Auf deutschen Tastaturen sitzt das Backtick rechts vom ß, auf Schweizer Tastaturen links von der Backspace-Taste und wird z.B. für französische und spanische Akzente benutzt. Dauerhaft zum Vorschein kommt das zarte Symbol erst durch ein folgendes Zeichen. Zeichen, die nicht direkt übernommen werden, sondern ein folgendes Zeichen brauchten, werden auch als Tottasten bezeichnet.

const string = 
`Da alle Ersetzungen in Template Strings
	 Ausdrücke sind, können wir 
	 Variablennamen ersetzen 

         und Berechnungen direkt 
         in den Template String 
         einsetzen.`;
console.log ( string );


			

Sobald ein Template Literal durch das Backtick geöffnet wird, erzeugt die Entertaste eine neue Zeile ganz ohne Sonderzeichen wie \n. Einrückungen werden buchstäblich übernommen.

Innerhalb der Backticks können doppelte und einfache Hochkommas sitzen.

const lit = `"Hallo Welt" ist die erst Zeile mit 'Javascript'`;

Ausdrücke ausführen: ${ }

Der Clou der Template Literals ist ihre Syntax: Ausdrücke in $ mit { und } werden ausgeführt und als String eingefügt. Wo die herkömmliche Schreibweise für Strings mit Variablen nervig und bei längeren Ausgaben unübersichtlich und fehlerträchtig ist

const a = 101;
const b = 42;

const quiz = "Die Summe von " + a + " " + b " ist " + (a + b) + ".";

wird ein Template Literal direkt und lesbar geschrieben:

const quiz = `Die Summe von ${a} und ${b} ist ${(a + b)}.`;

Innerhalb des Template-Literals ist das Pluszeichen des Beispiels keine Konkatenation, sondern ein Pluszeichen, da beide Variablen vom Typ number sind.

Und dynamisches HTML einfügen? Lesbar, intuitiv und mit weniger Tücken:

document.querySelector(".result").innerHTML = 
`<figure class="svginside" style="max-width:400px">
	<img loading="lazy" src="${imgsrc}" width="${width}" height="${height}" alt="${caption}">
	<figcaption style="text-align: center"><em>${caption}</em></figcaption>
</figure>`;

Javascript Template-Literals vs Templates-Engine

Sind Template Literals angetreten, die unzähligen Template-Systeme wie Jade, Handlebars und Mustach zu ersetzen? Nehmen wir das Beispiel des HTML-Template-Elements:

const products = [
	{"cake": "Flan", "price":"2,80", "sku": "M1406", … },
	{"cake": "Sable", "price":"2,10", "sku": "M1417", … },
	{"cake": "Savarin", "price":"2,10", "text": "sku": "M1336", … }
];


let jst = products.map(elem => {
	return `
		<div class="block-column">
			<header>
				<h4>${elem.cake}</h4>
				<img loading="lazy" src="${elem.imgsrc}" width="300" height="300" alt="${elem.cake}">
			</header>
			<div>${elem.price} €</div>
			<div>${elem.text}</div>
			<div><a href="${elem.sku}">In den Warenkorb</a></div>
		</div>
	`;
}).join("");

document.querySelector("french-cakes").innerHTML = jst;

Deutlich eleganter und weniger fehlerlastig als das HTML-Template. Aber das war auch einfach. Wenn wir Template Engines wie Handbars, Moustache oder Jade ersetzen wollen, stoßen wir auf Funktionen, die wir nicht ohne Weiteres ersetzen können.

{\{#if isAdmin}}
{\{/if}}

oder

{\{#each people}}
{\{/each}}

Dann wird es kompliziert und wir müssten selber passende Hilfsfunktionen anlegen.

Browser Support

Alle immergrünen Browser, aber nicht IE11 (na ja).

Suchen auf mediaevent.de