javascript - 如何集成 CouchApp、Node.JS、Sammy 和 Mustache

标签 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 重命名为 module(也不适用于 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);});}"

但是还是同样的错误。

最佳答案

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

您可以在两者中使用它。

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

仅供概述(您可能已经知道这一点): 想象一下呈现产品的搜索结果:

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

    1. 对服务器进行正常(非 ajax 调用),进行服务器端模板并输出新页面
    2. 对服务器进行 ajax 调用,进行服务器端模板并输出 html,在客户端获取并将其插入到 dom 元素中。
    3. 对服务器进行 ajax 调用,生成一个 json 对象,您可以使用客户端模板引擎(例如 Mustache)将其渲染到 dom 元素中。

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

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

这里,node.js 发挥了作用,它消除了编写单独的服务器端模板的需要。相反,只需让 node.js 使用与客户端使用的完全相同的 mustache 模板输出初始页面即可。

当然,您可以采用唯一的客户端路线:在初始页面加载时吐出 json,并将其呈现在客户端上。从搜索引擎优化的 Angular 来看,这当然很糟糕。然而,有些应用程序不进行搜索引擎索引,在这种情况下,“客户端上的所有内容”方法是一个不错的选择。

一些相关问题:

关于javascript - 如何集成 CouchApp、Node.JS、Sammy 和 Mustache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7049094/

相关文章:

javascript - 用多个自定义图像替换表单元素

javascript - 如何打开 ICEFaces Javascript 日志窗口?

javascript - 如何在从数据库异步加载中用占位符替换不存在的图像

node.js - mongoose findone 使用 q 模型将请求的 id 传递给回调

javascript - couchdb 中 "_id"上的索引默认存在?

javascript - 如何在多个文件中使用数组?

node.js - 如何在变异graphQL Playground中传递变量?

javascript - exec() 命令未在标准输出中显示输出

couchdb - 对于集群 CouchDB 设置,我应该继续使用 BigCouch 吗?

couchdb - Cloudant数据库数量限制