O objetivo deste post é lhe mostrar 9 técnicas para atingir alta performance em suas páginas visualforce, são de forma geral simples, mas que se orquestradas corretamente podem lhe trazer resultados incríveis.
1. Design da sua Página Visualforce
É muito importante seguir sempre um designer o mais clean possível, já vi várias vezes páginas que tinham a responsabilidade de exibir e editar o mesmo conteúdo, e tudo criado ao meio de uma bagunça de flags para ocultar ou exibir um conjunto de painéis apex, se já não bastasse ter uma página extremamente longa e confusa, ainda tinha que lidar com uma ViewState enorme para manter o controle de tudo isso, separar essa tela em 2 páginas com 2 controllers fez o tempo de carregamento cair em mais da metade do tempo.
Então a dica aqui é, sempre desenhe a tela para um propósito específico, e certifique-se de tentar mantê-lo assim, caso precise de mais funcionalidades, veja se ela realmente precisa estar na mesma página e controller.
2. Optimize a sua Controller
Se você quer evitar dores de cabeças num futuro próximo, sugiro NUNCA reutilizar uma controller para duas visualforce diferente, do meu ponto de vista, esse é um erro de arquitetura enorme, e uma economia sem sentido, o melhor ganho de velocidade aqui sem dúvida será a manutenção num futuro, mas até mesmo para o seu código e carregamento da página deve haver um ganho, pois muitas vezes, se você misturar as responsabilidades de uma controller, muito provavelmente ela estará carregando e executando funções que podem não ser necessárias para aquela página naquele momento, logo, temos um tempo de processamento perdido que não será utilizado para nada.
3. Carregue somente os dados necessários
As páginas visualforce não podem exceder 15 MB de tamanho de resposta, mas até mesmo uma simples página pode lhe trazer problemas de carregamento de dados se não contar com alguns critérios de filtros corretos, então tente ao máximo observar os seguintes item:
- Filtros, sempre use filtros para limitar os dados consultados em uma SOQL, por exemplo filtrar dados por um período de tempo, remover dados nulos, etc, se a sua consulta não contém uma cláusula WHERE, suspeite, pois algo pode estar muito errado.
- Keywords, Criar uma controller usando “with sharing” evita que dados sejam carregados de forma indevida, dessa forma você garante que os dados exibidos serão sempre os dados cujo o usuário tem permissão de acesso.
- Paginação, sempre que possível faça a paginação dos dados a serem exibidos, evitando assim carregar dados que podem nunca ser visualizados pelo usuário final.
4. Lazy Loading
Essa técnica consiste em carregar apenas o que for essencial num primeiro momento, e ir carregando o restante do conteúdo conforme solicitado ou necessário, algumas formas de fazer isso são:
- Use o atributo rerender dos componentes visualforce para atualizar componentes sem recarregar a tela inteira.
- Use chamadas remotas JavaScript para chamar a sua controller e obter um novo conjunto de dados para a sua página.
- Crie componentes customizados para mostrar e ocultar dados de acordo com as ações do usuário.
5. Usar tarefas Assíncronas
Se o objetivo da sua página for realizar um processamento longo, considere executar isso de modo assíncrono, devolver o controle da tela para o usuário e avisá-lo por email quando o processamento já estiver terminado e pronto para que ele possa consultar. Apesar de aplicado apenas para casos específicos, mais cedo ou mais tarde você vai precisar fazer um processamento longo de dados, e quando isso acontecer, não deixe de abusar do poder do processamento assíncrono
6. Usando Configurações Personalizadas
Tente usar configurações personalizadas sempre que possível, pois as configurações personalizadas fazem parte do Cache de um aplicativo e não requerem uma consulta de banco de dados para recuperação. As configurações personalizadas são bem semelhante a um Objeto do Salesforce, porém com a grande diferença deles poderem ser acessados, sem a necessidade de consultas ao banco de dados, o que gera um tempo de acesso ao dado muito mais rápido.
7. Use SOQL de forma eficiente
Uma das coisas que mais podem onerar a performance de uma página, sem dúvida é o acesso a dados, dessa forma, tente considerar sempre o seguinte ao implementar suas páginas visualforce:
- Nunca execute DML dentro de um Loop;
- Sempre realize filtros SOQL, seguida de filtros na apex e finalmente filtro de dados na sua visualforce, pode parecer óbvio, mas acredito alguns filtros não são permitidos no SOQL por questões de performance do banco de dados, por exemplo, não é possível fazer um WHERE em um campo de TEXTO LONGO direto na SOQL, para isso você deve realizar esse filtro no seu código apex.
8. Optimize o seu ViewState
O vilão dos vilões, o ViewState sem dúvida pode ser o maior problema que você pode encontrar em performance da sua visualforce, já falei sobre ele no post sobre Ciclo de Vida de uma visualforce.
O que é uma ViewState?
Para manter o estado em uma página do visualforce, a plataforma Force.com inclui o estado dos componentes, valores de campo e estado da controller em um elemento hiddenfield. Esses dados são então criptografados, o estado da página visualforce tem um limite de 135 KB.
Como isso afeta para visualizar o desempenho da página?
Os estados de exibição exigem tempos de processamento mais longos para cada solicitação, incluindo serialização, desserialização, criptografia e descriptografia. Reduzir o tamanho da sua ViewState faz com que suas páginas sejam carregadas com mais rapidez.
Como otimizar sua ViewState?
Se você tem uma variável na sua controller que não precisa ter o seu estado armazenado, então você deve declará-la com a palavra-chave Transient, variáveis transientes não são armazenadas na ViewState.
- Refine sempre suas chamadas SOQL para retornar apenas dados relevantes para a sua página visualforce.
- Utilize filtros e paginação para reduzir os dados que exigem ViewState.
- Use JavaScript Remoting. Ao contrário do componente <apex:actionFunction>, o JavaScript Remoting não requer um componente de formulário. Esta técnica não reduz o ViewState de uma página, mas sua página geralmente funciona melhor sem a necessidade de transmitir, serializar e desserializar às ViewState que ela contém. O tradeoff é a perda do atributo re-render e do código JavaScript adicional para lidar com callbacks.
9. Utilize boas práticas de Web Design
Se o visualforce não estiver causando problemas de desempenho, verifique se suas páginas seguem as melhores práticas gerais para o design da Web, como:
- Minificação de JavaScript e CSS
- Otimização de imagem para a Web
- Evite os iframes, sempre que possível
- Se possível utilize CDN ao invés de colocar os arquivos em Recursos Estáticos.
Apesar de ser um conjunto de técnicas relativamente simples, tenho certeza que se você aplicá-las no seu desenvolvimento de páginas, você terá um aumento de performance considerável nas suas páginas, agora eu te desafio a deixar nos comentários quais técnicas citadas aqui você já utiliza, e se utiliza alguma que eu não citei, qual você usa?
Um forte abraço e até o próximo post :)
Fernando Sousa
Senior Salesforce Developer
Bacharel em Sistemas da Informação pela Universidade de Taubaté (UNITAU) e MBA em Projeto de Aplicações para Dispositivos Móveis pelo IGTI – Instituto de Gestão em Tecnologia da Informação.
Comecei a programar bem cedo, por volta de 10 anos de idade, de maneira auto-didata passei por várias linguagens.
Em 2015 me conectei a plataforma Salesforce pela primeira vez, para fazer una integração entre um Aplicativos Mobile em android e o Salesforce Platform.
Atualmente com as certificações Salesforce Certified Platform Developer I, Salesforce Certified Platform App Builder, Salesforce Certified Platform Developer II, Salesforce Administrator e Sharing and Visibility.
Acompanhe meu Trailhead aqui.