バージョン2.3.1以降、カスタム区切り文字はMustache.parse()
では機能しなくなったようです。 次の例を参照してください。
これはおそらく#663とその修正に関連しています。 代わりに新しいMustache.tags = [...]
を使用してこれを復元できることに注意してください: https ://codepen.io/mbrodala/pen/QBJoOx
これを見ていただけませんか?
レポート@mbrodalaをどうもありがとう、それらのcodepensは大いに感謝されます!
@mbrodalacodepensをありがとう。
ここで誤解があったのではないでしょうか。
describe('when parsing a template with tags specified followed by the same template with different tags specified', function() {
it('returns different tokens for the latter parse', function() {
var template = "(foo)[bar]";
var parsedWithParens = Mustache.parse(template, ['(', ')']);
var parsedWithBrackets = Mustache.parse(template, ['[', ']']);
assert.notDeepEqual(parsedWithBrackets, parsedWithParens);
});
});
parse
関数は、キャッシュキーとしてtemplate
のみを使用してキャッシュしていたため、次にparse
を使用してそのテンプレートを解析すると、まったく同じトークンが返されます。指定されたtags
が異なる場合。
tags
はオプションのパラメーターであり、省略した場合はmustache.tags
にフォールバックします。これは、デフォルトでは['{{', '}}']
です。 フォールバックmustache.tags
は、キャッシュキーの一部として使用されます。
バグ修正と期待に関して何が起こっているのかを知っていると思います。それをウォークスルーして、例としてcodepenを使用します。
Mustache.parse(template, ['[[', ']]']);
2.3.0では、これはMustacheに['[[', ']]']
をタグとして使用して$ template
を解析するように指示します。 Mustacheはこれを行い、正しい結果を返しますが、 template
のみを使用して呼び出しをキャッシュします。 [email protected]
の447〜450行目を参照してください。
if (tokens == null)
tokens = cache[template] = parseTemplate(template, tags);
codepenでの次の呼び出しは次のとおりです。
var output = Mustache.render(
template,
...
render
はtags
パラメータを受け取らないため、 parse
に1を渡さないため、 render
が呼び出されると、 parse
はmustache.tags
を使用します。タグとしてrender
呼び出しが行われると、事実上parse
に、「 template
を解析し、暗黙的に['{{', '}}']
をtags
として使用してください。 parse
は実際には間違ったことを行い、 tags
とmustache.tags
の両方を完全に無視してキャッシュルックアップを実行します。 [['[', ']']]
で解析されたテンプレートの結果が返されることがありますが、これは、そのtemplate
に対するプログラム全体でのparse
への最初の呼び出しが['[[', ']']]
で行われたためです。 tags
。
Mustache.parse(template, ['[[', ']]']);
解析結果は、 template
とtags
の両方を使用してキャッシュされます。これは、cacheKeyとして['[[', ']]']
です。
次の呼び出し:
var output = Mustache.render(
template,
...
render
はparse
$を呼び出し、 template
を渡しますが、 tags
省略します。 したがって、 parse
ではtags
がmustache.tags
にフォールバックします。これは、デフォルトの['{{', '}}']
のままです。 parse
は、 template
と['{{', '}}']
のキャッシュキーに対してキャッシュルックアップを実行し、 parse
がまだ呼び出されていないため、予想どおりにキャッシュミスが発生します。 template
とタグの組み合わせで。 したがって、 ['{{', '}}']
$を使用してtemplate
を解析します。
v2.3.1は正しい動作を示していると思います。 https://codepen.io/mbrodala/pen/QBJoOxのcodepenを少し変更して、v2.3.0に対して実行する場合:
var template = "[[item.title]] [[item.value]]";
Mustache.parse(template, ['[[', ']]']);
var output = Mustache.render(
template,
{
item: {
title: "TEST",
value: 1
}
}
);
alert(output);
出力は[[item.title]] [[item.value]]
ですが、これは予期されていません。
Mustache.parse
とMustache.render
の呼び出しは互いに隣接しており、1つはそうではない可能性があるため、 https://codepen.io/mbrodala/pen/NBEJjXでの動作がどのように驚くべきかがわかります。 Mustache.parse
がtags
引数を取ることさえ理解してください。 (なぜMustache.parse
はtags
引数を取るのですか? mustache.js
のどこでも使用されることはありません- parse
単に内部的にmustache.tags
にデフォルト設定されます。 ..)
動作の変更が実際にバグ修正リリースの期待に反する場合、私は何をすべきか正確にはわかりません。 1つの可能性は、#664を元に戻した別のバグ修正バージョンをリリースすることです。これにより、すべてのキャッシュ動作が事実上削除されます(#643では、すべてのキャッシュルックアップが失敗します)。 その後、#664を次のメジャーリビジョンに戻すことができます。 もう1つの可能性は、バグ修正リリースですべてのキャッシングを削除し(機能しないキャッシングでmustache.js
をリリースするのではなく)、すべてのキャッシングを次のメジャーリビジョンに戻すことです。 前者のオプションはおそらくリスクが少ない(コード変更の量が最も少ない)が、後者のオプションはおそらくより「正しい」。 @phillipjの考え?
私のPOVから完全に理にかなっている詳細な調査に感謝します。
変更についてはまったく気にしませんが、キャッシュヒットを確実にするためにtags
をMustache.render()
に渡すことは不可能であり、 Mustache.parse()
がtemplate
をキャッシュするためにアドバタイズされることを考えるとtags
については触れていません)これを本当に元に戻す必要があるのではないかと思います。
tags
のカスタムセットを使用してMustache.parse
を呼び出すと仮定すると、 template
はこれらの区切り文字を使用すると仮定することもできます(BTW、「タグ」と「区切り文字」は片付けも)。 その後、指定されたtemplate
がすでにキャッシュされているかどうか、およびその場合はどのようにコンパイルされたかに関係なく、 Mustache.render
への呼び出しが機能すると想定できます。 現在、カスタムtags
が使用されている場合、これは保証されません。
@mbrodalaはい、それは理にかなっていますが、 Mustache.parse(template, ['[[', ']]']);
の後にMustache.parse(template, ['((', '))']);
$が続くと、まったく同じ結果が得られることは予想外です。
これがストローマンの解決策/妥協案です(私はそれが好きではないので「ストローマン」ですが、ブレインストーミングする価値があります)。 template
のみと、タグ付きのtemplate
の両方に対して、$ parse
キャッシュを設定できます。 parse
がtags
指定して呼び出されると、 template
およびtags
に対してルックアップが実行されます。 tags
parse
を呼び出すrender
を呼び出すと、 template
のみに対してルックアップを実行します。 考え?
音は鳴りますが、基本的には修正されていますが、修正をそのままにしてこの問題を修正します。 私のPOVからOK。
@mbrodalaは、 tags
をrender
に渡すことができない主要な問題ですか? tags
パラメータをrender
に追加することもできます。
@petrkoutnyswこれはおおよそあなたも経験している問題ですか?
少なくともparse()
とrender()
の間の不一致です。 確かにカスタムタグをrender()
に渡すことができれば、 parse()
を使用することすらありません。 そして今、適切なキャッシングが適切に行われると、これはより明白になります。
多くの混乱を排除するためにrender()にタグパラメータを追加するための+1-この変更によっても少しずつ得られ、リンクb/wの解析とレンダリングは常に必要以上に魔法のように見えました。
では、バグ修正リリースでキャッシュを無効にして、当面の問題を修正し、セマンティックバージョニングに準拠し、次のメジャーリリースでrender
メソッドにtags
を再導入してみませんか? (繰り返しますが、私は私が提案したストローマンソリューションの大ファンではありません。)
その徹底的なウォークスルー@raymond-lamに感謝します!
私は提案されたバグ修正リリースに傾倒しています。これは主に、この動作の変更が予期しないものであり、したがって、実際のプロジェクトに大混乱を引き起こす可能性がある、semverの懸念とプロジェクトのためです。
計画されている次のメジャーリリースでキャッシュ動作を再導入し、リリースノートに移行手順を含めることができます。
@phillipj #643と#664をロールバックするプルリクエスト#670を発行しました。 リスクを軽減するために、キャッシュをすべて無効にするのではなく、(バグ修正リリースで)v2.3.0の動作に戻すのが、Mustache v2.xxに依存する場合に最も安全なようです。メジャーリリースで再導入するために、別のプルリクエストを発行します。
@phillipj #671は、メジャーリリースを待つために、キャッシュの修正を再導入します。
`renderへのtags
の追加に対処するために問題#672を作成しました。
これを調べて修正してくれてありがとう、皆さんはロックします。 👍
これは@raymond-lamに敬意を表します! 皆さんにも感謝します。予期せぬ変化がいつ起こったのかを知ることは私たちにとって非常に重要です。
v2.3.2が公開されました🚀