bem-site / bem-forum-content-ru

Content BEM forum for Russian speak users
MIT License
56 stars 6 forks source link

Для чего нужен replace если есть wrap? #1473

Open vill opened 6 years ago

vill commented 6 years ago

Всем привет. Для чего нужен режим replace если его функционал вроде как полностью реализован в режиме wrap? При этом wrap не делает зацикливание при замене узла на себя с обёрткой. В каких случаях нужно использовать replace а в каких wrap, что может такого replace чего не может сделать wrap и наоборот, исключая что wrap не уходит в бесконечный цикл как replace в остальном какие различия у них?

[Пример](https://bem.github.io/bem-xjst/?version=8.5.2&engine=BEMHTML&template=%0Ablock(%27block1%27).replace()(%7B%20block%3A%20%27link%27%2C%20content%3A%20%7B%7D%20%7D)%3B%0A%0Ablock(%27block2%27).wrap()(%7B%20block%3A%20%27link%27%2C%20content%3A%20%7B%7D%20%7D)%3B&bemjson=(%5B%0A%20%20%20%20%7B%20block%3A%20%27block1%27%20%7D%2C%0A%20%20%20%20%7B%20block%3A%20%27block2%27%7D%0A%5D)%3B%0A):

([
    { block: 'block1' },
    { block: 'block2' }
]);
block('block1').replace()({ block: 'link', content: {} });

block('block2').wrap()({ block: 'link', content: {} });
<div class="link">
    <div></div>
</div>
<div class="link">
    <div></div>
</div>
tadatuta commented 6 years ago

wrap() как раз тем и отличается, что дополнительно создает флаг для защиты от зацикливания

vill commented 6 years ago

@tadatuta, если они ни чем кроме этого не отличаются и wrap ведет себя более корректно, для чего тогда нужны 2 почти одинаковых режима с разными названиями, т.е. можно сказать что если бы текущий replace убрали и вместо него использовали wrap под названием replace то ничего по сути не изменилось? Других отличий вообще у них нет? Одно дело, когда введен режим-помощник например prependContent который позволяет писать меньше кода и он сам знает что и как объединить, но wrap в этом плане не такой умный, ему надо указать конкретно что и куда выводить и если этого не сделать то он работает как replace, для чего тогда нужен такой небезопасный replace?

tadatuta commented 6 years ago

Суть replace() как раз в том, чтобы не делать лишних манипуляций, которые не нужны никогда, кроме ситуации, когда сущность заменяется сама на себя (а это все-таки очень частный случай).

vill commented 6 years ago

Имеется ввиду что движок при обработке режима replace работает быстрее чем при режиме wrap или о каких "лишних манипуляциях" идет речь? Если да, то wrap работает медленнее даже если не содержит код для замены узла?

block('block1').replace()({ block: 'link', content: {} });

block('block2').wrap()({ block: 'link', content: {} });
tadatuta commented 6 years ago

wrap() будет создавать флаг от зацикливания даже если исходная сущность не вставляется внутрь, так что в примере выше стоит использовать replace()