Como criar um app React sem configuração

Para aqueles que ainda não saber, o Facebook lançou uma ferramenta que promete reduzir toda complexidade envolvida em configurar um novo projeto React. O projeto disponibilizado no github e chamado de “Create React App”,, permite que os desenvolvedores criem suas aplicações React com apenas um comando.

Se você estiver bem no inglês, pode ler a postagem feita a um tempinho atras no blog oficial do React através deste link: https://reactjs.org/blog/2016/07/22/create-apps-with-no-configuration.html, caso seu inglês esteja enferrujado ou precisando de um prática, abaixo segue um resumo dos passos envolvidos.

Antes de mais nada, Node.js 4.x ou uma versão mais recente é necessária.

Primeiro, precisamos utilizar o npm para instalar a ferramenta globalmente na nossa máquina usando o comando:

npm install -g create-react-app

O comando acima instalará o Create React App na sua máquina, que permitirá criar um projeto utilizando o comando create-react-app seguido do nome do nosso projeto:

create-react-app hello-world

A estrutura abaixo é a gerada automáticamente na criação dos projetos

node_modules/
src/
.gitignore
README.md
favicon.ico
index.html
package.json

Ao abrir o package.json, iremos notar que há somente uma dependência de desenvolvimento chamada react-scripts e três scripts:

  • start: react-scripts start
  • build: react-scripts build
  • eject: react-scripts eject

O script start iniciará nossa aplicação com base nos componentes que estão no diretório src/.

Na criação, ele irá conter os seguintes arquivos:

App.css
App.js
index.css
index.js
logo.svg

Era isso, você já tem as coisas que precisa para executar seu projeto.

Gostaria de saber mais? Então acesse o git deste projeto, aprenda, pergunte e contribua.

Até mais


Fontes:

https://tableless.com.br/criando-sua-aplicacao-react-em-2-minutos/

https://reactjs.org/blog/2016/07/22/create-apps-with-no-configuration.html

https://github.com/facebook/create-react-app

Jest: Teste Unitário de JavaScript

Usado e recomendado pelo Facebook ao lado de uma variedade de aplicativos React, o Jest é bem suportado. Jest também relata uma biblioteca de testes muito rápida devido ao seu teste paralelo inteligente.

Passo a Passo Simples:

instale Jest usando npm:

npm install --save-dev jest

Ou pelo yarn:

yarn add --dev jest

Comecemos por escrever um teste para uma função hipotética que acrescenta dois números. Primeiro, crie um arquivo sum.js:

function soma(a, b) {
  return a + b;
}
module.exports = soma;

Em seguida, crie um arquivo chamado sum.test.js. Isso conterá o nosso teste real:

