2 votes

Comment intégrer CouchApp, Node.JS, Sammy et Mustache ?

J'ai mis en place une CouchApp node.couchapp.js et l'ai poussée vers mon CouchDB. Sammy et jQuery sont inclus par défaut. Maintenant, j'aimerais ajouter Mustache pour les modèles, mais je ne sais pas exactement où ? Je pourrais l'utiliser comme module Node.js ou comme plugin jQuery.

J'ai commencé par un exemple de code, juste pour voir si cela fonctionnait, mais ce n'est pas le cas :

ddoc.lists = {
"basic": "function (head, req) { var that = this; provides('html', function () { var to_html = require('modules/mustache').to_html; var members = []; var row; while (row = getRow()) { members.push({club: row.key[0], name: row.key[1]}); } return to_html(that.templates['roster.mustache'], { members: members }); }) }"
};

Résultats dans :

{"error":"invalid_require_path","reason":"Object has no property \"modules\". ...

La structure du projet est :

. Project
| - app.js
| - attachments
| - - scripts
| ` - index.html
| - modules
|   | mustache
| - ` - mustache.js
` - templates

Mise à jour J'ai modifié un peu le code et exclu le dossier des modèles comme cause possible. Cet extrait provient d'une question résolue ici sur SO, il devrait donc fonctionner. Mais c'est toujours la même erreur. J'ai installé mustache.js avec npm install mustache et renommé le dossier de node_modules en modules (cela n'a pas fonctionné avec node_modules non plus).

"basic": "function (head, req) { provides('html', function () { var template = '{{%IMPLICIT-ITERATOR}}{{name}}: <ul> {{#items}}<li>{{.}}</li>{{/items}} </ul>'; var mustache = require('./modules/mustache/mustache.js'); return mustache.to_html(template,view);});}"

Mais c'est toujours la même erreur.

3voto

Geert-Jan Points 5452

Je ne suis pas sûr de l'erreur spécifique que vous obtenez, mais à votre question : "Maintenant, je voudrais ajouter Mustache pour les modèles, mais je ne sais pas exactement où ? Je pourrais l'utiliser comme module Node.js ou plugin jQuery".

Vous pouvez l'utiliser dans les deux cas.

Comme Node.js fonctionne côté serveur, cela vous permet de définir votre modèle une fois (en utilisant Mustache dans ce cas) et de l'exécuter à la fois côté serveur (en utilisant Node.js) et côté client (en utilisant le plugin jquery).

Juste pour la vue d'ensemble (vous le savez peut-être déjà) : Imaginez le rendu d'un résultat de recherche de produits :

  • La méthode traditionnelle consiste à rendre les produits à l'aide d'un moteur de création de modèles côté serveur.
  • Supposons maintenant que vous souhaitiez activer le filtrage ou le tri des résultats de la recherche. En général, vous avez 3 options :

    1. faire un appel normal (non-ajax) au serveur, faire du templating côté serveur et sortir la nouvelle page.
    2. faire un appel ajax au serveur, faire du templating côté serveur et cracher du html, le récupérer côté client et l'insérer dans un élément dom.
    3. faire un appel ajax au serveur, générer un objet json, que vous rendez côté client en utilisant un moteur de templating côté client (tel que Mustache) dans un élément dom.

L'option 3 est sans doute la meilleure solution du point de vue de la convivialité. (Rapidité, faible bande passante, pas de clignotement ou de saut de page, etc. Cependant, pensez à une solution de repli/non-js pour le référencement si vous en avez besoin.

En mettant en œuvre l'option 3, vous vous retrouvez dans la situation où vous avez besoin d'un langage de modèle côté serveur pour rendre les produits lors du chargement initial de la page, et d'un langage de modèle côté client pour rendre les produits renvoyés par les appels ajax ultérieurs. Les deux donnent exactement le même html. Pas très DRY.

C'est ici que node.js entre en jeu, ce qui élimine la nécessité d'écrire un modèle séparé côté serveur. Au lieu de cela, il suffit de laisser node.js produire la page initiale en utilisant exactement le même modèle mustache que vous utilisez côté client.

Bien sûr, vous pourriez emprunter la seule voie côté client : cracher du json lors du chargement initial de la page, et le rendre sur le client. Ceci est bien sûr terrible du point de vue du référencement. Cependant, certaines applications n'ont pas besoin d'être indexées par les moteurs de recherche. Dans ce cas, l'approche "tout sur le client" est une bonne alternative.

Quelques questions connexes :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X