如何集成CouchApp,Node.JS,Sammy和Mustache

时间:2011-08-13 06:59:17

标签: javascript node.js couchdb mustache couchapp

我设置了一个node.couchapp.js CouchApp并将其推送到我的CouchDB。默认包含Sammy和jQuery。现在,我想为模板添加Mustache,但是不知道在哪里?我可以将它用作Node.js模块或jQuery插件。

我从一些示例代码开始,只是为了查看它是否有效,但它没有:

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 }); }) }"
};

结果:

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

项目结构是:

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

更新 我稍微修改了代码并排除了模板文件夹的可能原因。这个片段来自SO上的解决问题,所以它应该真的有用。但它仍然是同样的错误。我使用npm install mustache安装了mustache.js,并将该文件夹从node_modules重命名为模块(也不能与node_modules一起使用)。

"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);});}"

但它仍然是同样的错误。

1 个答案:

答案 0 :(得分:3)

我不确定您遇到的具体错误,但问题是: “现在,我想为模板添加Mustache,但不知道在哪里?我可以将它用作Node.js模块或jQuery插件。”

您可以在两者中使用它。

当Node.js在服务器端运行时,这有效地为您提供了一种方法来定义模板一次(在本例中使用Mustache)并在服务器端(使用Node.js)和客户端(使用jquery-plugin)。

仅供参考(您可能已经知道了): 想象一下渲染产品的搜索结果:

  • 传统方法是使用一些服务器端模板引擎呈现产品。
  • 现在,假设您要启用搜索结果的过滤/排序。一般来说,你有3个选择:

    1. 对服务器进行正常(非ajax调用),进行服务器端模板化并吐出新页面
    2. 对服务器进行ajax调用,进行服务器端模板化并吐出html,在客户端进行挑选并将其插入到dom-element中。
    3. 对服务器执行ajax调用,生成一个json对象,使用客户端模板引擎(如Mustache)将客户端渲染到dom元素中。

从可用性的角度来看,选项3可以说是最好的解决方案。 (快速,低带宽,无页面闪烁或页面跳跃等)。但是如果你需要的话,可以考虑SEO的后备/非js方式。

在实现选项3时,您现在需要一种服务器端模板语言来在初始页面加载时呈现产品,并使用客户端模板语言来呈现从后续ajax调用返回的产品。两者都会产生完全相同的html。不是很干。

这里node.js发挥作用,这消除了编写单独的服务器端模板的需要。相反,只需让node.js使用您在客户端使用的完全相同的胡子模板吐出初始页面。

当然,您可以选择唯一的客户端路由:在初始页面加载时吐出json,并在客户端上进行渲染。这当然是从seo-standpoint可怕的。然而,有些应用程序没有搜索引擎索引,在这种情况下,“客户端上的所有内容”方法都是一个不错的选择。

一些相关问题: