361

私が見た主な違いは次のとおりです。

  • ハンドルバーには#if#unless#with、および#each
  • ハンドルバーはヘルパーを追加します
  • ハンドルバー テンプレートがコンパイルされます (Mustache もコンパイル可能)
  • ハンドルバーはパスをサポート
  • in ブロックの使用を許可{{this}}します (現在のアイテムの文字列値を出力します)
  • Handlebars.SafeString()(そしておそらく他のいくつかの方法)
  • ハンドルバーは2 ~ 7 倍速くなります
  • 口ひげは反転セクションをサポートします(つまりif !x ...)

(上記に誤りがありましたらご指摘ください。)

私が見逃している他の大きな違いはありますか?

4

9 に答える 9

134

ほぼ完璧ですが、Mustache テンプレートもコンパイルできます。

Mustache にはヘルパーとより高度なブロックが欠けています。Handlebars のカスタム ヘルパーは非常に便利ですが、多くの場合、テンプレートにロジックを導入することになります。

Mustache にはさまざまなコンパイラ (JavaScript、Ruby、Python、C など) があります。ハンドルバーは JavaScript で始まりました。現在はdjango- handlebars 、handlebars.java、 handlebars -rubylightncandy (PHP)、 handlebars -objcなどのプロジェクトがあります。

于 2012-08-01T19:56:56.493 に答える
77

口ひげの長所:

  • 大規模で活発なコミュニティで非常に人気のある選択肢です。
  • Java を含む多くの言語でのサーバー側のサポート。
  • ロジックのないテンプレートは、プレゼンテーションとロジックを分離することを強いる素晴らしい仕事をします。
  • クリーンな構文は、作成、読み取り、および保守が容易なテンプレートにつながります。

口ひげの短所:

  • あまりにも論理的ではありません: 基本的なタスク (たとえば、異なる CSS クラスで交互に行にラベルを付ける) は困難です。
  • ビュー ロジックは、多くの場合、サーバーにプッシュ バックされるか、「ラムダ」(呼び出し可能な関数) として実装されます。
  • ラムダがクライアントとサーバーで機能するには、JavaScript で記述する必要があります。

ハンドルバーの長所:

  • ロジックのないテンプレートは、プレゼンテーションとロジックを分離することを強いる素晴らしい仕事をします。
  • クリーンな構文は、作成、読み取り、および保守が容易なテンプレートにつながります。
  • 解釈されたテンプレートではなくコンパイルされたテンプレート。
  • 口ひげよりもパスのサポートが優れています (つまり、コンテキスト オブジェクトに深く到達します)。
  • 口ひげよりもグローバルヘルパーのサポートが優れています。

ハンドルバーの短所:

  • サーバー上でレンダリングするには、サーバーサイド JavaScript が必要です。

出典:クライアント側テンプレートのスローダウン: mustache、handlebars、dust.js など

于 2013-12-28T10:21:31.313 に答える
26

微妙ではあるが重要な違いの 1 つは、2 つのライブラリがスコープにアプローチする方法にあります。現在のコンテキスト内で変数が見つからない場合、Mustache は親スコープにフォールバックします。ハンドルバーは空白の文字列を返します。

これは GitHub README でほとんど言及されておらず、次の 1 行があります。

Handlebars は、既定では再帰的なルックアップを実行しないという点で、Mustache とは少し異なります。

ただし、そこに記載されているように、Handlebars を Mustache と同じように動作させるフラグがありますが、パフォーマンスに影響します。

#これは、変数を条件として使用する方法に影響します。

たとえば、Mustache では次のことができます。

{{#variable}}<span class="text">{{variable}}</span>{{/variable}}

基本的には、「変数が存在し、真実である場合、変数を含むスパンを出力する」ことを意味します。ただし、ハンドルバーでは、次のいずれかを行う必要があります。

  • {{this}}代わりに使用
  • 親パスを使用します。つまり、{{../variable}}関連するスコープに戻ります
  • variablevariableオブジェクト内で子の値を定義する

詳細については、こちらをご覧ください。

于 2014-11-02T16:43:12.793 に答える
25

注: この回答は古くなっています。投稿当時はそうでしたが、今はそうではありません。

Mustache には多くの言語のインタープリターがありますが、Handlebars は Javascript のみです。

于 2014-01-18T17:09:28.253 に答える
9

{{#property}}...{{/property}}もう 1 つの微妙な違いは、ブロック内の偽値の処理です。ほとんどの口ひげの実装は、ここでは JS の偽りに従い、propertyis''または '0' の場合はブロックをレンダリングしません。

ハンドルバーはとのブロックをレンダリングします、他の偽の値はレンダリングしません。これにより、テンプレートの移行時に問題が発生する可能性があります。''0

于 2015-11-19T10:35:10.190 に答える
5

「ハンドルバー」について言及された短所の1つは、もはや実際には有効ではないと感じています.

Handlebars.java により、クライアントとサーバーの両方で同じテンプレート言語を共有できるようになりました。これは、SEO のためにサーバー側のレンダリングを必要とする 1000 以上のコンポーネントを含む大規模なプロジェクトにとって大きなメリットです。

https://github.com/jknack/handlebars.javaをご覧ください

于 2016-11-17T21:59:29.613 に答える
4

—ハンドルバーに「this」を使用し、口ひげの変数ブロック内にネストされた変数を使用することに加えて、口ひげのブロックでネストされたドットを使用することもできます。

    {{#variable}}<span class="text">{{.}}</span>{{/variable}}
于 2015-06-01T18:31:38.610 に答える