J'adore la syntaxe HAML du moteur de création de modèles de Jade dans Node.js, et j'aimerais bien l'utiliser côté client dans Backbone.js.
J'ai souvent vu Backbone utiliser les modèles Underscore.js dans le style suivant.
/* Tunes.js */
window.AlbumView = Backbone.View.extend({
initialize: function() {
this.template = _.template($('#album-template').html());
},
// ...
});
/* Index.html */
<script type="text/template" id="album-template">
<span class="album-title"><%= title %></span>
<span class="artist-name"><%= artist %></span>
<ol class="tracks">
<% _.each(tracks, function(track) { %>
<li><%= track.title %></li>
<% }); %>
</ol>
</script>
Ce que j'aimerais voir, c’est un moyen d’utiliser AJAX (ou une autre méthode) pour récupérer des modèles Jade et les restituer dans le code HTML actuel.
J'ai pu exécuter Jade côté client en utilisant jade-browser project.
L'intégration à Backbone est alors simple: au lieu de _template()
, j'utilise jade.compile()
.
HTML (scripts et template):
<script class="jsbin" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script src="https://raw.github.com/weepy/jade-browser/master/jade.js"></script>
<script src="https://raw.github.com/weepy/jade-browser/master/jade-shim.js"></script>
<script src="http://documentcloud.github.com/underscore/underscore-min.js"></script>
<script src="http://documentcloud.github.com/backbone/backbone-min.js"></script>
<script type="template" id="test">
div.class1
div#id
| inner
div#nav
ul(style='color:red')
li #{item}
li #{item}
li #{item}
li #{item}
script
$('body').append('i am from script in jade')
</script>
JavaScript (intégration avec Backbone.View):
var jade = require("jade");
var TestView = Backbone.View.extend({
initialize: function() {
this.template = jade.compile($("#test").text());
},
render: function() {
var html = this.template({ item: 'hello, world'});
$('body').append(html);
}
});
var test = new TestView();
test.render();
ICIest le code.
Comme @dzejkej mentionné ci-dessus, l’un des moyens les plus connus d’utiliser les modèles Jade sur le client consiste à utiliser le navigateur jade; Cependant, j'ai toujours eu quelques problèmes avec Jade dans le navigateur.
include
, vous devrez peut-être effectuer un travail supplémentaire pour les compiler correctement. En outre, si vous décidez de compiler sur le serveur et d'envoyer du code JavaScript au client, vous rencontrez toujours des problèmes. Chaque fois que les modèles Jade utilisent un fichier, vos modèles Jade compilés peuvent devenir assez volumineux car ils contiennent le même code à plusieurs reprises. Par exemple, si vous incluez le même fichier à plusieurs reprises, son contenu sera téléchargé plusieurs fois sur le navigateur, ce qui gaspille de la bande passante.{client: true}
, mais les modèles compilés ne sont vraiment pas optimisés pour le client. De plus, il n'existe aucun mécanisme permettant de servir les modèles Jade compilés au navigateur.C’est l’une des raisons pour lesquelles j’ai créé le projet Blade . Blade est un langage de templates semblable à Jade qui prend en charge les modèles côté client dès la sortie de la boîte. Il est même livré avec Express middleware conçu pour servir les modèles compilés au navigateur . Si vous êtes d'accord avec une alternative de type Jade pour vos projets, jetez-y un coup d'œil!
Je viens d’ouvrir un projet nodejs, appelé "asset-rack", qui peut précompiler des modèles de jade et les proposer dans le navigateur sous forme de fonctions javascript.
Cela signifie que le rendu est extrêmement rapide, voire plus rapide que les micro-modèles, car il n'y a pas d'étape de compilation dans le navigateur.
L'architecture est un peu différente de ce que vous mentionnez, juste un fichier js pour tous les modèles appelés "templates.js" ou ce que vous voulez.
Vous pouvez le vérifier ici, https://github.com/techpines/asset-rack#jadeasset
Tout d'abord, vous le configurez sur le serveur comme suit:
new JadeAsset({
url: '/templates.js',
dirname: __dirname + '/templates'
});
Si votre répertoire de modèles ressemblait à ceci:
templates/
navbar.jade
user.jade
footer.jade
Ensuite, tous vos modèles entrent dans le navigateur sous la variable "Modèles":
$('body').append(Templates.navbar());
$('body').append(Templates.user({name: 'mike', occupation: 'sailor'});
$('body').append(Templates.footer());
Quoi qu'il en soit, espérons que cela aide.
Vous n’obtiendrez pas toute la puissance des modèles Jade, mais vous pouvez le bidouiller un peu pour que jade produise correctement les modèles de soulignement, la clé empêche jade d’échapper aux balises <%>
avec l’opérateur !
, comme alors:
script#dieTemplate(type='text/template')
.die(class!='value-<%= value %>')
i.fa.fa-circle
i.fa.fa-circle
i.fa.fa-circle
i.fa.fa-circle
i.fa.fa-circle
i.fa.fa-circle
i.fa.fa-star
Vous pouvez également consulter ma nouvelle bibliothèque pour le jade dans le navigateur. C'est aussi simple que <jade> ... </ jade>. https://github.com/charlieamer/jade-query