Handlebars.js: プリコンパイルされたテンプレートのサーバー側(ノードJS)の読み込み

作成日 2015年02月05日  ·  12コメント  ·  ソース: handlebars-lang/handlebars.js

以下のようなプリコンパイルされたテンプレートを読み込もうとするたびに:
var compiledTemplate = handlebars.templates['hello'];
未定義のプロパティ「hello」を読み取れません。

一方、コンパイルは以下のように正常に機能します。
var uncompiledTemplate = handlebars.compile(template);

では、これらのコンパイル済みテンプレートをロードして、テンプレートのディレクトリ/ファイルから読み込まれるようにするためのプロトコルまたは構成は何ですか?
構成とファイル名を確認しました。ハンドルバーはバージョン(2.0ベータ版)で、コンパイラーのバージョンは6です。

ありがとう。

unverified

最も参考になるコメント

@ sido420

また、プリコンパイルされたテンプレートをサーバー側で使用したかったのです。

ラムダ関数を使用してHTMLコンテンツを含むメールを送信しているので、関数の実行時間とパッケージサイズ( handlebars/runtimeは小さい)を可能な限り最小限に抑えたいと思いました。

プリコンパイルされたテンプレート( mjml -> html -> handlebars precompiled )を生成するスクリプトがあります。

それは次のようなものです:

javascript const Handlebars = require('handlebars') const precompiledContent = Handlebars.precompile('<b>{{ message }}</b>') fs.writeFileSync('xyz/template.js', `module.exports = ${precompiledContent}`, 'utf8')

次に、次のようなテンプレートを使用できます。

const Handlebars = require('handlebars/runtime') const message = 'Hi' const template = require('./template.js') const content = Handlebars.template(template)({ message })

全てのコメント12件

これは再現するのに十分な情報ではありません。 あなたがやろうとしていることの完全な例を提供できますか?

確かに、ここに行きます。

var template = fs.readFileSync(“./hello.html", "utf8");
var data = {message : "Hello world!"};

var compileTemplate = handlebars.compile(template);
var finalPageHTML = compileTemplate(data);

// Simply trying to replace the last two lines above with the two below but get error

/* var preCompiledTemplate =  handlebars.templates['hello'];
    var finalPageHTML = preCompiledTemplate(data);
*/

* hello.html *

<html>
    <head>
        <title>Example</title>
    </head>
    <body>
        <p>Oh look, it's a message: {{message}}</p>
    </body>
</html>

上記のファイルの名前をhello.handlebarsに変更し、hello.jsにコンパイルして、「js」ディレクトリの下の「templates」というディレクトリに配置しました。

したがって、単に「プリコンパイルされた」テンプレートをロードして、サーバー側で動的ページを生成しようとします。

プリコンパイルされたテンプレートは、ある時点でコンパイルする必要があり、それらを操作するには追加の手順が必要なため、通常はサーバーでの使用を目的としていません。 最初のバージョンが推奨ルートですが、次のようなことができると思います

var template = require('./hello.handlebars');

「プリコンパイルされたテンプレートをコンパイルする必要がある」ということを理解していません。 プリコンパイル済みとは、それらがすでにコンパイルされていることを意味します。 右 ?

ハンドルバーテンプレートは.jsファイルにコンパイルされ、dbデータまたはコンテキストで埋められて最終ページが生成されます。 正しい ?

だから私はスピードのためにプリコンパイルしようとしているので、最終的な送信のためにサーバー側で実行時にデータベースデータを提供するコース外のページを動的に生成できます。クライアントブラウザへの「text / html」として。

私の質問は、hello、handlebarから作成されたhello.jsから「hello」テンプレートをロードして、コンパイルされたテンプレートオブジェクトを作成する方法です。 または、コンパイルしたすべてのテンプレートを含む集約templates.jsファイルから「hello2」という別のテンプレートを言います。 ちなみにrequireを試してみましたが、うまくいきません。

私が老人であるならば、謝罪しなさい。

プリコンパイル済みとは、クライアントのためにプリコンパイルされていることを意味します。 これらは、ノードコンシューマーが自動的に利用できるようにはなりません。

readFileSyncを使用した例は、テンプレートをロードするための最も簡単でおそらく最良の方法であるため、そこに正しい道を進んでいます。

@RozzyNoderこんにちは私はこれに似た何かをしようとしています。 あなたはそれをうまく動かすことができましたか? 出力されたプリコンパイルされたテンプレートをファイルに取り、後でそれらを変数に読み取ろうとするたびに、jsonは技術的に関数を持たないはずですが、もちろんhbsテンプレートは関数であるため、jsonの解析は失敗します。

私はまた、ハンドルバーサイト自体からのものである、完全に単純な例を試しました

 var templateSpec = Handlebars.precompile('{{foo}}');
 var template = Handlebars.template(templateSpec);
 template({});

そして私は次のようなエラーが発生します:
新しい_Exception2 'デフォルト'をスローし

ちなみに、これはgulp3.9.0とハンドルバー3.0.3を介して実行されます。

私はあなたが持っているかもしれないありとあらゆる洞察が大好きです。 私は本当に立ち往生していて、これがすぐに機能する必要があります(明日のように)

前もって感謝します。

@ kpdecker @ ekskimnで説明されているのと同じことを達成しようとしています。 HTMLコードをループで生成するので、テンプレートを事前にコンパイルするとプロセスがスピードアップすると思います。 何を指示してるんですか? また、ユーザーが提供したテンプレート(ユーザー入力)を処理する必要がある場合に備えて、サーバーでXSSセキュリティを確保するためにテンプレートをプリコンパイルする必要があるという投稿をどこかで見つけた(どこを思い出せない)ことにも言及する必要があります。

@xpepermintループがある場合、私が知っていることから、次のようなことを行うとパフォーマンスが向上するはずです。

var template = Handlebars.compile("{{title}}\n{{text}}");
largeArray.map(function(element) {
  return template(element);
});

ループの前にテンプレートをコンパイルし、コンパイルされた関数をループ内で呼び出すだけです。

@nknapp thx

誰かがプリコンパイルされたテンプレートをサーバー側で使用することに成功しましたか?

@ sido420

また、プリコンパイルされたテンプレートをサーバー側で使用したかったのです。

ラムダ関数を使用してHTMLコンテンツを含むメールを送信しているので、関数の実行時間とパッケージサイズ( handlebars/runtimeは小さい)を可能な限り最小限に抑えたいと思いました。

プリコンパイルされたテンプレート( mjml -> html -> handlebars precompiled )を生成するスクリプトがあります。

それは次のようなものです:

javascript const Handlebars = require('handlebars') const precompiledContent = Handlebars.precompile('<b>{{ message }}</b>') fs.writeFileSync('xyz/template.js', `module.exports = ${precompiledContent}`, 'utf8')

次に、次のようなテンプレートを使用できます。

const Handlebars = require('handlebars/runtime') const message = 'Hi' const template = require('./template.js') const content = Handlebars.template(template)({ message })

@RozzyNoder @ekskimn私はなんとかこれを機能させることができましたが、わずかな変更がありました。 以下のコードスニペットでhello.jsを参照する代わりに、

var preCompiledTemplate = handlebars.templates['hello']; var finalPageHTML = preCompiledTemplate(data);

.jsファイルの生成に使用される実際のhbsファイルを参照してください。

var preCompiledTemplate = handlebars.templates['hello.hbs']

このページは役に立ちましたか?
0 / 5 - 0 評価