2

我设置了一个 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 重命名为 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);});}"

但它仍然是同样的错误。

4

1 回答 1

3

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

您可以在两者中使用它。

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

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

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

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

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

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

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

当然,您可以走唯一的客户端路线:在初始页面加载时也输出 json,然后在客户端上呈现。从 seo 的角度来看,这当然很糟糕。但是,有些应用程序不会对搜索引擎进行索引,在这种情况下,“一切都在客户端”方法是一个不错的选择。

一些相关问题:

于 2011-08-13T14:19:47.530 回答