Почему в Jade/pug, при вызове миксина более одного раза, в следующие дублируется его содержимое?

Проблема с дублированием содержимого при вызове одного и того же миксина в Jade/Pug возникает из-за особенностей работы данного шаблонизатора.

Jade/Pug обрабатывает миксины таким образом, что при каждом вызове миксина в шаблоне, он заменяется его содержимым. Это означает, что если содержимое миксина включает другие элементы шаблона, то они также будут включены в результате каждого вызова этого миксина.

Например, рассмотрим следующий пример:

mixin box
  .box
    p Content

+box
+box

В этом примере у нас есть миксин "box", который создает блок div с классом "box" и вложенным абзацем. Затем мы вызываем этот миксин дважды. Ожидаемо, что мы получим два блока div с абзацем внутри каждого из них. Но на самом деле, из-за замены содержимого миксина при каждом вызове, у нас будет два идентичных блока div с абзацем в каждом из них, то есть содержимое миксина будет дублировано.

Чтобы избежать этого дублирования, вам нужно разделить содержимое миксина на несколько блоков и вызывать только нужные блоки при каждом вызове. Для этого в Jade/Pug используется директива блока "block" и оператор "yield".

Приведем пример правильного использования блоков:

mixin box
  .box
    block content

+box
  block content
    p Content 1

+box
  block content
    p Content 2

В этом примере у нас также есть миксин "box" с блоком "content". Но в этом случае мы используем директиву блока и оператор "yield" для передачи разного содержимого в каждом вызове. В результате мы получим два блока div с разным содержимым внутри каждого из них, а дублирования не произойдет.

Таким образом, чтобы избежать дублирования содержимого при вызове миксина в Jade/Pug, вам необходимо разделить содержимое миксина на блоки и вызывать только нужные блоки при каждом вызове, используя директиву блока "block" и оператор "yield".