Como controlar o layout de diagramas no Mermaid
Controle o layout de diagramas Mermaid 12 com ELK ou dagre. Defina opções globais e por diagrama, ajuste o ELK e restaure a aparência anterior à versão 12.
No Mermaid 12, a chave de configuração layout define o motor de layout: o ELK é o padrão para a maioria dos diagramas de grafo, e você define layout: dagre no front matter ou em mermaid.initialize() para voltar ao motor anterior.
Você atualizou, fez o rebuild do site de documentação, e um fluxograma que ninguém tocou agora tem um formato e cores diferentes. Uma seção de configuração por tipo de diagrama, como flowchart: { defaultRenderer: ... }, sugerida em alguma resposta antiga, não vai resolver o problema.
Este artigo aborda o que mudou, onde definir o layout, qual configuração tem prioridade, como ajustar o ELK e por que uma reversão pode parecer não ter efeito algum. Para o básico sobre fluxogramas, veja creating flowcharts for workflows.
Principais pontos
- Desde o Mermaid 12.0.0, diagramas de fluxograma, estado, classe, entidade-relacionamento, requisitos, caso de uso e agentflow que não definem um layout são organizados pelo ELK em vez do dagre.
layout: dagretraz de volta a disposição antiga, mas não a aparência antiga. A renderização completa anterior à versão 12 exigelayout: dagre,theme: defaultelook: classic.- O front matter ou uma diretiva em um diagrama sobrescreve
mermaid.initialize(), então uma configuração de dagre para todo o site não tem efeito em um diagrama que escolhe seu próprio layout. defaultRendererfoi removido das seções de configuração de flowchart, class e state no Mermaid 12. Use a chavelayoutde nível superior.- O build tiny não inclui o ELK e faz fallback para o dagre, a menos que você adicione
@mermaid-js/layout-elk.
O que mudou no Mermaid 12?
A partir do Mermaid 12, um diagrama que não especifica um layout é organizado pelo ELK em vez do dagre. Isso significa que um diagrama inalterado pode sair com um formato diferente depois da atualização. A página de configuração de Layouts lista sete tipos de diagrama que agora usam o ELK por padrão: fluxograma, estado, classe, entidade-relacionamento, requisitos, caso de uso e agentflow. O ELK vem incluído no pacote principal e se registra automaticamente. Os mindmaps continuam usando o cose-bilkent por padrão, e o tidy-tree vem do pacote separado @mermaid-js/layout-tidy-tree.
As release notes do mermaid@12.0.0 também descrevem uma segunda mudança. O tema padrão agora é o redux-color e o look padrão agora é o neo, para o conjunto mais amplo de tipos de diagrama listado nos padrões por diagrama da página de temas. Portanto, um diagrama na v12 pode ficar diferente por dois motivos distintos: o motor de layout mudou, e o tema e o look mudaram.
Onde definir o layout: front matter, initialize() ou configuração por tipo?
Você pode definir o layout do Mermaid em um único diagrama ou para todos os diagramas de um site. Também pode restringir o tema e o look a um único tipo de diagrama. Quando há conflito entre configurações, a mais específica prevalece.
| Escopo | Onde | Sintaxe | Prevalece sobre |
|---|---|---|---|
| Um diagrama | Front matter ou diretiva | config: layout: dagre | Tudo abaixo |
| Todos os diagramas | Nível superior de mermaid.initialize() | { layout: 'dagre' } | Padrões por tipo e globais |
| Um tipo de diagrama | Padrão embutido do tipo | (definido pelo Mermaid) | Padrão global |
| Tudo | Padrão global | (definido pelo Mermaid) | Nada |
As release notes da 12.0.0 apresentam a ordem de resolução assim: primeiro o front matter ou a diretiva, depois initialize(), em seguida o padrão do tipo de diagrama e, por fim, o padrão global.
Veja como reverter completamente um único diagrama:
---
config:
layout: dagre
theme: default
look: classic
---
flowchart LR
Request --> Auth{Valid token?}
Auth -->|yes| Handler
Auth -->|no| Reject
Para o site inteiro, a primeira chamada abaixo altera apenas o motor, então as novas cores permanecem. A segunda chamada traz de volta toda a renderização anterior à versão 12:
mermaid.initialize({ layout: 'dagre' });
mermaid.initialize({ layout: 'dagre', theme: 'default', look: 'classic' });
O Mermaid 12 também permite restringir theme, look e layout a um tipo de diagrama, dentro da seção de configuração desse tipo. Um valor com escopo prevalece sobre um valor global definido no mesmo lugar. Para mudar todos os diagramas para o dagre, mas restaurar a aparência antiga apenas nos diagramas de classe, mantenha layout no nível superior e coloque theme e look na seção class, como mostra a página de diagramas de classe:
mermaid.initialize({
layout: 'dagre',
class: { theme: 'default', look: 'classic' },
});
O front matter sempre prevalece sobre mermaid.initialize(). Suponha que um site defina layout: 'dagre' para todo o site e que um diagrama declare layout: elk no seu front matter. Esse diagrama será renderizado com o ELK.
Quando o layout ELK do Mermaid ajuda e como ajustá-lo?
Use o ELK para diagramas grandes ou carregados. Mantenha o dagre quando um diagrama pequeno já estiver com boa aparência. A documentação do Mermaid recomenda o ELK para grafos grandes e complexos, e o dagre continua disponível como o tradicional layout em camadas. Se seus diagramas eram bem renderizados antes da atualização, reverter para o dagre é uma escolha razoável.
A seção de layout da referência de sintaxe documenta várias chaves de ajuste do ELK, incluindo as seguintes. mergeEdges combina arestas paralelas. nodePlacementStrategy aceita SIMPLE, NETWORK_SIMPLEX, LINEAR_SEGMENTS ou BRANDES_KOEPF, sendo BRANDES_KOEPF o padrão no preset default. nodePlacementAlignment define o alinhamento do Brandes-Koepf (por exemplo, BALANCED ou NONE). Quando omitido, o alinhamento vem do preset.
---
config:
layout: elk
elk:
mergeEdges: true
nodePlacementStrategy: NETWORK_SIMPLEX
---
flowchart TD
Build --> Test --> Deploy
Build --> Lint --> Deploy
Diagramas que já usavam o ELK antes da v12 também podem mudar, porque o posicionamento Brandes-Koepf balanceado agora é o padrão. O schema de preset do ELK lista quatro valores de preset: legacy, default, modelOrder e depthFirst. Ele descreve depthFirst como o padrão anterior e informa que legacy reproduz a forma como o ELK renderizava antes da existência dos presets.
A saída do ELK também mudou ao longo da 12.x:
- O Mermaid 12.1.0 adicionou
orientFeedbackEdges, que vem ativado por padrão. Uma aresta que parte de um nó alimentado por um subgrafo e volta para esse mesmo subgrafo agora é roteada no sentido do fluxo, em vez de contornar o subgrafo. - O Mermaid 12.2.0 fez o ELK deixar de endireitar a extremidade de uma aresta quando isso colocaria um rótulo sobre outra aresta.
config:
layout: elk
elk:
preset: legacy
orientFeedbackEdges: false
Quais variantes do ELK e algoritmos por subgrafo você pode usar?
Além de layout: elk, a página de Layouts do Mermaid lista seis variantes do ELK que você pode usar como valores de layout: elk.stress, elk.force, elk.mrtree, elk.sporeOverlap, elk.box e elk.rectpacking.
---
config:
layout: elk.mrtree
---
flowchart TD
Root --> API
Root --> Web
API --> Workers
De acordo com as release notes da 12.0.0, elk.box e elk.rectpacking posicionam os nós, mas não roteiam as arestas, então elas são desenhadas como linhas retas de centro a centro.
Um único subgrafo pode escolher seu próprio algoritmo com @{ algorithm: ... }. As mesmas release notes listam como valores aceitos as seis variantes, além de elk.layered e elk.radial. Elas também informam duas coisas sobre essa sobrescrita: o Mermaid ignora valores não suportados, emitindo um aviso, e usa o algoritmo herdado sempre que arestas cruzam o limite do subgrafo.
Por que minha correção de layout não está funcionando?
A maioria das reversões que falham tem uma de cinco causas. Verifique-as nesta ordem:
- Você ainda define
defaultRenderer. A página de sintaxe de fluxogramas informa que ele foi removido das seções flowchart, class e state na v12. Uselayoutno lugar. - Você definiu apenas
layout: dagre. O tema redux-color e o look neo continuam ativos. Defina as três chaves. - O front matter sobrescreve seu
initialize(). Removalayoutdo front matter desse diagrama. - O nome de um layout está escrito errado ou não foi registrado. As release notes informam que o Mermaid faz fallback para o dagre com um aviso, em vez de lançar um erro. Verifique o console.
- Você está usando o build tiny. Veja a próxima seção.
Abandonar o defaultRenderer é uma mudança de uma linha:
// Before (removed in v12)
mermaid.initialize({ flowchart: { defaultRenderer: 'elk' } });
// After
mermaid.initialize({ layout: 'elk' });
Se a sua plataforma de documentação ainda não migrou para a v12, essas chaves podem continuar se comportando da forma antiga. Consulte a documentação da própria plataforma.
Por que o build tiny faz fallback para o dagre?
O build tiny do Mermaid não inclui o ELK, então qualquer diagrama que solicite o ELK nele é renderizado com o dagre. O pacote @mermaid-js/layout-elk continua sendo publicado para esse caso. Siga as etapas de registro na seção ELK and the tiny build da documentação de uso. No build normal, chamadas existentes a registerLayoutLoaders continuam funcionando, mas não são mais necessárias, e você pode removê-las.
Conclusão
Um diagrama que mudou após a atualização para o Mermaid 12 quase sempre tem duas causas: o motor de layout ELK e o novo tema e look. Decida o que você quer recuperar. Se quiser apenas os formatos antigos, defina layout: dagre. Para a renderização completa anterior à versão 12, defina layout: dagre, theme: default e look: classic. Em seguida, procure na sua configuração qualquer defaultRenderer remanescente e qualquer front matter que sobrescreva a escolha feita para o site inteiro.
Perguntas frequentes
A palavra-chave de diagrama flowchart-elk ainda funciona no Mermaid 12?
Sim. As release notes do Mermaid 12.0.0 informam que flowchart-elk continua funcionando como palavra-chave explícita de diagrama. O que mudou foi a opção defaultRenderer. O Mermaid a ignora em vez de rejeitá-la, então uma configuração que ainda a define não gera erro, mas também não tem efeito. Um diagrama que dependia de um defaultRenderer de flowchart com valor 'elk' para obter o layout ELK deve passar a definir layout: elk.
Incluir o ELK no pacote deixa o Mermaid 12 mais pesado para carregar?
Apenas o build de arquivo único cresce de forma perceptível. Nos builds ESM, o ELK é um chunk separado que só é carregado quando um diagrama o utiliza. As release notes da 12.0.0 informam que o build IIFE, mermaid.min.js, incorpora o ELK e cresce cerca de 500 kB com gzip. O build tiny não inclui o ELK, mantém o mesmo tamanho e organiza com o dagre os diagramas que solicitam o ELK.
Posso definir as opções de ajuste do ELK para o site inteiro em vez de no front matter de cada diagrama?
Sim. elk é uma propriedade de nível superior no schema de configuração do Mermaid, então você pode passá-la para mermaid.initialize() junto com layout, por exemplo, layout: 'elk' com um objeto elk contendo mergeEdges: true e nodePlacementStrategy: 'NETWORK_SIMPLEX'. Uma diretiva %%{init}%% aceita o mesmo objeto elk para um único diagrama. O front matter de um diagrama individual continua sobrescrevendo os valores definidos para o site inteiro.
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.
Star on GitHub12k