Kennen Sie diese super coolen Backticks für Strings in neuem JavaScript?
let emotion = `happy`;
let sentence = `Chris is feeling ${emotion}`;
Neben der Variableninterpolation, die dort sehr praktisch ist, funktionieren mehrzeilige Strings wunderbar und eignen sich daher hervorragend für HTML-Schnipsel
const some_html = `
<div class="module">
<h2>${data.title}</h2>
<p>${data.content}</p>
</div>
`;
Das sieht nicht übermäßig anders aus als JSX, oder?! Vielleicht würden wir so etwas als React-Komponente machen
class MyModule extends React.Component {
render() {
return
<div class="module">
<h2>{this.props.title}</h2>
<p>{this.props.content}</p>
</div>;
}
}
Aber was, wenn wir React oder ein anderes ziemlich großes JavaScript-Framework nicht wirklich brauchen?
Was, wenn wir nur die Fähigkeit wollen, HTML-Vorlagen zu rendern und sie auch sehr effizient neu zu rendern, wenn wir es brauchen, wie React dafür bekannt ist?
Soweit ich weiß, dafür sind Projekte wie lit-html da. Zum Zeitpunkt des Schreibens ist dies eine ziemlich neue Bibliothek von Google und den Machern von Polymer.
Es ermöglicht Ihnen, eine HTML-Vorlage mit normalen Template-Literalen zu definieren, wie hier:
import { html, render } from './lit-html.js';
const helloTemplate = (data) => html`
<div class="module">
<h2>Hello ${data.name}!</h2>
<p>${data.content}</p>
</div>
`;
Dann rufen Sie die Render-Funktion auf und übergeben ihr diese Vorlage, die Daten und wohin sie gerendert werden soll
let data = {
name: "Chris",
content: "Just trying to figure stuff out."
}
render(helloTemplate(data), document.body);
Dann sagen Sie, die Daten ändern sich… Sie rufen Render erneut auf
data.name = "Sammy";
render(helloTemplate(data), document.body);
Und hier glänzt lit-html. Es ist schlau genug, nur die Teile des DOMs zu aktualisieren, die es benötigt.
Hier ist ein kleiner Vergleich, bei dem einige Daten geändert werden und die Vorlagen dann neu gerendert werden. Wenn wir das Ganze mit innerHTML rendern, wird das gesamte DOM geändert. Mit lit-html werden nur kleinere innere Teile geändert.
Hier ist ein kleines Video, in dem Sie den Unterschied bei der DOM-Aktualisierung sehen können
Es gibt auch ein weiteres Projekt in dieser Richtung. Ich weiß nicht genug, um es zu beurteilen, aber es ist etwas älter und meiner Meinung nach etwas robuster. Es heißt HyperHTML.
HyperHTML ermöglicht es Ihnen auch, Vorlagen zu erstellen und sie zu rendern. Und am wichtigsten: sie effizient neu zu rendern.
Hier ist eine Demo, bei der die Daten von der Quotes on Design API stammen und in eine Vorlage eingefügt werden
Siehe den Pen Trying HyperHTML von Chris Coyier (@chriscoyier) auf CodePen.
Ziemlich cool, dass es diese Mini-Bibliotheken gibt, die nützliche Dinge für uns tun. Wenn also Situationen auftreten, in denen wir eine Funktion wünschen, die eine große Bibliothek hat, aber nicht die ganze große Bibliothek nutzen wollen, haben wir kleinere Optionen.
Relevant: https://twitter.com/ebidel/status/763843570327441409
Und hier ist das Polymer Summit Video, in dem lit-html vorgestellt wurde: https://www.youtube.com/watch?v=ruql541T7gc&feature=youtu.be
Vielen Dank für diesen Beitrag, Chris, es ist großartig zu sehen, dass HyperHTML und lit-html jeden Tag mehr Interesse gewinnen!
Wenn ich eine kleine Änderung an Ihrem Hyper-Beispiel vorschlagen darf:
<a href=${data.link}>(link)</a>ist eigentlich alles, was Sie brauchen, um diesen Link zu rendern (kein Array als Attribut, keine Anführungszeichen erforderlich).Ich habe auch einen Vergleich zwischen Hyper und Lit erstellt. Ungeachtet dessen sind die Tage von lit-html noch jung und es ist wahrscheinlich nicht mehr ganz aktuell, aber zumindest können Entwickler eine bessere Vorstellung davon bekommen, was mit der einen oder der anderen Micro-Bibliothek möglich ist.
Zuletzt, aber nicht weniger wichtig: Wenn Sie dieses Muster mit den berühmtesten Frameworks vergleichen möchten, gibt es eine Seite dafür, und sie ist vollständig von Template-Literalen zu DOM getrieben ;-)
Ich habe dies in dem Beispiel in der Google-Präsentation bemerkt. Können Sie erklären, warum keine Anführungszeichen benötigt werden? Was passiert, wenn ein Leerzeichen oder ein anderes Zeichen vorhanden ist, das das Attribut, das von Benutzerdaten bereitgestellt wird und in data.link landet, brechen würde?
Sie können Anführungszeichen verwenden, wenn Sie möchten, obwohl React-Benutzer normalerweise keine Attribute zitieren.
Wie auch immer, die Dokumentation erklärt so ziemlich alles, was Sie über HyperHTML-Attribute wissen möchten.
Bitte verwechseln Sie HyperHTML auch nicht mit Google lit-html, da HyperHTML vor 7 Monaten entstanden ist und keine Google-Bibliothek ist.
Legen Sie eigentlich Beweise vor, dass eine Methode effizienter ist als die andere? Ich habe keine Daten gesehen, die die beiden vergleichen.
Nur weil mehr/weniger vom DOM aktualisiert wird, scheint das kein Beweis für Effizienz zu sein. Es kann die zugrunde liegende Annahme geben, dass alle DOM-Aktualisierungen die ineffizientesten von allen anderen durchführbaren Aktionen sind.
Außerdem, da der Text, der in Anführungszeichen aktualisiert wird, kein umgebendes Element hat, zeigt es nicht klar an, dass nur der Text und nicht das gesamte Element aktualisiert wurde. Es zeigt nur, dass der Browser ihn so hervorhebt.
Ich würde auch bezweifeln, dass, selbst wenn es einen Leistungsunterschied gibt, was sind die Kosten? Oft (sehr oft) ist die Suche nach Leistung schädlich für ein Projekt, bis zu den allerletzten Phasen, die meiner Meinung nach zu spät sein könnten, um eine Bibliothek/Codebasis zu ändern, um sie zu erreichen.
Ok, ich habe mir dieses Video angesehen (Chris hat es in einem Kommentar verlinkt)
Und in diesem Video nennt er lit-html ein „Experiment“, eine „Sneak Preview/Peak“ und es ist „sehr, sehr experimentell und in der Entwicklung“. seufz
Wenn Google es aus der BETA-Phase holt, rufen Sie mich an. Und dann werde ich die besten Ideen nehmen und meine eigene entwickeln. Ich habe jetzt Framework-Angst. ALLE Systeme, die ich in den letzten 20 Jahren mit Frameworks gebaut habe, wurden zu Updates gezwungen, nur weil die Frameworks aktualisiert wurden. Vanilla JS, ich komme. Und Google hat (meiner Meinung nach) mit Abstand die schlechteste Erfolgsbilanz aller Unternehmen, was die Unterstützung seiner Bibliotheken, APIs, Dienste usw. angeht. Die besten Ideen von lit-html werden woanders landen, und ich werde es nicht mit der Tastatur und dem Texteditor meines schlimmsten Feindes anfassen.
Er preist JavaScript-String-Literale an, und ich stimme zu, das ist die Zukunft des Templating. Vielleicht wird es eine Verbindung zwischen Mustache und den Literalen geben? (oder etwas Ähnliches)
Er sagt, ein Hauptziel von Lit-html sei die Performance bei DOM-Aktualisierungen. Ich prognostiziere, dass dies irgendwann weniger wichtig wird, da alle neuen Funktionen, die aus diesem System (und den vielen anderen ähnlichen, die er genannt hat) hervorgehen, in JS oder den Browser integriert werden, oder der Browser DOM-Aktualisierungen einfach schneller und effizienter macht. Genau wie JQuerys Selektorsystem in den Kern von JS/CSS übernommen wurde. (querySelector() und querySelectorAll() jemand?)
(verstehe endlich, wie React JSX funktioniert, aus diesem Video… es ist kein echtes JS oder HTML, es wird von einem Präprozessor gerendert, igitt. Nicht sicher, wie das so populär wurde, vielleicht bin ich ein alter Sack, aber ich sehe all das als Modeerscheinung.)
Ich glaube nicht, dass eines der Beispiele mit Template-Literalen HTML richtig escaped. Sollte kein Escaping verwendet werden? In diesem Beispiel verwende ich
lodash.escapeHyperHTML escaped automatisch, es sei denn, Sie opten sich als HTML über ein Array oder über
{html: content}.Ich denke, Chris hat die Interpolationen absichtlich innerhalb von Arrays belassen, damit Sie spielen können, aber sowohl lit-html als auch hyperHTML sind standardmäßig sicher/escaped.
Sie finden mehr in der Dokumentation beider Projekte. Sie müssen lodash nicht verwenden (hyperHTML bietet auch ein Escaping, falls Sie es aus irgendeinem Grund wirklich benötigen)
Nun, React hat Redux oder Mobx, einen Store, einfachere Möglichkeiten, mit dem Backend zu arbeiten, aber ich verstehe den Geist
Ich bin mir nicht sicher, wie einfach es ist, aber viperHTML bietet eine 1:1 kompatible API unter NodeJS.
Die derzeit schnellste HNPWA (hnpwa.com) wird tatsächlich von viperHTML im Backend angetrieben, als 100 % SSR, und später auf der Clientseite übernommen, wobei die exakt gleichen Vorlagen über hyperHTML geteilt werden.
Das HyperHTML-Projekt verdient mehr Aufmerksamkeit. Ich freue mich darauf, es auszuprobieren. Es sieht so vielversprechend aus!
Sehr interessant, und das Wichtigste für mich, es ist… einfach!
Sie können auch die FetchAPI anstelle von Axios verwenden
Ich bin ein Fan von JSRender, einem weiteren ähnlichen Projekt – vom Erfinder von jQuery Templates von damals
https://www.jsviews.com/#jsrplaying
Das ist wieder eine weitere Template-Syntax, die man sich merken muss. Der Unterschied hier ist, dass Sie native Template-Literal-Interpolationen verwenden: nichts Neues zu lernen ;-)
Heyyyyy, noch eins
https://github.com/stasm/innerself