tl; dr: Ist es möglich, eine wiederverwendbare Vorlage wörtlich zu machen?
Ich habe versucht, Vorlagenliterale zu verwenden, aber ich glaube, ich verstehe es einfach nicht und jetzt bin ich frustriert. Ich meine, ich denke ich verstehe es, aber "es" sollte nicht so sein, wie es funktioniert oder wie es werden sollte. Es sollte anders werden.
Alle Beispiele, die ich sehe (sogar mit Tags versehene Vorlagen), erfordern, dass die "Ersetzungen" zur Deklarationszeit und nicht zur Laufzeit erfolgen, was mir für eine Vorlage völlig nutzlos erscheint. Vielleicht bin ich verrückt, aber eine "Vorlage" ist für mich ein Dokument, das Token enthält, die ersetzt werden, wenn Sie es verwenden, nicht wenn Sie es erstellen, sonst ist es nur ein Dokument (dh eine Zeichenfolge). Eine Vorlage wird mit den Token als Token gespeichert und diese Token werden ausgewertet, wenn Sie ... sie auswerten.
Jeder zitiert ein schreckliches Beispiel ähnlich:
var a = 'asd';
return `Worthless ${a}!`
Das ist schön, aber wenn ich es schon weiß a
, würde ich einfach return 'Worthless asd'
oder return 'Worthless '+a
. Was ist der Punkt? Ernsthaft. Okay, der Punkt ist Faulheit; weniger Pluspunkte, mehr Lesbarkeit. Toll. Aber das ist keine Vorlage! Nicht IMHO. Und MHO ist alles was zählt! Das Problem, IMHO, ist, dass die Vorlage ausgewertet wird, wenn sie deklariert wird. Wenn Sie dies tun, IMHO:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
Da expletive
nicht deklariert ist, gibt es so etwas wie aus My undefined template
. Super. Zumindest in Chrome kann ich die Vorlage nicht einmal deklarieren. es wird ein Fehler ausgegeben, weil expletive
nicht definiert ist. Was ich brauche, ist in der Lage zu sein, die Ersetzung nach dem Deklarieren der Vorlage durchzuführen:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
Ich sehe jedoch nicht, wie dies möglich ist, da dies keine wirklichen Vorlagen sind. Selbst wenn Sie sagen, ich sollte Tags verwenden, nein, sie funktionieren nicht:
> explete = function(a,b) { console.log(a); console.log(b); }
< function (a,b) { console.log(a); console.log(b); }
> var tpl = explete`My ${expletive} template`
< VM2323:2 Uncaught ReferenceError: expletive is not defined...
Dies alles hat mich zu der Überzeugung geführt, dass Vorlagenliterale schrecklich falsch benannt sind und so genannt werden sollten, wie sie wirklich sind: Heredocs . Ich denke, der "wörtliche" Teil hätte mich darauf hinweisen sollen (wie in, unveränderlich)?
Vermisse ich etwas Gibt es eine (gute) Möglichkeit, eine wiederverwendbare Vorlage wörtlich zu machen?
Ich gebe Ihnen wiederverwendbare Vorlagenliterale :
> function out(t) { console.log(eval(t)); }
var template = `\`This is
my \${expletive} reusable
template!\``;
out(template);
var expletive = 'curious';
out(template);
var expletive = 'AMAZING';
out(template);
< This is
my undefined reusable
template!
This is
my curious reusable
template!
This is
my AMAZING reusable
template!
Und hier ist eine naive "Helfer" -Funktion ...
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
...um es besser zu machen".
Ich neige dazu, sie Template-Gutenals zu nennen, weil sie in diesem Bereich verdrehte Gefühle hervorrufen.
<strike>
Tag ein.