私が見た主な違いは以下のとおりです。
#if
、#unless
、#with
、および#each
を追加します{{this}}
の使用を許可します(これは現在のアイテムの文字列値を出力します)Handlebars.SafeString()
(そしておそらく他の方法)if !x ...
)(上記に問題がある場合は訂正してください。)
私が見逃している他の大きな違いはありますか?
あなたはほとんどそれを釘付けにしました、しかし、口ひげのテンプレートもコンパイルすることができます。
口ひげは、それが論理的であるように努めるので、ヘルパーおよびより高度なブロックを欠いています。ハンドルバーのカスタムヘルパーは非常に便利ですが、多くの場合テンプレートにロジックを導入することになります。
Moustacheには、さまざまなコンパイラ(JavaScript、Ruby、Python、Cなど)があります。ハンドルバーはJavaScriptで始まりました。現在は Django-handlebars 、 handlebars.Java 、 handlebars-Ruby 、 lightncandy(PHP)のようなプロジェクトがあります。 、および handlebars-objc 。
口ひげのプロ:
口ひげの短所:
ハンドルバー長所:
ハンドルバーの短所:
1つの微妙ではあるが大きな違いは、2つのライブラリーがスコープにアプローチする方法にあります。現在のコンテキスト内で変数が見つからない場合、Moustacheは親スコープにフォールバックします。ハンドルバーは空白の文字列を返します。
これについてはGitHubのREADMEにほとんど記載されていません。
ハンドルバーは、デフォルトでは再帰的ルックアップを実行しないという点でMustacheとは少し異なります。
しかし、そこに記されているように、HandlebarsをMoustacheと同じように振る舞わせるフラグがあります - しかしそれはパフォーマンスに影響します。
これは、#
変数を条件文として使用する方法に影響します。
例えばMoustacheではこれができます:
{{#variable}}<span class="text">{{variable}}</span>{{/variable}}
それは基本的に「変数が存在し、真実であれば、その中の変数で範囲を表示する」という意味です。しかしハンドルバーでは、どちらかをしなければならないでしょう:
{{this}}
を使用してください{{../variable}}
を使用しますvariable
オブジェクト内に子のvariable
値を定義するこの詳細については、必要に応じて ここ をご覧ください。
注:この答えは時代遅れです。投稿された時点では真実でしたが、もはやそうではありません。
Mustacheは多くの言語の通訳を持っていますが、HandlebarsはJavascriptのみです。
それらの間のもう一つの違いはファイルのサイズです:
Handlebars.jsのパフォーマンス上の利点を確認するには、プリコンパイル済みテンプレートを使用する必要があります。
もう1つ微妙な違いは、{{#property}}...{{/property}}
ブロック内の偽の値の扱いです。 property
が''
または '0'の場合、ほとんどのヒゲ実装はここではJSの偽造に従うだけで、ブロックをレンダリングしません。
ハンドルバーwill''
と0
のブロックをレンダリングしますが、他の偽の値はレンダリングしません。これはテンプレートを移行するときに問題を引き起こす可能性があります。
私は、 "ハンドルバー"に関する上記の短所の1つが、もはや有効ではないと感じています。
Handlebars.Javaにより、クライアントとサーバーの両方で同じテンプレート言語を共有できるようになりました。これは、SEO用にサーバーサイドでのレンダリングが必要な1000以上のコンポーネントを含む大規模プロジェクトにとって大きなメリットです
- ハンドルバーに "this"を使用し、口ひげ用に変数ブロック内のネストされた変数を使用することに加えて、口ひげ用にブロック内のネストされたドットを使用することもできます。
{{#variable}}<span class="text">{{.}}</span>{{/variable}}