The Codest
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Indústrias
    • Fintech e Banca
    • E-commerce
    • Adtech
    • Tecnologia da saúde
    • Fabrico
    • Logística
    • Automóvel
    • IOT
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
Seta para trás VOLTAR
2020-10-30
Desenvolvimento de software

Melhoria da aplicação Vue.js. Algumas dicas práticas

The Codest

Dominik Grzedzielski

Sénior Software Engineer

Vue é uma estrutura progressiva em rápido crescimento para a construção de interfaces de utilizador. Tornou-se a estrutura JavaScript com mais estrelas no GitHub e o projeto com mais estrelas de 2016 e 2017 no mesmo portal.

Criar aplicações em Vue é realmente simples, mas se quiser criar aplicações de boa qualidade, terá de enfrentar um desafio um pouco maior.

Fazer parte de The Codest equipa e verdadeiro defensor de Tecnologia VueQuero partilhar algumas dicas (não copiado dos documentos oficiais do Vue) que melhorará sem esforço código qualidade e a desempenho das aplicações Vue.

Em primeiro lugar, aplique o Guia de Estilo Vue e o ESLint

Não quero repetir o que já foi dito. Existe um guia de estilo na documentação do Vue:
Vue 2 docs - guia de estilo ou
Vue 3 docs - guia de estilo

Encontrará aqui quatro categorias de regras. Três delas são importantes para nós:

  • Essencial regras que impedem nós de erros,
  • Recomendado e fortemente recomendado regras para manter as melhores práticas - para melhorar a qualidade e legibilidade do código.

Pode pensar... "O quê?! Tenho de me lembrar de todas as regras?" Claro que não. Pode usar o ESLint para tratar dessas regras por si. Só tem de definir tudo corretamente no ficheiro de configuração do ESLint. Sugiro que utilize o recomendado predefinido pois obtém um conjunto de regras totalmente gratuito que o ajuda a criar aplicações com boas práticas. Como configurá-lo?

Por defeito, deve encontrar estende-se na configuração do ESLint e substituir "plugin:vue/essential" com "plugin:vue/recommended"e mais nada.

Claro que há algumas regras que deve recordar, porque o ESLint não pode tratar de tudo sozinho. Por exemplo:

  • nomeação coerente,
  • nomeação de eventos em kebab-case,
  • prefixação $_namespace_ propriedades privadas em plugins, mixins, etc,
  • ordem do elemento de nível superior do componente de ficheiro único.

Não utilize múltiplos v-if

Por vezes, pode ser necessário apresentar condicionalmente mais do que um elemento, mas as pessoas escrevem frequentemente algo desse género:

conteúdo

conteúdo

conteúdo

É desnecessário porque podemos escrevê-lo de forma mais elegante:

<code> <template v-if="condition">
   <div>conteúdo</div>
   <div>conteúdo</div>
   <div>conteúdo</div>
 </template>

Mas e se o quisermos fazer como um elemento de raiz? Em Vue, não podemos utilizar para este efeito. Nalguns casos, pode ser suficiente embrulhá-lo em div.

