Web Workers FTW!

Como todos sabemos, paralelismo sempre foi um problema quando estamos falando de JavaScript. Porém, com a Web Workers API a situação muda. Vamos conhecer essa oitava maravilha do mundo!

Imagine a seguinte situação: uma página onde você carrega um plugin de slideshow, autenticação com Facebook e load de dados através de JavaScript, entre outra carralhada de arquivos. Comum, certo? Agora me diga, quantas vezes você teve problema com botões que não respondiam aos seus eventos? Nenhum? Ok. Quantas vezes essa aplicação gerou um crash no navegador?

Se você já enfrentou os problemas que citei acima, keep calm, você não está 100% errado. Cada vez mais, nós desenvolvedores, estamos fazendo aplicações que exigem trabalho pesado usando JavaScript. Pensando nisso, eis que surge a oitava maravilha do mundo, Web Workers API, que usa mais de um processo para executar tarefas JavaScript paralelamente.

O que é paralelismo

Vamos à uma rápida explicação. Caso você já esteja ligado no assunto, pule para o próximo tópico.

Paralelismo, ou melhor, Programação Paralela, é a forma com que conseguimos fazer um algoritmo executar diversas tarefas usando mais de um processo, thread, ou no nosso caso, workers! Tudo isso com o intuito de ganhar mais performance. Não entendeu? Beleza. Uma imagem fala mais do que mil palavras:

Web Workers, como funciona

Se interessou por Programação Paralela? Ainda não entendeu? Aí vai uma boa referência: https://computing.llnl.gov/tutorials/parallel_comp/.

Como funciona

Atualmente é possível executar eventos de forma assíncrona usando setTimeout(), setInterval(), XMLHttpRequest entre outros hacks (ok, chutem-me). Porém, isso não quer dizer que é paralelo, sendo que os eventos são executados quando o script é renderizado.

Web Workers trabalham de forma diferente. E melhor. Como JavaScript não é uma linguagem que usa multi-threads, os Workers de certa forma “estendem-a” em alguns casos, possibilitando executar tarefas com mais uma thread. A API define que processos serão executados de forma assíncrona em outro contexto, por scripts que se comunicam através de mensagens que são passadas pelo método postMessage().

Mãos à obra

Para não sair da tradição (risos), vamos à um “Hello World”.

Como Web Workers executam paralelamente de forma isolada ao processo principal, vamos criar um novo arquivo que receberá a “ordem” desse processo e executará sua função. No nosso exemplo, chamei de worker.js e possui a função abaixo:

// recebe a mensagem do processo principal
onmessage = function(event) {
  var message = event.data;
  var result = message + ' no And After!';
  postMessage(result);
}

Feito isso, vamos criá-lo no processo principal:

var myWorker = new Worker('worker.js');

Para passar nossa informação, precisamos do método postMessage():

var message = 'Web Workers';
myWorker.postMessage(message);

E para finalizar, precisamos receber a mensagem do Worker:

// Recebe a mensagem do worker
myWorker.onmessage = function(event) {
  alert(event.data);
};

Se não quiser fazer na mão, é só baixar o exemplo aqui. Ou, você pode ver uns exemplos nesse link.

PS: isso não vai rodar localmente por restrições dos browsers modernos. Então, para aproveitar a trégua, aproveito para explicar que, como workers são arquivos externos, não será possível carregá-lo através de scripts que começaram com http:. Para ver esse exemplo funcionando, clique aqui.

Leia mais sobre segurança em http://www.html5rocks.com/en/tutorials/workers/basics/#toc-security

Talvez você esteja pensando “porr*, pra quê tanta enrolação para escrever uma mensagem na tela?”. Calma lá. Web Workers servem para auxiliar em tarefas porradas, como renderização 3D, cálculos que exigem mais desempenho, etc.

Importante: caso você não tenha percebido, o nosso exemplo não acessa o DOM diretamente. Web Workers não tem acesso ao DOM!

Além do DOM, Web Workers não tem acesso aos objetos window, document e parent. Mas calma, apesar disso, Web Workers tem acesso aos seguintes recursos do JavaScript:

  • navigator com quatro propriedades: appName, appVersion, userAgent e platform.
  • location (somente leitura)
  • self, que aponta para o objeto worker global
  • importScripts() para fazer load de um JavaScript externo
  • todos os objetos do JavaScript, como Object, Array, Math, etc
  • XMLHttpRequest
  • setTimeout()/clearTimeout() e setInterval()/clearInterval()
  • há também um método close() usado parar um Worker

Conclusão

Web Workers é algo novo, logo, a API pode mudar a qualquer hora, e pra melhor. Acredito que eles irão além do browser. Isso é só o começo, e já é demais!

Referências:

App nativa ou web app?

Uma das primeiras decisões que um time tem que passar no desenvolvimento de aplicativos mobile é se irão desenvolver um aplicativo nativo ou se irão desenvolver um aplicativo web para manter apenas uma versão para diversos dispositivos.

