O menu é um dos pontos críticos de performance em uma loja. Por estar presente em (quase) todas as páginas, quando mal otimizado, pode fazer com que qualquer página tenha problemas de performance independente do quão bem implementada ela esteja. Neste passo, vamos aprender como otimizar a sua implementação para, não só viabilizar a edição deste no Site Editor, como reduzir o overhead de blocos necessários em sua definição
Props vs children
Em geral uma implementação de menu em uma loja segue o seguinte padrão:
_26{_26 "vtex.menu@2.x:menu#category-menu": {_26 "children": [_26 "menu-item#category-electronics",_26 "menu-item#category-major-appliances",_26 "menu-item#category-small-appliances"_26 ]_26 },_26 "menu-item#category-electronics": {_26 "props": {_26 "id": "menu-item-category-electronics",_26 "type": "custom",_26 "iconId": null,_26 "highlight": false,_26 "itemProps": {_26 "categoryId": 153,_26 "type": "internal",_26 "href": "/electronics/",_26 "noFollow": true,_26 "tagTitle": "Electronics",_26 "text": "Electronics"_26 }_26 }_26 },_26 ..._26}
Existem dois problemas em implementar um menu desta forma:
-
Por se usar o
children, o menu passa a ter implementação parecida com a de um layout, o que faz com que todo o conteúdo dentro dele não seja facilmente editável no Site Editor -
Para cada novo menu que for criado, é necessária a definição de um novo bloco, o que aumenta o overhead dos blocos que são necessários para compor uma página
Atividade
-
Para melhorar, então, a performance do menu da nossa Appliance Store, vá até o arquivo
/store/blocks/header/category-menu.jsonce remova sua seção dechildren:_10{_10"vtex.menu@2.x:menu#category-menu": {_10- "children": [_10- "menu-item#category-electronics",_10- "menu-item#category-major-appliances",_10- "menu-item#category-small-appliances"_10- ]_10}_10..._10}
NOTA: Não apague as definições destes blocos, eles estão sendo utilizados em outros lugares
-
Adicione agora uma nova seção de
propse um array deitems:_10{_10"vtex.menu@2.x:menu#category-menu": {_10+ "props": {_10+ "items": []_10+ }_10}_10..._10} -
Para fechar, para cada um dos
menu-itemsque tínhamos ("menu-item#category-electronics";"menu-item#category-major-appliances";"menu-item#category-small-appliances"), adicione suaspropscomo itens do array que criamos:_21{_21"vtex.menu@2.x:menu#category-menu": {_21"props": {_21"items": [_21+ {_21+ "id": "menu-item-category-electronics",_21+ "type": "custom",_21+ "iconId": null,_21+ "highlight": false,_21+ "itemProps": {_21+ "categoryId": 153,_21+ "type": "internal",_21+ "href": "/electronics/",_21+ "noFollow": true,_21+ "tagTitle": "Electronics",_21+ "text": "Electronics"_21+ }_21+ }_21+ ..._21]_21}
O resultado esperado é um menu exatamente igual ao que tínhamos, mas que agora conseguimos controlar pelo Site Editor e adicionar novos itens.
