Otimização é o foco para conquistar o usuário
Como já sabemos, otimização é um assunto recorrente, mas necessário. A otimização está diretamente ligada à experiência que o usuário tem da sua aplicação. Por isso, nada melhor do que dar uma atenção extra a esse tópico.
Quando estudamos o básico de JavaScript, aprendemos que ele pode proporcionar uma experiência bastante dinâmica para nossas aplicações, assim como também aprendemos que ele é interpretado pelo navegador dos usuários que acessam as nossas aplicações. Sendo assim, é importante pensar em otimização desde o começo do desenvolvimento dos nossos projetos, evitando que nosso código não traga ineficiências e se torne uma catástrofe futuramente.
A seguir, apresentarei uma série de boas práticas que podem trazer uma melhor performance para as nossas aplicações:
Inicializar variáveis de instância
Adicione a instância das variáveis de declaração/inicialização/instância no próprio protótipo para as variáveis dos seguintes tipos de dados: valores do tipo numérico, booleanos, nulos, indefinidos ou strings. Fazendo isso, estamos evitando a execução do código de inicialização desnecessário toda vez que o construtor for chamado.
Vale lembrar que isto não poderá ser feito para variáveis de instância do qual o valor inicial é dependente de argumentos para o construtor.
Exemplo, no lugar dessa versão:
brazilJS.Conf = function() { this.participantes = 1600; this.maiorConferenciaJavaScriptMundo = true; this.agenda = []; this.slogan = 'A BrazilJS Conf é a maior conferência JavaScript do mundo.'; };
Poderíamos ter uma versão melhorada, como esta:
brazilJS.Conf = function() { this.agenda = []; }; brazilJS.Conf.prototype.participantes = 1600; brazilJS.Conf.prototype.maiorConferenciaJavaScriptMundo = true; brazilJS.Conf.prototype.slogan = 'A BrazilJS Conf é a maior conferência JavaScript do mundo.';
Definindo métodos de classes
O código a seguir é ineficiente, pois toda vez que instanciamos brazilJS.Conf
, uma nova function
e uma closure
serão criadas:
brazilJS.Conf = function() { // corpo do nosso constructor this.slogan = function() { // corpo do método console.log('A BrazilJS Conf é a maior conferência JavaScript do mundo.'); }; }
Com essa nova abordagem, não importa quantas vezes instanciamos brazilJS.Conf
, apenas uma única function
será criada para slogan
e nenhuma closure
será criada, vejamos:
brazilJS.Conf = function() { // corpo do nosso constructor }; brazilJS.Conf.prototype.slogan = function() { // corpo do método console.log('A BrazilJS Conf é a maior conferência JavaScript do mundo.'); };
Cuidado com as armadilhas das closures
Por mais poderosas e úteis que as closures
sejam, elas podem nos trazer algumas desvantagens como podemos verificar abaixo.
A criação de uma closure
é significativamente mais lenta que a criação de uma function
sem uma closure
e é muito mais lenta do que a reutilização de uma função estática. Por exemplo:
function exemploAlertaTimeOut() { let mensagem = 'braziljs.org'; window.setTimeout(function() { alert(mensagem); }, 100); }
É mais lento que:
function exemploAlertaTimeOut() { window.setTimeout(function() { let mensagem = 'braziljs.org'; alert(mensagem); }, 100); }
Que ainda é mais lento do que:
function alertaMensagem() { let mensagem = 'braziljs.org'; alert(mensagem); } // function exemploAlertaTimeOut() { window.setTimeout(alertaMensagem, 100); }
Isso acontece pois as closures
acrescentam um nível para a cadeia de escopo que será verificada pelo navegador. Vejamos mais um exemplo:
var nome = 'braziljs.org'; function funcaoComClosure() { var slogan = 'A BrazilJS Conf é a maior conferência JavaScript do mundo.'; return function () { var participantes = 1600; nome; slogan; participantes; }; } var teste = funcaoComClosure(); teste();
Assim que a função teste()
for invocada, a referência à variável nome
será mais lenta do que referenciar à variável slogan
, que ainda será mais lenta que a referência à variável participantes
. Conclusão Essa foi uma breve introdução sobre alguns tópicos importantes relativos à otimização. Se você ficou curioso e quer aprender mais, dê uma atenção para os seguintes tópicos: Otimização de imagens Minificação de JS e CSS Redução de latência com o uso de uma CDN Cache Web Font Performance HTTP/2