Tudo bem, mas, por mais que queiramos, às vezes não podemos envolver elementos em div, por exemplo, por causa da semântica html (por exemplo

  • tem de ser um filho direto de
      ou
        ). Por isso, quando temos de escrever:

         
      1. (( item.name ))
      2. ...e veremos um erro como este :

        Vue código js

        Podemos lidar com isso utilizando JSX e um componente funcionalTambém devemos passar um booleano e ele substituirá o v-if.

        Não escreva manipuladores de chamadas de API em componentes

        Na verdade, este é apenas um dos exemplos do que não se deve fazer nos componentes. Faça apenas o que é necessário localmente na lógica dos componentes. Todos os métodos que possam ser externos devem ser separados e apenas chamados nos componentes, por exemplo, na lógica empresarial.

        Exemplo:

        Em vez de um método como este:

        created() (
        this.fetchArticles();
        ),
        métodos: (
         async fetchArticles() (
          try (
            const data = await axios.get(url);
            this.articles = data.articles;
            ) catch (e) (
            // tratar erro
            )
          )
        )

        Escreva algo deste género - basta chamar o método adequado que devolverá os resultados da API:

         async fetchArticles() (
           try (
             this.articles = await ArticlesService.fetchAll();
           ) catch (e) (
             // tratar erro
           )
          )

        Utilizar ranhuras em vez de grandes quantidades de adereços

        Às vezes, usar props é suficiente, mas também há casos em que elas não são eficientes. Isso pode acontecer em situações em que teríamos de adicionar demasiadas props para fazer o componente funcionar como queremos. O exemplo mais simples poderia ser um componente de botão. Sem dúvida, é um componente que pode ser utilizado em qualquer parte de uma aplicação. Então, vamos considerar um componente de botão como este.

        
        (( texto ))
        

        Nesta fase, trata-se de um componente simples que aceita apenas objectos de texto. Está bem, mas pode não ser suficiente porque vamos precisar de ícones no botão. Neste caso, temos de adicionar mais 2 props (2, porque queremos ter a opção de adicionar antes ou depois do texto). Assim, o componente terá o seguinte aspeto:

        
        (( texto ))
        

        Não é mau, só temos 3 adereços, mas...

        E se precisarmos de um indicador de carga? Bem, teríamos de acrescentar outra prop. E isto para cada nova funcionalidade! Acompanhar o crescimento do número de componentes parece-lhe agora um desafio? Sim, parece, sem dúvida!

        Em vez disso, utilizemos as ranhuras.

        Mais simples, certo? Ok, mas como é que podemos obter a funcionalidade de adicionar ícone? É muito fácil! Basta utilizar o componente desta forma:

        Voltar
        
        Seguinte

        Maneira fácil de melhorar o desempenho

        Vou partilhar consigo algumas dicas que são realmente fáceis de implementar, para que possa beneficiar imediatamente.

        Rotas de carregamento lento

        Por vezes, as rotas estão disponíveis apenas para administradores ou utilizadores com acesso específico, podendo também ser menos visitadas do que outras. Estes são casos perfeitos para utilizar a rota de carregamento lento.

        Basta utilizar a função de seta na propriedade do seu componente para devolver a função de importação:

         export default new VueRouter (
           (
             modo: 'histórico',
             routes: [
               (
                 caminho: '/landing',
                 componente: () => import('../pages/p-welcome'),
                 nome: 'welcome'
               ),
          ...

        Em vez de:

        importar PWelcome de '@/pages/p-welcome';
        
        export default new VueRouter (
        (
        mode: 'history',
        routes: [
        (
        caminho: '/landing',
        component: PWelcome, //apenas importou o componente
        nome: 'welcome'
        ),

        Componentes do Vue com carregamento lento

        Uma situação semelhante pode ocorrer com Componentes do Vue. Podemos importar preguiçosamente componentes de um único ficheiro como este:

        const lazyComponent = () => import('pathToComponent.vue')
        exportar por defeito (
        components: (lazyComponent )
        )
        
        // Outra sintaxe
        export default (
        componentes: (
        lazyComponent: () => import('pathToComponent.vue')
        )
        )

        Graças ao lazy load desse componente, ele será descarregado apenas quando solicitado. Por exemplo, se tivermos um componente com v-if, ele só será solicitado se o componente for renderizado. Portanto, a menos que o valor v-if seja verdadeiro, o componente não será carregado. É por isso que a importação preguiçosa também pode ser usada para JavaScript ficheiros.

        Bónus: Ao usar o Vue CLI 3+, todos os recursos carregados preguiçosamente são pré-processados por padrão!

        desenvolvimento vue js

        Utilizar invólucros transparentes em vez de adereços de atributos

        Considere um componente como este:

         
           
         

        Sem qualquer problema, podemos utilizá-lo assim:

        ou


        Funciona, porque Vue permite-lhe passar atributos html para o componente, mesmo que não os tenha declarado como props. Os atributos html são aplicados ao elemento raiz do componente (input, neste caso).

        O problema surge quando queremos expandir o nosso componente de entrada, uma vez que este pode ter o seguinte aspeto:

        <code> <template>
           <div class="form-group">
             <label :for="id">(( rótulo ))</label>
             <input
               :id="id"
               :value="value"
               class="base-input"
               @input="$emit('input', $event.target.value)"
             >
           </div>
         </template>

        Agora, utilizando o componente desta forma:

         

        não vai funcionar como queremos, porque o tipo e o placeholder serão aplicados ao div (elemento raiz) e isso não faz sentido. Por isso, temos de lidar com isso, porque queremos adicionar os nossos atributos ao elemento input. O teu primeiro pensamento pode ser "vamos adicionar as props de que precisamos!" e claro que isso vai funcionar, mas... e se quisermos usar tipo, autocompletar, marcador de posição, focagem automática, desativado, modo de entrada, etc., então temos de definir as props para cada atributo html. Pessoalmente, não gosto deste método moroso, por isso vamos procurar algo melhor!

        Podemos tratar de todo o problema em apenas duas linhas.

        <template>
          <div class="form-group">
            <label :for="id">(( rótulo ))</label>
            <!-- pay attention to v-bind="$attrs" -->
            <input
              :id="id"
              v-bind="$attrs"
              :value="value"
              class="base-input"
              @input="$emit('input', $event.target.value)"
            >
          </div>
        </template>
        
        <script>
        export default (
          name: 'BaseInput',
          inheritAttrs: false, // <- pay attention to this line
          props: ['value', 'label', 'id']
        );
        </script>

        Podemos utilizar v-bind="$attrs" e passar atributos diretamente para sem declarar grandes quantidades de props. Além disso, lembre-se de adicionar a opção inheritAttrs: false para desativar a passagem dos atributos para o elemento raiz. Vamos um pouco mais longe: e se precisarmos de adicionar ouvintes de eventos a este input? Novamente, isso poderia ser tratado por props ou eventos personalizados, mas há uma solução melhor.

        <template>
          <div class="form-group">
            <label :for="id">(( rótulo ))</label>
            <!-- pay attention to v-on="listeners" -->
            <input
              :id="id"
              v-bind="$attrs"
              :value="value"
              class="base-input"
              v-on="listeners"
            >
        </div>
        </template>
        
        <script>
        export default (
          name: 'BaseInput',
          inheritAttrs: false,
          props: ['value', 'label', 'id'],
          computed: (
            listeners() (
              return (
                ...this.$listeners,
                input: event => this.$emit('input', event.target.value)
              );
            )
          )
        );
        </script>

        Existe uma nova propriedade computada que devolve o componente para os ouvintes e adiciona o ouvinte de entrada. Utilizamos esse input computado escrevendo simplesmente v-on="ouvintes".

        Utilizar o watcher com a opção immediate em vez do hook criado e do watcher em conjunto

        É frequente irmos buscar alguns dados a um hook criado (ou montado), mas depois precisamos de ir buscar esses dados a cada alteração de uma propriedade, por exemplo, a página atual da paginação. Alguns tendem a escrevê-lo assim:

        É claro que funciona, mas... Não é a melhor abordagem, nem mesmo uma boa abordagem. Então, vamos ver como podemos refatorar isso, um exemplo de uma abordagem não tão ruim:

        A versão acima é melhor porque não é necessário outro método, apenas nomeámos um método que deve ser chamado para alterar watchedProperty.

        Uma abordagem ainda melhor:

        Livrámo-nos do gancho created. Ao adicionar a opção 'immediate', fazemos com que esse componente chame o método fetchData imediatamente após o início da observação (um pouco antes do gancho created e depois de beforeCreated), para que possa ser usado em vez do gancho created.

        Resumo das sugestões Vue.js

        Estas dicas não farão com que a sua candidatura seja perfeita, mas a sua utilização fará com que rapidamente melhorar a qualidade do seu código. Além disso, espero que encontrem algo de interessante nos exemplos acima referidos.

        Note-se que alguns deles foram simplificados para efeitos do artigo.

        Ler mais:

        JavaScript está completamente morto. Um gajo qualquer na Internet

        Um olhar mais profundo sobre os ganchos React mais populares

        Projectos de software onde se pode utilizar o JavaScript

  • Artigos relacionados

    Ilustração de uma aplicação de cuidados de saúde para smartphone com um ícone de coração e um gráfico de saúde em ascensão, com o logótipo The Codest, representando soluções digitais de saúde e HealthTech.
    Desenvolvimento de software

    Softwares para o setor de saúde: Tipos, casos de uso

    As ferramentas em que as organizações de cuidados de saúde confiam atualmente não se assemelham em nada às fichas de papel de há décadas atrás. O software de cuidados de saúde apoia agora os sistemas de saúde, os cuidados aos doentes e a prestação de cuidados de saúde modernos em...

    OCODEST
    Ilustração abstrata de um gráfico de barras em declínio com uma seta ascendente e uma moeda de ouro que simboliza a eficiência ou a poupança de custos. O logótipo The Codest aparece no canto superior esquerdo com o slogan "In Code We Trust" sobre um fundo cinzento claro
    Desenvolvimento de software

    Como dimensionar a sua equipa de desenvolvimento sem perder a qualidade do produto

    Aumentar a sua equipa de desenvolvimento? Saiba como crescer sem sacrificar a qualidade do produto. Este guia cobre sinais de que é hora de escalar, estrutura da equipe, contratação, liderança e ferramentas - além de como o The Codest pode...

    OCODEST
    Desenvolvimento de software

    Construir aplicações Web preparadas para o futuro: ideias da equipa de especialistas do The Codest

    Descubra como o The Codest se destaca na criação de aplicações web escaláveis e interactivas com tecnologias de ponta, proporcionando experiências de utilizador perfeitas em todas as plataformas. Saiba como a nossa experiência impulsiona a transformação digital e o negócio...

    OCODEST
    Desenvolvimento de software

    As 10 principais empresas de desenvolvimento de software sediadas na Letónia

    Saiba mais sobre as principais empresas de desenvolvimento de software da Letónia e as suas soluções inovadoras no nosso último artigo. Descubra como estes líderes tecnológicos podem ajudar a elevar o seu negócio.

    thecodest
    Soluções para empresas e escalas

    Fundamentos do desenvolvimento de software Java: Um Guia para Terceirizar com Sucesso

    Explore este guia essencial sobre o desenvolvimento de software Java outsourcing com sucesso para aumentar a eficiência, aceder a conhecimentos especializados e impulsionar o sucesso do projeto com The Codest.

    thecodest

    Subscreva a nossa base de conhecimentos e mantenha-se atualizado sobre os conhecimentos do sector das TI.

      Sobre nós

      The Codest - Empresa internacional de desenvolvimento de software com centros tecnológicos na Polónia.

      Reino Unido - Sede

      • Office 303B, 182-184 High Street North E6 2JA
        Londres, Inglaterra

      Polónia - Pólos tecnológicos locais

      • Parque de escritórios Fabryczna, Aleja
        Pokoju 18, 31-564 Cracóvia
      • Embaixada do Cérebro, Konstruktorska
        11, 02-673 Varsóvia, Polónia

        The Codest

      • Início
      • Sobre nós
      • Serviços
      • Case Studies
      • Saber como
      • Carreiras
      • Dicionário

        Serviços

      • Aconselhamento
      • Desenvolvimento de software
      • Desenvolvimento backend
      • Desenvolvimento de front-end
      • Staff Augmentation
      • Programadores de back-end
      • Engenheiros de nuvem
      • Engenheiros de dados
      • Outros
      • Engenheiros de GQ

        Recursos

      • Factos e mitos sobre a cooperação com um parceiro externo de desenvolvimento de software
      • Dos EUA para a Europa: Porque é que as empresas americanas decidem mudar-se para a Europa?
      • Comparação dos centros de desenvolvimento da Tech Offshore: Tech Offshore Europa (Polónia), ASEAN (Filipinas), Eurásia (Turquia)
      • Quais são os principais desafios dos CTOs e dos CIOs?
      • The Codest
      • The Codest
      • The Codest
      • Privacy policy
      • Website terms of use

      Direitos de autor © 2026 por The Codest. Todos os direitos reservados.

      pt_PTPortuguese
      en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese es_ESSpanish nl_NLDutch etEstonian elGreek cs_CZCzech pt_PTPortuguese