tl; dr: Est-il possible de rendre un modèle réutilisable littéral?
J'ai essayé d'utiliser des modèles littéraux, mais je suppose que je ne comprends tout simplement pas et que maintenant je suis frustré. Je veux dire, je pense que je comprends, mais "ça" ne devrait pas être comment ça marche, ni comment ça devrait arriver. Cela devrait être différent.
Tous les exemples que je vois (même les modèles étiquetés) nécessitent que les "substitutions" soient effectuées au moment de la déclaration et non au moment de l'exécution, ce qui me semble totalement inutile pour un modèle. Peut-être que je suis fou, mais un "modèle" pour moi est un document qui contient des jetons qui sont substitués lorsque vous l'utilisez, pas lorsque vous le créez, sinon c'est juste un document (c'est-à-dire une chaîne). Un modèle est stocké avec les jetons sous forme de jetons et ces jetons sont évalués lorsque vous ... l'évaluez.
Tout le monde cite un exemple horrible semblable à:
var a = 'asd';
return `Worthless ${a}!`
C'est bien, mais si je sais déjà a
, je le ferais simplement return 'Worthless asd'
ou return 'Worthless '+a
. À quoi ça sert? Sérieusement. Ok, le point est la paresse; moins d'avantages, plus de lisibilité. Génial. Mais ce n'est pas un modèle! Pas à mon humble avis. Et MHO est tout ce qui compte! Le problème, à mon humble avis, est que le modèle est évalué lorsqu'il est déclaré, donc, si vous le faites, à mon humble avis:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
Puisque expletive
n'est pas déclaré, il génère quelque chose comme My undefined template
. Super. En fait, dans Chrome au moins, je ne peux même pas déclarer le modèle; il jette une erreur car expletive
n'est pas défini. Ce dont j'ai besoin, c'est de pouvoir effectuer la substitution après avoir déclaré le modèle:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
Cependant, je ne vois pas comment cela est possible, car ce ne sont pas vraiment des modèles. Même quand vous dites que je devrais utiliser des balises, non, elles ne fonctionnent pas:
> 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...
Tout cela m'a conduit à croire que les littéraux de modèle sont horriblement mal nommés et devraient être appelés ce qu'ils sont vraiment: heredocs . Je suppose que la partie "littérale" aurait dû me prévenir (comme dans, immuable)?
Est-ce que je manque quelque chose? Existe-t-il un (bon) moyen de rendre littéral un modèle réutilisable?
Je vous donne, des littéraux de modèle réutilisables :
> 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!
Et voici une fonction "helper" naïve ...
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
...Pour le faire mieux".
J'ai tendance à les appeler des guterals modèles en raison de la zone à partir de laquelle ils produisent des sentiments sinueux.
<strike>
balise.