Plugin de Editor YAML para Vue 3 com CodeMirror

No desenvolvimento de aplicações web, frequentemente surge a necessidade de editar arquivos de configuração YAML diretamente no frontend. Este artigo aborda como implementar um editor YAML integrado ao Vue 3 utilizando a biblioteca CodeMirror, com suporte a verifciação de sintaxe, realce de sintaxe e integração com um backend para carregar e salvar conteúdo.

O cenário típico envolve a obtenção do conteúdo YAML padrão de uma API backend, exibindo-o no editor CodeMirror. Após as modificações realizadas pelo usuário, o conteúdo atualizado é enviado de volta ao backend, que o grava em um arquivo de configuração no servidor. A solução utiliza referências reativas do Vue para manipular o valor do editor, garantindo vinculação bidirecional de dados.

No template Vue, o componente CodeMirror é vinculado a uma propriedade reativa usando v-model. Abaixo, um exemplo simplificado:

<template>
  <codemirror
    v-model="yamlContent"
    placeholder="Edite seu arquivo YAML aqui"
    :style="{ height: '400px', textAlign: 'left' }"
    :autofocus="true"
    :indent-with-tab="true"
    :tab-size="2"
    :extensions="editorExtensions"
    @ready="onEditorReady"
    @change="handleChange"
  />
</template>

No script TypeScript, defina uma referência reativa para armazenar o conteúdo YAML. Utilize Axios para buscar os dados iniciais da API backend durante a montagem do componente. A estrutura do código é ajustada para melhor clareza:

<script lang="ts">
import { defineComponent, ref, shallowRef, onMounted } from 'vue';
import { Codemirror } from 'vue-codemirror';
import { javascript } from '@codemirror/lang-javascript';
import { oneDark } from '@codemirror/theme-one-dark';
import axios from 'axios';

export default defineComponent({
  name: 'YamlEditor',
  components: { Codemirror },
  setup() {
    const yamlContent = ref('');
    const editorExtensions = [javascript(), oneDark];
    const editorView = shallowRef();

    const onEditorReady = (payload: any) => {
      editorView.value = payload.view;
    };

    const handleChange = (event: any) => {
      console.log('Conteúdo alterado:', event);
    };

    onMounted(async () => {
      try {
        const response = await axios.get('/api/yaml-config');
        yamlContent.value = response.data;
      } catch (error) {
        console.error('Erro ao carregar configuração YAML:', error);
      }
    });

    const retrieveEditorState = () => {
      if (!editorView.value) return null;
      const state = editorView.value.state;
      return {
        selectedText: state.selection.ranges.reduce((acc: number, range: any) => acc + (range.to - range.from), 0),
        cursorPosition: state.selection.ranges[0].anchor,
        contentLength: state.doc.length,
        lineCount: state.doc.lines,
      };
    };

    return {
      yamlContent,
      editorExtensions,
      onEditorReady,
      handleChange,
      retrieveEditorState,
    };
  },
});
</script>

Para obter ou atualizar o valor do editor programaticamente, a referência reativa yamlContent pode ser usada diretamente. Se houver necessidade de acessar estados mais detalhados do editor, a função retrieveEditorState fornece informações como seleção, posição do curser e métricas do documento. A integração com o backend é feita por meio de requisições HTTP, permitindo persistir as alterações na configuração do servidor.

Tags: vue3 CodeMirror YAML TypeScript Axios

Publicado em 7-7 02:54