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はサーバー側で実行されるため、これにより、テンプレートを1回定義して(この場合はMustacheを使用)、サーバー側(Node.jsを使用)とクライアント側(jqueryを使用)の両方で実行することができます。プラグイン)。

概要について(すでにご存知かもしれませんが):製品の検索結果をレンダリングすることを想像してみてください。

  • 従来の方法は、サーバー側のテンプレートエンジンを使用して製品をレンダリングすることです。
  • ここで、検索結果のフィルタリング/並べ替えを有効にするとします。一般的に言えば、3つのオプションがあります。

    1. サーバーに対して通常の(非ajax呼び出し)を実行し、サーバー側のテンプレートを実行して、新しいページを吐き出します
    2. サーバーへのajax呼び出しを実行し、サーバー側でテンプレートを作成してhtmlを吐き出し、クライアント側で取得してdom要素に挿入します。
    3. サーバーへのajax呼び出しを実行し、json-objectを生成します。これは、クライアント側のテンプレートエンジン(Mustacheなど)を使用してクライアント側でdom要素にレンダリングします。

オプション3は、使いやすさの観点からは間違いなく最良のソリューションです。(高速、低帯域幅、ページのちらつきやページのジャンプなどはありません)。ただし、必要に応じて、SEOのフォールバック/非JavaScriptの方法を検討してください。

ただし、オプション3を実装すると、最初のページの読み込み時に製品をレンダリングするためのサーバー側のテンプレート言語と、後続のajax呼び出しから返された製品をレンダリングするためのクライアント側のテンプレート言語が必要になる状況になります。どちらもまったく同じhtmlになります。あまり乾燥していません。

ここでnode.jsが機能し、サーバー側の個別のテンプレートを作成する必要がなくなります。代わりに、クライアント側で使用するのとまったく同じ口ひげテンプレートを使用して、node.jsに最初のページを吐き出させます。

もちろん、クライアント側の唯一のルートを使用することもできます。最初のページの読み込みでjsonを吐き出し、それをクライアントでレンダリングします。もちろん、これはseoの観点からひどい場合です。ただし、一部のアプリは検索エンジンインデックスを作成しません。その場合、「クライアント上のすべて」のアプローチが適切な代替手段になります。

いくつかの関連する質問:

于 2011-08-13T14:19:47.530 に答える