如何整合CouchApp,Node.JS,Sammy和Moustache

我设置了一个node.couchapp.js CouchApp并将其推送到我的CouchDB。 Sammy和jQuery默认包含在内。 现在,我想为模板添加胡子,但不知道在哪里? 我可以使用它作为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 

更新我修改了一下代码,排除模板文件夹的可能原因。 这个片段是从这里解决的问题,所以它应该实际上工作。 但它仍然是一样的错误。 我使用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);});}" 

但它仍然是一样的错误。

我不确定你所得到的具体错误,但对你的问题:“现在,我想添加胡须模板,但不知道在哪里?我可以使用它作为Node.js模块或jQuery插件“。

你可以在两者中使用它。

由于Node.js在服务器端运行,这有效地为您提供了一种定义模板的方法(在这种情况下使用Mustache),并在服务器端(使用Node.js)和客户端(使用jquery-插入)。

只是为了概述(您可能已经知道这一点):想象一下呈现产品的search结果:

  • 传统的方法是使用一些服务器端模板引擎来渲染产品。
  • 现在,假设您要启用对search结果的过滤/sorting。 一般来说你有3个select:

    1. 对服务器做一个正常的(非Ajax调用),做服务器端的模板,并吐出新的页面
    2. 做一个Ajax调用服务器,做服务器端模板和吐出HTML,拿起客户端,并将其插入DOM元素。
    3. 对服务器做一个ajax调用,生成一个json对象,使用客户端模板引擎(如Mustache)将客户端渲染成一个DOM元素。

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

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

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

当然,你可以走唯一的客户端路由:在初始页面加载时也吐出json,并在客户端渲染。 当然,如果从seo的angular度来看这是可怕的。 有些应用程序不会search引擎索引,在这种情况下,“客户端的一切”方法是一个很好的select。

一些相关的问题:

  • 客户端模板语言与Java编译器以及(DRY模板)
  • 良好的DRY方法来渲染和页面的AJAX更新