É uma decisão que pode ser bem complexa e a resposta mais correta depende muito das necessidades do seu aplicativo, do seu público e do time disponível. A apresentação abaixo mostra alguns pontos interessantes que podem influenciar na decisão.

[slideshare id=16148972&doc=appceleratorhtml5prezfinal-130123232125-phpapp02]

E como sempre, vale lembrar que não existe “bala de prata”.

Palestra sobre responsive design

Este ano graças a indicação do Daniel Filho (uma das personalidades mais influentes no mercado de front-end nacional que odeia este título que o acompanha) tive a oportunidade de palestrar no Campus Party (e tinha esquecido de compartilhar isso no blog!).

Falei um pouco sobre responsive design sem mimimi, se vocês conseguirem me acompanhar correndo pelo palco perceberão que tentei abordar alguns temas que considero importante no assunto:

  • Vantagens e desvantagens do responsive design
  • Qual o impacto do responsive design para os usuários?
  • Qual o objetivo do responsive design?
  • Qual o custo do responsive design
  • Qual a melhor forma de pensar em design responsivo?

Vídeo da palestra sobre responsive design

Aqui tem o vídeo e mais abaixo os slides da apresentação.

[http://www.youtube.com/watch?v=piXlBkzrSeM]

Correções:

  • em 5:20 falei em aplicar folha de estilos para dispositivos e isso é tudo que o design responsivo não é, eu queria dizer resoluções   

Encontrou mais alguma canelada? Comenta aí para eu atualizar o post.

Slide sobre responsive design

[slideshare id=16342889&doc=responsivedesign-130204092612-phpapp01]

Gostou? Compartilhe!

jQuery.when() – executar função depois de vários carregamentos ajax

Estou desenvolvendo um projeto para um cliente da GS Solutions onde um template será montado dinâmicamente no front-end através do consumo de vários JSONS.

Em um caso específico eu preciso gerar uma lista (array) de jogos, que estão divididos em 3 arquivos JSON diferentes e uma rotina deve ser executada depois desta lista populada. 

Como fazer isso de forma assíncrona após o carregamento dos 3 arquivos por ajax?

jQuery.when()

A função when do jquery permite que você execute um callback após uma série de ações terem sidos realizadas, como o carregamento assíncrono de quantas URLs você precisar.

Exemplo

Quero carregar jogos-1.json e jogos-2.json, percorrer os elementos de cada uma delas e adicionar em um array. Feito isso, quero percorrer este array e imprimir os resultados.

var jogos = [];
$.when(
	$.getJSON('jogos-1.json'),
	$.getJSON('jogos-2.json')
).done(function(jogos1,jogos2){
	/* Será executado somente após as 2 requisições ajax serem carregadas
	Aqui você poderia manipular os dados (jogos1 e jogos2),
	fazer merge dos objetos, ordenar, etc. */
	for (var jogo in jogos1){ jogos.push(jogo) }
	for (var jogo in jogos2){ jogos.push(jogo) }
});

Um exemplo bem simples mas que exemplifica uma forma eficiente de fazer o carregamento assíncrono mesmo quando nós precisamos de todos os request completos antes de executar o callback.

Você pode adicionar quantos eventos forem necessários como parâmetros na função when e deve adicionar o mesmo número de parâmetros na função dentro do done, cada parâmetro representa um resultado do when.

Tem mais dicas? Escreva nos comentários!

Frontinsampa 2013

Já está sabendo do Frontinsampa 2013? Estamos apoiando o evento este ano, que vai ser imperdível por diversos motivos, entre eles quero destacar dois:

Lea Verou

Isso mesmo! A Lea (ou se você prefer formalidade, Michaelia Komvouti-Verou) trabalha no W3C e vai dar o ar da graça, palestra internacional no evento! Dando uma olhada nos projetos dela dá para ter idéia de que a palestra será sensacional.

Inferno

Se você tem alguma dúvida de que o Frontinsampa poderia ser “só mais um evento de front-end”, esta dúvida acaba agora: o evento vai acontecer no Inferno, uma casa noturna que fica na Rua Augusta, aqui em São Paulo. A casa será adaptada para o dia do evento e contará com toda a infraestrutura que o evento exige!

FrontinSampa

Quando: 14 de Setembro
Onde: Inferno (Rua Augusta), São Paulo SP
Quanto: R$200,00 (R$175,00 se você usar nosso cupom de desconto!)


Cupom de desconto

Como alguns de vocês sabem, eu sou sócio do Eu Compraria! e nós estamos apoiando o evento, estaremos lá com vários produtos!

De quebra a organização liberou um cupom de desconto (no valor de R$25,00), faça agora sua inscrição utilizando o cupom: EUCOMPRARIA-25 


Vamos lá aprender e discutir front-end e tomar uma cerveja depois? 😀