const soma= require('./soma);

test('somar 1 + 2 é igual a 3', () => {
  expect(sum(1, 2)).toBe(3);
});

Adicione a seguinte seção ao seu pacote.json:

{
  "scripts": {
    "test": "jest"
  }
}

Finalmente, execute o teste npm e Jest imprimirá esta mensagem:

PASS  ./soma.test.js
✓ somar 1 + 2 é igual a 3 (5ms)

Considerações

  • Enquanto as globais são uma desvantagem, Jest é uma biblioteca rica em recursos que está sendo constantemente desenvolvida. Possui uma série de guias facilmente acessíveis para ajudar e suporta uma variedade de ambientes diferentes, o que é ótimo para ver ao construir qualquer projeto.
  • Para projetos menores você pode não se preocupar muito com isso inicialmente, ter um desempenho aumentado é ótimo para projetos maiores que desejam implantar continuamente o aplicativo ao longo do dia
  • Enquanto os desenvolvedores utilizam principalmente o Jest para testar aplicativos React, o Jest pode se integrar facilmente em outras aplicações, permitindo que você use suas características mais exclusivas em outros lugares
  • O teste de instantâneo é uma ótima ferramenta para garantir que a UI do seu aplicativo não mude inesperadamente entre os lançamentos. Embora mais especificamente projetado e usado no React, ele funciona com outros frameworks se você puder encontrar os plugins corretos
  • Ao contrário de outras bibliotecas na lista, o Jest vem com uma ampla API, não exigindo que você inclua bibliotecas adicionais a menos que você realmente precise
  • Jest continua a melhorar consideravelmente com cada atualização que eles fazem

Nova versão do Reason

Para quem não conhece o Reason (veja o reasonml) não é uma nova linguagem; É uma nova sintaxe e toolchain alimentado pela linguagem OCaml. Ele dá a OCaml uma sintaxe familiar voltada para programadores de JavaScript, e atende aos usuários de fluxo de trabalho NPM / Yarn já conhecidos.

Agora com a versão 3, uma das mudanças mais visíveis na sintaxe do Reason é o uso da sintaxe de aplicação/abstração JavaScript em vez de Ocaml. Isso significa que no Reason 3 você chamaria uma função de dois parâmetros, colocando parênteses em torno deles, como você faz em JavaScript:

myFunction(arg1, arg2) // novo, sintaxe C-like
myFunction arg1 arg2   // antigo, sintaxe OCaml-like

 

Outras mudanças importantes são as seguintes:

  • Nova sintaxe para declarar o tipo de um objeto em Javascript, usando {. }, ex.:
type payload = {.  // Não precisa chamar o no need to call Js.t aqui
    "name": string,
    "age": int
};

 

  • Suporte ampliado para type punning com parâmetros marcados e nova sintaxe usando “~” em vez de “::”. É assim que você declara e chama uma função com o parâmetro marcados:

 

let addCoordinates = (~x, ~y) => {
    /* use x e y aqui */
};
...
addCoordinates(~x=5, ~y=6);

 

Compara a nova implementação com a antiga:

let addCoordinates x::x y::y => {
  /* use x e y aqui */
};
...
addCoordinates x::5 y::6;

 

Além disso, type punning (que, no exemplo acima, permite escrever ~x em vez do mais tedioso ~x como x) pode ser usado junto com tipos de anotações, que não haviam sido suportadas anteriormente:

let add = (~first: int, ~second: int) : int => first + second;

 

  • Concatenação de String agora pode ser feito usando o operador “++” ao invés do “^”.
  • Lógicas de negação agora será pelo operador “!” ao invés do “not”

Os desenvolvedores que possuem uma base de código Reason existente não devem se preocupar com a extensão das mudanças de sintaxe, que foram principalmente impulsionadas pela idéia de torná-lo mais “natural” para desenvolvedores de JavaScript. Na verdade, o Reason 3 vem com um script de migração que promete facilitar a transição.

Outra nova característica promissora do ecossistema Reason é a disponibilidade de uma API oficial para acesso programático ao Parser Reason, refmt, que já possui várias ferramentas como o Klipsereason-tools, a documentação no site do Reason, etc.

fonte:

https://reasonml.github.io/

https://www.infoq.com/br/news/2017/12/facebook-releases-reason-3

https://www.infoq.com/news/2017/11/facebook-releases-reason-3

Gerenciando os plug-ins do Facebook em arquivos JS

[download id=”383″]

Introdução

Nesse artigo rápido, veremos como é possível centralizar o controle das tags do Facebook em um único arquivo JavaScript. O objetivo é facilitar o gerenciamento dos componentes que eles oferecem e remover todas as tags <script> com código embutido.

Para entender este artigo você precisará ter conhecimentos básicos de HTML, JS e da API de plug-ins sociais do Facebook. Apesar dos plug-ins serem um pouco mais complexos do que os iniciantes estão acostumados, a documentação é bem direta e boa parte do código é gerado automaticamente.

Passo 1

A primeira coisa que você precisa fazer é criar um arquivo JS onde colocaremos o código. Você pode nomeá-lo como quiser, mas para esse artigo o chamaremos de “codigoFB.js”. Dentro dele adicione o evento conforme abaixo e já explicaremos o que ele significa.

window.onload = function () {
    (function (d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/pt_BR/sdk.js#xfbml=1&version=v2.10&appId=9999999";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
}

O que fizemos aqui foi o seguinte, estamos dizendo que ao carregar a tela deve ser executada uma função. Por enquanto a única coisa que colocamos dentro desta função é outra função que é a fornecida pelo Facebook (ver códigos da API no link deles) para ser possível utilizar os plug-ins deles.

Importante: Se você simplesmente copiar e colar, não dará certo pois o appID não é valido, será necessário ter o seu appID e/ou copiar o mesmo código fornecido em paginas como https://developers.facebook.com/docs/plugins/like-button.

Passo 2

A segunda coisa que faremos serão os objetos de configuração. Neste artigo, para fins de simplificação, iremos configurar apenas dois plug-ins, o de curtir e o de comentários.

No botão de comentários padrão fornecido no site, você pode ver que ele tem uma classe e 2 atributos.

<div class="fb-comments" 
    data-href="http://www.linkpaginaseusite.com.br" 
    data-numposts="5"></div>

Vamos tranforma-los em um objeto com o seguinte formato

let configFbComments = {
    classes: ["fb-comments"],
    atributos: [{
        nome: "data-href",
        valor: window.location.href
    },
    {
        nome: "data-numposts",
        valor: 5
    }]
};

Como você pode ver, o objeto é composto por duas propriedades, classes e atributos, e elas contem respectivamente um vetor de strings e um vetor de objetos. Note que como o comentário precisa utiliza o link da sua página como referência, para podermos reutilizar o objeto foi colocado o window.location.href que mudará em cada página.

Para o botão de curtir (e compartilhar), faremos um exemplo um pouco mais complexo.

let configFbLike = {
    classes: ["fb-like","FloRight"],
    atributos: [{
        nome: "data-href",
        valor: window.location.href
    },
    {
        nome: "data-layout",
        valor: "button_count"
    },
    {
        nome: "data-action",
        valor: "like"
    },
    {
        nome: "data-size",
        valor: "small"
    },
    {
        nome: "data-show-faces",
        valor: "true"
    },
    {
        nome: "data-share",
        valor: "true"
    }]
};

Aqui temos duas classes, sendo que “fb-like” é obrigatória, e diversos atributos, mas a lógica ainda é a mesma, um objeto com duas propriedades que são vetores. Agora precisamos de uma forma inteligente de processar nossos a plug-ins sem precisarmos nos importar com quais ou quantos dados são fornecidos, o que importa é apenas o formato. Segue abaixo o código para processarmos eles:

function configurarPlugin(elementoHTML, config) {
    elementoHTML.classList.add(config.classes);

    config.atributos.forEach(attr => {
        elementoHTML.setAttribute(attr.nome, attr.valor);
    });
}

O que estamos fazendo aqui? Estamos passando um elemento HTML e o objeto de configuração. Utilizando os métodos do classList, adicionamos todas as classes e após, percorremos o vetor de atributos e os adicionamos um a um ao elemento.

Após isso, basta fazermos a chamada das configurações após termos carregado a função do Facebook que adicionamos la no começo da página. No meu caso, eu fiz uma função (pluginsFacebook) que as adiciona e passa 2 divs que tenho na página, mas seria possível chama-las direto também.

window.onload = function () {
    (function (d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/pt_BR/sdk.js#xfbml=1&version=v2.10&appId=999999";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));

    pluginsFacebook();
}

function pluginsFacebook() {
    configurarPlugin(document.getElementById("btnCurtirFb"), configFbLike);
    configurarPlugin(document.getElementById("frameComentariosFb"), configFbComments);
}

Conclusão

Como podemos ver, é possível separar a lógica de programação fornecida pelos plug-ins sociais do Face sem afetar negativamente a experiência do usuário. Pessoalmente eu prefiro este formato pois permite que a pessoa acessando veja o conteúdo da página antes do processamento deles iniciar, o que causa a impressão de conteúdo carregado mais rápido. Existem outros jeitos de fazermos o código acima, mas acredito que está tenha sido uma das formas mais rápidas e simples de implementar a funcionalidade proposta.