tl; dr: возможно ли сделать шаблон многоразового использования буквальным?
Я пытался использовать шаблонные литералы, но я думаю, что я просто не понимаю, и теперь я расстраиваюсь. Я имею в виду, я думаю, что я понимаю, но "это" не должно быть, как это работает, или как это должно получиться. Это должно получиться по-другому.
Все примеры, которые я вижу (даже помеченные шаблоны), требуют, чтобы "замены" выполнялись во время объявления, а не во время выполнения, что мне кажется совершенно бесполезным для шаблона. Может быть, я сумасшедший, но "шаблон" для меня - это документ, который содержит токены, которые подставляются при его использовании, а не при его создании, в противном случае это просто документ (т.е. строка). Шаблон хранится с токенами как токены, и эти токены оцениваются, когда вы... оцениваете его.
Все приводят ужасный пример, похожий на:
var a = 'asd';
return 'Worthless ${a}!'
Это хорошо, но если я уже знаю, я бы просто a
return 'Worthless asd'
или return 'Worthless '+a
. Какой смысл? Шутки в сторону. Хорошо, дело в лени; меньше плюсов, больше читаемости. Отлично. Но это не шаблон! Не имхо. И MHO это все, что имеет значение! Проблема, IMHO, в том, что шаблон оценивается, когда он объявлен, поэтому, если вы это сделаете, IMHO:
var tpl = 'My ${expletive} template';
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
Поскольку expletive
не объявлен, он выводит что-то вроде My undefined template
. Супер. На самом деле, по крайней мере в Chrome, я даже не могу объявить шаблон; он выдает ошибку, потому что expletive
не определен. Что мне нужно, чтобы иметь возможность сделать замену после объявления шаблона:
var tpl = 'My ${expletive} template';
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
Однако я не понимаю, как это возможно, поскольку на самом деле это не шаблоны. Даже когда вы говорите, что я должен использовать теги, нет, они не работают:
> 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...
Все это привело меня к мысли, что литералы шаблонов ужасно неправильно названы и должны называться так, как они есть на самом деле: heredocs. Я предполагаю, что "буквальная" часть должна была предупредить меня (как в неизменяемом)?
Я что-то пропустил? Есть ли (хороший) способ сделать многоразовый шаблон буквальным?
Я даю вам, многоразовые литералы шаблона:
> 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!
А вот и наивная "вспомогательная" функция...
function t(t) { return '''+t.replace('{','${')+'''; }
var template = t('This is
my {expletive} reusable
template!');
... чтобы сделать это "лучше".
Я склонен называть их шаблонными геральвами из-за области, из которой они производят извращенные чувства.