0

翡翠とハンドルバーを混ぜ合わせているので、HTMLを書く必要がなく、データ関連のものに適した構文を使用できます。

たとえば、これはヘッダーのテンプレートである可能性があります。header.handlebars.jade

html
  {{#with user}}
  {{if user.username}}
  header Welcome back, {{username}}
  {{/if}}
  {{/with}}

node.jsでサーバー側で使用するときに、このテンプレートをjadeでプリコンパイルしてから、ハンドルバーでプリコンパイルする必要があるかどうか疑問に思っていますか?そうでない場合は、基本的に、リクエストごとにこのテンプレートを2回(最初にヒスイ、次にハンドルバー)コンパイルします。

これが何らかの役割を果たすかどうかは完全にはわかりませんが、とは両方とも同期関数であるように見えjade.compileますHandlebars.compile。つまり、コンパイルが行われている限り、他のリクエストをブロックしているということです。

4

1 に答える 1

0

はい、テンプレートを事前にコンパイルすることをお勧めします。その理由は、テンプレートの使用は通常2つのステップで構成されているためです。

  1. 構文解析
  2. データと解析されたテンプレートから文字列を生成する

解析はコストのかかる操作です。基本的には、トークン(特別な単語)の識別とツリー構造の構築で構成されます。例えば:

{{#with author}}
  <h2>By {{firstName}} {{lastName}}</h2>
{{/with}}

withこのブロックは、親ステートメントといくつかの子、、、および"<h2>By "を持つfirstnameツリーと考えることができます。lastName"</h2>"

テンプレートをプリコンパイルすると、そのツリー構造を解析して生成した結果であるコードが生成されるため、そのコードを使用するたびに、ツリーを解析して生成する必要はありません。多くのCPUサイクルを節約できます。

ロジックは、サーバーの起動時にいくつかのファイルを同期的に読み取るか、毎回読み取るかと同じです。最初にテンプレートファイルを読み取ると、IO操作は少なくなりますが、それらのテンプレートのコンテンツを保存するためにより多くのメモリを使用します。同じことが構文解析にも当てはまります。

私たちの多くが行うことは、どのアセットが頻繁に使用されるかを特定し(テンプレートは通常このカテゴリにあります)、それらをメモリにキャッシュし、残りをオンデマンドで読み取るために残します。つまり、テンプレートを変更してサイトを更新するだけでは不十分です。サイトをバージョン管理する必要があります。更新を行うには、ノードプロセスを強制終了して再起動する必要があります。それがサイトにとって良いアイデアであるかどうかは、展開をどのように編成するかによって異なります。

JadeとHandlebarsを組み合わせる限り、2つの異なるテンプレートをレンダリングするのはよりコストのかかる操作であり、そのうちの1つしかプリコンパイルできないため、良い考えとは思えません。一方のテンプレートはもう一方の結果に依存するため、両方をプリコンパイルすることはできません。あなたの場合、Jadeテンプレートの「ソースコード」は、Handlebarsテンプレートを適用した結果によって異なります。

于 2013-03-13T15:37:38.167 に答える