Mustache.js: Mustache.parse()のカスタム区切り文字が2.3.1以降機能しない

作成日 2018年08月09日  ·  16コメント  ·  ソース: janl/mustache.js

バージョン2.3.1以降、カスタム区切り文字Mustache.parse()では機能しなくなったようです。 次の例を参照してください。

  • 2.3.0、動作中、値が挿入されます: https ://codepen.io/mbrodala/pen/vaQPxK
  • 2.3.1:壊れている、値が挿入されていない: https ://codepen.io/mbrodala/pen/NBEJjX

これはおそらく#663とその修正に関連しています。 代わりに新しいMustache.tags = [...]を使用してこれを復元できることに注意してください: https ://codepen.io/mbrodala/pen/QBJoOx

これを見ていただけませんか?

全てのコメント16件

レポート@mbrodalaをどうもありがとう、それらのcodepensは大いに感謝されます!

@mbrodalacodepensをありがとう。
ここで誤解があったのではないでしょうか。

643と#664は、#617で報告したバグを修正します。これは、#643に付随するこのテストで示されています。

  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を使用します。

v2.3.0

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,
...

rendertagsパラメータを受け取らないため、 parseに1を渡さないため、 renderが呼び出されると、 parsemustache.tagsを使用します。タグとしてrender呼び出しが行われると、事実上parseに、「 templateを解析し、暗黙的に['{{', '}}']tagsとして使用してください。 parseは実際には間違ったことを行い、 tagsmustache.tagsの両方を完全に無視してキャッシュルックアップを実行します。 [['[', ']']]で解析されたテンプレートの結果返されることがありますが、これは、そのtemplateに対するプログラム全体でのparseへの最初の呼び出しが['[[', ']']]で行われたためです。 tags

v2.3.1

Mustache.parse(template, ['[[', ']]']);

解析結果は、 templatetagsの両方を使用してキャッシュされます。これは、cacheKeyとして['[[', ']]']です。

次の呼び出し:

var output = Mustache.render(
  template,
...

renderparse $を呼び出し、 templateを渡しますが、 tags省略します。 したがって、 parseではtagsmustache.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.parseMustache.renderの呼び出しは互いに隣接しており、1つはそうではない可能性があるため、 https://codepen.io/mbrodala/pen/NBEJjXでの動作がどのように驚くべきかがわかります。 Mustache.parsetags引数を取ることさえ理解してください。 (なぜMustache.parsetags引数を取るのですか? mustache.jsのどこでも使用されることはありません- parse単に内部的にmustache.tagsにデフォルト設定されます。 ..)

動作の変更が実際にバグ修正リリースの期待に反する場合、私は何をすべきか正確にはわかりません。 1つの可能性は、#664を元に戻した別のバグ修正バージョンをリリースすることです。これにより、すべてのキャッシュ動作が事実上削除されます(#643では、すべてのキャッシュルックアップが失敗します)。 その後、#664を次のメジャーリビジョンに戻すことができます。 もう1つの可能性は、バグ修正リリースですべてのキャッシングを削除し(機能しないキャッシングでmustache.jsをリリースするのではなく)、すべてのキャッシングを次のメジャーリビジョンに戻すことです。 前者のオプションはおそらくリスクが少ない(コード変更の量が最も少ない)が、後者のオプションはおそらくより「正しい」。 @phillipjの考え?

私のPOVから完全に理にかなっている詳細な調査に感謝します。

変更についてはまったく気にしませんが、キャッシュヒットを確実にするためにtagsMustache.render()に渡すことは不可能であり、 Mustache.parse()templateをキャッシュするためにアドバタイズされることを考えるとtagsについては触れていません)これを本当に元に戻す必要があるのではないかと思います。

tagsのカスタムセットを使用してMustache.parseを呼び出すと仮定すると、 templateはこれらの区切り文字を使用すると仮定することもできます(BTW、「タグ」と「区切り文字」は片付けも)。 その後、指定されたtemplateがすでにキャッシュされているかどうか、およびその場合はどのようにコンパイルされたかに関係なく、 Mustache.renderへの呼び出しが機能すると想定できます。 現在、カスタムtagsが使用されている場合、これは保証されません。

@mbrodalaはい、それは理にかなっていますが、 Mustache.parse(template, ['[[', ']]']);の後にMustache.parse(template, ['((', '))']); $が続くと、まったく同じ結果が得られることは予想外です。

これがストローマンの解決策/妥協案です(私はそれが好きではないので「ストローマン」ですが、ブレインストーミングする価値があります)。 templateのみと、タグ付きのtemplateの両方に対して、$ parseキャッシュを設定できます。 parsetags指定して呼び出されると、 templateおよびtagsに対してルックアップが実行されます。 tags parseを呼び出すrenderを呼び出すと、 templateのみに対してルックアップを実行します。 考え?

音は鳴りますが、基本的には修正されていますが、修正をそのままにしてこの問題を修正します。 私のPOVからOK。

@mbrodalaは、 tagsrenderに渡すことができない主要な問題ですか? 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が公開されました🚀

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

関連する問題

rlightner picture rlightner  ·  7コメント

Immortalin picture Immortalin  ·  12コメント

chlab picture chlab  ·  11コメント

funston picture funston  ·  7コメント

SmasherHell picture SmasherHell  ·  18コメント