Criando um Web Scraper com NodeJs

O Web Scraping é uma espécie de garimpo da internet. Esse “garimpo” envolve a extração de informações de determinado site. A ideia do Web Scraping é automatizar o trabalho usando bots, que coletam um maior número de dados em uma curta fração de tempo.

O processo de Web Scraping pode ser dividido em duas etapas principais:

  • Buscando o código-fonte HTML do site por meio de uma solicitação HTTP ou usando um navegador Headless;

  • Analisando os dados brutos para extrair apenas as informações de seu interesse.

Para realização deste tutorial, será necessário o Node.js na versão 8.x ou posterior e npm instalados no seu computador.

Vamos começar!

Crie uma pasta chamado scraper e inicie com o code. Abra o terminal do code e execute o comando:

npm init -y

Esse comando inicializará o projeto com um arquivo “package.json”. Deixe-o com seus padrões.

Agora, instalaremos as dependências que utilizaremos para criar o Web Scraper:

npm install axios cheerio puppeteer –save

O que cada dependência faz?

  • Axios: é um cliente HTTP baseado em Promises para Node.js;

  • Cheerio: implementação do jQuery para o Node.js. O Cheerio facilita a seleção, edição e exibição de elementos DOM;

  • Puppeteer: uma biblioteca Node.js para controlar o Chrome ou Chromium.

Web Scrap:

Para demonstrar como fazer Web Scrap em um site utilizando o Node.js, configuraremos um script para capturar algumas informações da tabela do Campeonato Carioca de 2020 (Taça Rio). Especificamente, capturaremos os principais goleadores da competição até o momento e organizaremos os dados como um JSON.

Crie um novo arquivo na sua pasta scrapper, chamado goleadorScrap.js.

1º Passo:

Faça as requisições do axios, cheerio e coloque a url em uma constante (Vamos utilizar o site do globoesporte para fazer esse Web Scrap):

const axios = require('axios');
const cheerio = require('cheerio');
const url = 'https://globoesporte.globo.com/rj/futebol/campeonato-carioca/';

Agora, precisamos utilizar o axios para realizar a leitura do nosso HTML. O axios nos traz uma longa sequência de HTML, mas como analisar esse HTML e extrair apenas os dados que queremos? Esse é o trabalho do Cheerio. Ele nos permite utilizar os métodos jQUery para analisar o HTML e extrair informações que desejamos com ele.

Abra o link e abra as ferramentas de desenvolvedor, pressionando a tecla f12 ou clicando com o botão direito do mouse e Inspecionando. Vamos trazer os dados dos artilheiros do Campeonato Carioca. Como você pode notar, o corpo da tabela possui uma div com classe chamada “ranking-item-wrapper”, que contém as informações de cada jogador. Precisamos de um vetor para armazenar essas informações. O código ficaria assim:

const axios = require('axios');
const cheerio = require('cheerio');
const url = 'https://globoesporte.globo.com/rj/futebol/campeonato-carioca/';

axios(url).then(response => {
    const html = response.data;
    const $ = cheerio.load(html);
    const tabelaStatus = $('.ranking-item-wrapper');
    const tabelaJogador = [];
}).catch(console.error);

Os dados que queremos capturar dessa tabela são:

  • Nome do jogador: criaremos uma constante chamada nomeJogador, que receberá o texto disponível na div com classe “jogador-nome”.

  • Posição do Jogador: qual a posição do jogador. Pegue a classe “jogador-posicao” e capture o seu conteúdo de texto;

  • Número de gols: a quantidade de gols que o jogador fez. Capture o conteúdo da classe “jogador-gols”;

  • Time do jogador: o time para qual o jogador pertence. Nesse atributo, precisamos capturar o texto “alt” da tag “img”, que está aninhada a uma div com classe “jogador-escudo”.

O código ficará assim:

const nomeJogador = $(this).find('.jogador-nome').text();
const posicaoJogador = $(this).find('.jogador-posicao').text();
const numeroGols = $(this).find('.jogador-gols').text();
const timeJogador = $(this).find('.jogador-escudo > img').attr('alt');

Agora, precisamos dar um push no nosso vetor. Para isso, usaremos um .each para criar um laço de repetição, colocando em cada posição do vetor, um objeto com os dados do jogador. Feito isso, mostraremos no console os dados de cada jogador!

Este é o código completo:

const axios = require('axios');
const cheerio = require('cheerio');
const url = 'https://globoesporte.globo.com/rj/futebol/campeonato-carioca/';

axios(url).then(response => {
    const html = response.data;
    const $ = cheerio.load(html);
    const tabelaStatus = $('.ranking-item-wrapper');
    const tabelaJogador = [];

    tabelaStatus.each(function(){
        const nomeJogador = $(this).find('.jogador-nome').text();
        const posicaoJogador = $(this).find('.jogador-posicao').text();
        const numeroGols = $(this).find('.jogador-gols').text();
        const timeJogador = $(this).find('.jogador-escudo > img').attr('alt');
        tabelaJogador.push({
            nomeJogador,
            posicaoJogador,
            numeroGols,
            timeJogador
        });
    });
    console.log(tabelaJogador);
}).catch(console.error);

Faça o teste! Veja o resultado no seu terminal!

Gostou deste exemplo? Comente abaixo!

Diferenças entre for…of e for…in

Você conhece o loop For…Of?

Este loop é específico para iterar entre os elementos de uma lista. Ele percorre objetos iterativos, chamando uma função personalizada com instruções a serem executadas para o valor de cada objeto distinto.

Sintaxe:

for (variavel of iteravel){
   //Seu código aqui
}

Você pode fazer a leitura como: “Para cada item de uma lista”. No exemplo, dia começará com o valor “segunda” e o último valor será “sexta”.

O for…of percorre a lista de forma crescente, então ele irá mostrar de forma crescente os valores do seu vetor. Simples, não?

E o for..in?

O laço de repetição for…in interage sobre as propriedades enumeradas de um objeto, em sua ordem original de inserção. O laço pode ser executado para cada uma das propriedades distintas do seu objeto. É recomendável não adicionar, remover ou alterar propriedades do objeto durante a execução do laço for…in, pois, se uma propriedade é deletada durante a execução do loop, ela se torna indisponível para ser acessada depois. O loop for in retorna uma string com o nome das propriedades e seus respectivos valores

A sua sintaxe é:

for (variavel in objeto) {
    //Seu código aqui
}

Mas e quais são as suas diferenças entre os dois laços?

for…in

O loop for…in é usado para percorrer as propriedades de um objeto. Por exemplo:

let objetoComum = {
    nome: 'Nome',
    idade: '30'
}
for (let propriedade in objetoComum){
    console.log("Propriedade " + propriedade + "=" + objetoComum[propriedade])
}

for…of

Já o loop for…of é usado para percorrer objetos iteráveis, como Array, Map etc.

Utilizando o mesmo exemplo, mas usando o for…of:

let objetoComum = {
    nome: 'Nome',
    idade: '30'
}
for (let propriedade of objetoComum){
    console.log(propriedade)
}

Teremos a saída:

objetoComum is not iterable

Temos essa saída pois o nosso objeto não é iterável.

Agora, se obtivermos um objeto iterável, seria o seguinte:

let arrayComum = [10, 20, 30, 40, 50]

for (let elemento of arrayComum){
    console.log(elemento)
}

Nossa saída seria:

10
20
30
40
50

Gostou deste artigo? Comente abaixo!

Criando Pokedéx com React – Final

Olá pessoal! Chegamos a última parte do nosso tutorial Pokedex com React! Nesta última parte, gerenciaremos o estado e buscaremos dados da poke api. Por fim, usaremos os dados do Pokemón para preenchimento do nosso DetailView. Para dar sequência, você precisará dos artigos anteriores:

Passing Events:

Precisamos criar um evento de clique para cada um dos nossos PokeCells, afim de buscar os dados Pokemón da Poke API. Para fazer isso, criaremos a função como parte da classe APP e depois transmitiremos como props para cada um de nossos PokeCells.

Abra o arquivo App.js e cria uma função chamada handleOnClick, com o parâmetro id. No corpo da função, inclua um console.log do argumento id.

import React, { Component } from 'react';
import PokeList from './PokeList';
import DetailView from './DetailView';
import './styles/App.css';
class App extends Component {
  constructor() {
    super();
    this.state = {};
  }

  handleOnClick(id){
    console.log(id);
  }

  render() {
    return (
      <div className = "App">
        <PokeList />
        <DetailView />
      </div>
    );
  }
}

Precisamos passar esta função através do componente PokeList. Adicione a função handleOnClick para o PokeList:

render() {
    return (
      <div className = "App">
        <PokeList handleOnClick = {this.handleOnClick} />
        <DetailView />
      </div>
    );
  }

Usamos a palavra-chave this, porque handleOnClick é um método da classe App. No entanto, se não utilizarmos o bind, perderemos o contexto disso quando usarmos essa função no componente PokeList. Então, vamos vincular handleOnClick à classe atual:

class App extends Component {
  constructor() {
    super();
    this.state = {};

    this.handleOnClick = this.handleOnClick.bind(this);
  }

Agora, abra o seu arquivo PokeList.js e siga esta etapa:

  1. Desconstrua o handleOnCLick a partir dos argumentos PokeList;
  2. Adicione o método handleOnClick como um prop de PokeCells:
const PokeList = ({handleOnClick}) => {
    const cells = pokeClasses.map(pokeClass => {
        return (
            <PokeCell 
                key = {pokeClass.id}
                pokeClass = {pokeClass}
                handleOnClick = {handleOnClick}
            />
        );
    });

    return (
        <section className="poke-list">
            {cells}
        </section>
    )
}

Abra seu arquivo PokeCell e siga os seguintes passos:

  1. Desconstrua o handleOnClick a partir dos argumentos PokeCell;
  2. Adicione um evento onClick dentro da guia do botão e atribua a ele uma função anônima que chama handleOnClick com a variável id como parâmetro;

Agora, sempre que clicarmos no botão PokeCell, o ID do Pokémon clicado será registrado no console:

import React from 'react';
import sprites from '../assets/sprites.png';
import './styles/PokeCell.css';

const PokeCell = ({ pokeClass, handleOnClick }) => {
  const { id, backgroundPosition } = pokeClass;
  const style = { backgroundImage: `url(${sprites})`, backgroundPosition};

  return <button onClick={() => handleOnClick(id)} style={style} className="poke-cell"></button>
};

export default PokeCell;

Pokemon Helper:

Vamos criar uma classe Pokemon para limpar os dados da API que vamos buscar. Dessa forma, podemos gerenciar os dados de Pokemon mais facilmente. Dentro do diretório src, crie um arquivo Pokemon.js. Dentro deste arquivo Pokemon.js, adicione o código:

class Pokemon {
    constructor(data) {
        this.id = data.id;
        this.name = data.name;
        this.sprite = data.sprites.front_default;
        this.type = data.types[0].type.name;
    }
}

export default Pokemon;

Agora, quando buscarmos os dados, instanciaremos um novo objeto Pokemon e passa-lo aos dados buscados.

Buscando os dados:

Abra o arquivo App.js e siga estas etapas:

  1. Importe a classe Pokemon na parte superior do arquivo;
  2. No método handleOnClick, faça um fetch para a API. Adicione uma rota de URL dinâmico com o argumento id;
  3. Resolve a promise e crie uma nova instância de Pokecom com os dados buscados;
  4. Adicione um console.log do objeto Pokemon para ver os dados do Pokemon quando um PokeCell é clicado.
handleOnClick(id){
  fetch(`http://pokeapi.co/api/v2/pokemon/${id}/`)
  .then(res=> res.json())
  .then(data => {
    const pokemon = new Pokemon(data);

    console.log(pokemon);
  })
  .catch (err => console.log(err));
}

State:

Agora que nós já realizamos o fetch dos dados dos Pokemon, precisamos passar esses dados para o DetailView para mostrá-los.

Para fazer isso, precisamos tirar o objeto Pokemon da promise resolvida e armazená-lo no estado de nosso aplicativo. Na função construtora do componente App, adicione uma nova chave ao objeto de estado com o valor de um objeto vazio.

constructor() {
    super();
    this.state = {
      pokemon: {}
    };

    this.handleOnClick = this.handleOnClick.bind(this);
  }

Para atualizar o estado do pokemon, o React nos fornece uma função chamada setState. Essa função usa um objeto como argumento, onde precisamos especificar a chave que queremos atualizar e atribuir um novo valor a ele. Toda vez que essa função é chamada, o React renderiza novamente todos os componentes filhos.

handleOnClick(id){
    fetch(`http://pokeapi.co/api/v2/pokemon/${id}/`)
    .then(res=> res.json())
    .then(data => {
      const pokemon = new Pokemon(data);

      this.setState({pokemon});
    })
    .catch (err => console.log(err));
  }

Agora que armazenamos nossos dados de Pokemon no estado do aplicativo, podemos acessá-los na função de renderização. Passe o estado pokemon para o componente DetailView como um suporte. Como a propriedade state faz parte da classe App, precisamos incluir a palavra-chave this para acessá-la:

render() {
    return (
      <div className = "App">
        <PokeList handleOnClick = {this.handleOnClick} />
        <DetailView pokemon = {this.state.pokemon} />
      </div>
    );
  }

Exibindo os dados:

Abra o arquivo DetailView.js e siga estas etapas:

  1. Desconstrua o pokemon a partir dos argumentos DetailView;
  2. Desconstrua o ID, nome, Sprite e tipo da variável pokemon;
  3. Na tag da imagem, adiciona um atributo src e atribua a variável Sprite envolvida em chaves;
  4. Entre as tags h1, adicione as variáveis id e name envoltas em chaves;
  5. Na tag p, adicione a variável type envolvida em chaves.
import React from 'react';
import './styles/DetailView.css';

const DetailView = ({pokemon}) => {
    const { id, name, sprite, type } = pokemon;

    return (
        <section className="detail-view">
            <img src={sprite} className='sprite-image' alt='sprite' />
            <div className='data-wrapper'>
                <h1 className='data-name'>ID: {name}</h1>
                <p className="data-char">Type: {type}</p>
            </div>
        </section>
    )
}

export default DetailView;

E com isso, terminamos a nossa PokeDex! Gostou desta sequência de artigos? Comente abaixo!

Referências: https://blog.cloudboost.io/lets-build-a-pokedex-with-react-part-5-b61d730de5fc

Como instalar o Prettier no VS Code

O Prettier é um formatador de código para o JavaScript, Typescript, HTML, CSS entre outras tecnologias que ajuda a padronizar tudo que uma equipe desenvolve.

Existem plugins Prettier para muitos editores diferentes disponíveis. Aqui vou mostrar a instalação no Visual Studio Code.

1. Instale o plug-in Prettier VS Code

Abra a Paleta de comandos (no submenu Exibir ou use Cmd + Shift + P no Mac e Ctrl + Shift + P no Windows). Em seguida, selecione “Extensões: Instalar extensões”.

Procure por “Prettier”, clique em “Instalar” e depois em “Recarregar” quando a instalação estiver concluída.

2. Execute o Prettier em um arquivo

Agora, se você abrir um arquivo JavaScript e selecionar “Formatar Documento” na Command Palette Prettier, o seu código será arrumado!

3. Execute automaticamente o Prettier ao salvar um arquivo

Abra as configurações da área de trabalho por meio da paleta de comandos. Ative formatOnSave:

{
“pastas”: [],
“configurações”: {},
“editor.formatOnSave”: true,
}
Salve suas configurações e agora seu código deverá ser formatado toda vez que um arquivo for atualizado!

O Prettier também suporta outros idiomas além do JavaScript, por exemplo TypeScript, HTML, CSS ou JSON. No entanto, se você não deseja que eles sejam formatados, pode controlar a configuração formatOnSave por tipo de arquivo:

{
“pastas”: [],
“configurações”: {},
“[javascript]”: {
“editor.formatOnSave”: true
}
}
Formatando código existente com linha de comando
Você pode formatar o código para todo o seu projeto usando a interface da linha de comando (CLI) da Prettier. Primeiro instale a ferramenta CLI:

npm install mais bonito – global
Atualize seu código atual:

mais bonito “* /. ts” – escrever
Feito! Um aviso rápido: atualizar automaticamente a formatação do código significa que você fará um grande commit no controle de origem, onde um grande número de arquivos é atualizado. Isso pode dificultar o uso, por exemplo. git culpa, já que metade das linhas de um arquivo pode ter sido modificada pela última vez no commit do Prettier.

Lendo e renderizando arquivos XML com JavaScript

Olá pessoal, neste artigo demonstrarei como ler e renderizar no seu HTML um arquivo XML, usando JavaScript. Para isso, necessitaremos de um servidor local, como Xamp ou Wamp server, por exemplo. No nosso exemplo, utilizaremos o Xamp.

Vamos começar?

Primeiro, criaremos um arquivo XML de exemplo. No nosso arquivo XML, teremos um catálogo com CDs. Cada CD possui um título e um artista. É importante especificar o tipo de codificação de caracteres no cabeçalho do nosso XML. O tipo de caractere usado nesse exemplo é do conjunto UTF-8.

Representaremos o catálogo com a tag <CATALOG>. Os CDs serão representados com a tag <CD> e teremos três CDs. Cada CD possui duas tags: <TITLE> e <ARTIST>, que possuem o nome do disco e nome do artista, respectivamente.

<?xml version="1.0" encoding="UTF-8"?>
<CATALOG>
    <CD>
        <TITLE>Empire Burlesque</TITLE>
        <ARTIST>Bob Dylan</ARTIST>
    </CD>
    <CD>
        <TITLE>Hide your heart</TITLE>
        <ARTIST>Bonnie Tyler</ARTIST>
    </CD>
    <CD>
        <TITLE>Pavarotti Gala Concert</TITLE>
        <ARTIST>Luciano Pavarotti</ARTIST>
    </CD>
</CATALOG>

Pronto, agora que já temos o nosso arquivo XML, precisamos de um script JavaScript para realizar a leitura e renderizar o nome de cada disco e artista no DOM.

Dentro de um documento HTML, abra uma tag <script> e, dentro de uma estrutura condicional, utilize o XMLHttpRequest para que ocorra a transferência de dados entre o cliente e o servidor. Começaria assim:

<script>
    if (window.XMLHttpRequest){
        xmlhttp = new XMLHttpRequest();
     } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     }
</script>

O ActiveXObject é utilizado para suporte em Internet Explorer, sendo opcional no nosso exemplo.

Precisamos utilizar agora os métodos open() e send(), para abrir e enviar ao servidor/cliente o nosso arquivo XML a ser lido. Utilizaremos o método GET para isso.

if (window.XMLHttpRequest){
    xmlhttp = new XMLHttpRequest();
} else {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET", "file.xml", false);
xmlhttp.send();

Agora, utilizando o método responseXML, faremos a leitura do documento XML:

document.write("<table border='1'>");

Com nossa tabela criada, precisamos agora capturar a tag XML que contém os atributos título e artista. Como sabemos, essa tag é a CD. Utilizaremos o getElementsByTagName para capturarmos esses valores:

let x = xmlDoc.getElementsByTagName("CD");

Feito isso, criaremos um laço de repetição para percorrer esta tag CD e, assim, imprimir os conteúdos. Utilizaremos o childNodes e o nodeValue para capturar o conteúdos das tags <ARTIST> e <TITLE> do XML:

for (let i = 0; i < x.length; i++){
    document.write("<tr><td>");
    document.write("Artista: " + x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
    document.write("</br>")
    document.write("Disco: " + x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
    document.write("</td></tr>");
}

E por fim, fecharemos nossa tag <table>:

document.write("</table>");

O seu resultado deve ser algo parecido com isso:

O código JavaScript completo é este:

<script>
    if (window.XMLHttpRequest){
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.open("GET", "file.xml", false);
    xmlhttp.send();
    xmlDoc = xmlhttp.responseXML;

    document.write("<table border='1'>");
    let x = xmlDoc.getElementsByTagName("CD");
    for (let i = 0; i < x.length; i++){
        document.write("<tr><td>");
        document.write("Artista: " + x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
        document.write("</br>")
        document.write("Disco: " + x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
        document.write("</td></tr>");
    }
    document.write("</table>");
</script>

Gostou deste artigo? Comente abaixo!

Novidades ANGULAR 10

Angular lançou a versão beta do Angular 10, ou seja, a atualização está a caminho!

Essa atualização, planejada para o popular framework de desenvolvimento web, possui duas versões betas iniciais baseadas em TypeScript. Espera-se que a atualização para o framework desenvolvida pelo Google se concentre mais no ecossistema do que em suas características.

A atualização provavelmente será menor do que as versões anteriores do Angular. Não há data predeterminada de lançamento, visto que o Angular 9 ficou disponível no dia 6 de fevereiro deste ano e a versão Angular 9.1 ficou disponível no dia 25 de março.

Até agora, os recursos do Angular 10 são:

  • Adição de informações de dependência e seletores de conteúdo aos metadados;

  • Propagação do período de valor correto em um ExpressionBinding de uma expressão de microssintaxe para ParsedProperty, que por sua vez propagaria o período para os ASTs (VE e Ivy);

  • Uma correção para o núcleo. A lógica seria adicionada à migração de classe não decorada para decorar classes derivadas de classes não decoradas que usam recursos do Angular;

  • Urlmatcher sempre pode retornar null;

  • Foi corrigida uma situação em que havia uma chance de o service-worker nunca se registrar quando há uma tarefa de longa duração ou tempo limite recorrente.

Angular 9.1 chegou com suporte ao TypeScript 3.8:

A versão final do Angular 9 foi o último trabalho antes do Angular 10. O Angular 9.1 adicionou novos recursos, incluindo o suporte ao TypeScript 3.8, aprimoramentos de desempenho e uma longa lista de correção de bugs.

Este é o último lançamento secundário planejado para 9.x. À medida que começamos a trabalhar para a versão 10.0, você deve esperar para ver as pré-liberações da versão 10.0 normalmente uma vez por semana, embora elas contenham apenas alterações mínimas no início.”

Você pode encontrar as versões preliminares do Angular 10 no GitHub.

Gostou deste artigo? Comente abaixo e compartilhe com seus amigos!

Referências:

https://github.com/angular/angular/releases?ref=morioh.com

ES6: Default Parameters e Rest Parameter

O ECMAScript 6 foi a primeira atualização significativa para a linguagem desde o lançamento do ES5, que foi lançado em 2019. O Babel é uma ferramenta utilizada para pré-processar JavaScript, e nos permite usar algumas novas funcionalidades que ainda são experimentais, ou seja, estão em ambiente de testes. Atualmente, o ECMAScript já está em fase de experimentos da sua versão 2021, mas hoje, falaremos de duas importantes implementações do ES6: Default Parameters e Rest Parameter:

Default Parameters:

Para nos auxiliar na criação de funções mais flexíveis, o ES6 nos trouxe uma nova funcionalidade chamada Default Parameters para ser utilizada nas nossas funções. Por exemplo:
let saudacao = (nome = "Anônimo") => "Olá " + nome;
console.log(saudacao());
console.log(saudacao("Lúcio"));

// Olá Anônimo

// Olá Lúcio
O Default Parameter entra em ação quando você não especifica o argumento, ou seja, é indefinido. No nosso exemplo acima, o parâmetro nome recebe o valor padrão “Anônimo” quando você não fornece um valor como argumento.
Você pode passar mais valores padrão para quantos parâmetros você desejar:
let incrementar = (numero, valor = 8) => numero + valor;

console.log(incrementar(5));

// 13
Como você pôde perceber, o valor 8 não foi sobrescrito, trazendo 13 como resultado.

Rest Parameter

O ES6 também nos trouxe uma possibilidade de passar o Rest parameter como parâmetros de função, tornando possível a criação de funções que recebem um número variável de argumentos e esses argumentos são armazenados em um array que pode ser acessado posteriormente de dentro da função. O rest parameter elimina a necessidade de verificar a “args” e permite aplicar os métodos map(), reduce() e filter() no array de parâmetros.
Por exemplo, faremos uma função de multiplicação que receberá qualquer número nos seus argumentos e realizará uma multiplicação.
let multiplica = (...args) => {
    return args.reduce((a, b) => a * b, 1);
}

console.log(multiplica(10, 2, 10));

// 200

Com isso, vimos dois dos mais importantes recursos do JavaScript moderno que muita gente ainda desconhece. É importante sempre atualizar os seus conhecimentos da linguagem, pois ela está sempre em constante evolução, com novas funcionalidades, novos frameworks e bibliotecas para tornar seu código mais limpo, rápido e eficiente.

Gostou deste artigo? Comente abaixo!

Criando localhost básico para testes

Neste artigo, mostrarei como criar um localhost básico para testes rápidos, utilizando Nodejs + expressjs.
Em redes de computadores, o Localhost se refere ao computador que o está executando, funcionando basicamente como um servidor virtual. Ele também possui um endereço ip, variando de 127.0.0.0 a 127.255.255.255. Com um localhost você pode:

  • Testar Velocidade: você pode testar a velocidade de execução de equipamentos. No windows, você pode usar o comando ping localhost ou ping 127.0.0.1 no prompt de comando;
  • Testar aplicações: Assim que você utiliza o localhost, sua máquina se transforma em um servidor simulado;
  • E muito mais!

E como podemos criar um localhost para testes?

Para isso, precisaremos do Nodejs. É com ele que rodaremos JavaScript no Server-side.Você pode realizar o download em: https://nodejs.org/en/

Também utilizaremos o framework Express.js. Para realizar o download, abra o terminal e digite:

$ npm install express --save

Após isso, dê o comando:

npm start

E os arquivos package e package.json serão criados!

Crie um arquivo chamado index.js e vamos lá!

Iniciando

Para iniciar, precisamos fazer uma requisição para o módulo express que foi baixado. No seu arquivo index.js, comece com isso:

const express = require('express');
const app = express();

Criando as constantes express e app, fazemos a requisição do módulo express.

Com o módulo express, foram baixadas as dependências do módulo. Você pode verificá-las na pasta public. Com o método use, podemos utilizar diretamente os arquivos da pasta public.

app.use(express.static('./public'));

Agora que já estamos utilizando as dependências do express, podemos criar um método para escutar a porta na qual o localhost será executado. usando o app.listen(), mostraremos no console.log a porta e a url do nosso localhost:

app.listen(3000, function () {
    console.log('Porta 3000');
    console.log('link: http://localhost:3000/index.html');
});

Agora que já sabemos qual é a porta e qual a url do nosso localhost, vejamos no navegador:

Com isso, verificamos que o nosso localhost para testes está funcional!

Gostou deste artigo? Comente abaixo e mostre-nos outras alternativas de localhost!

JavaScript lidera ranking de linguagens

2020 chegou e com ele, muitas mudanças no mundo da tecnologia. Se você está curioso para saber qual pode ser o futuro do mundo da programação, veio conferir no lugar certo.

Seguindo as tendências de 2019, o ecossistema do JavaScript se manteve muito utilizado e otimizado. A cada dia que passa, mais pessoas utilizam esta poderosa linguagem com seus frameworks e bibliotecas.

Por muitos anos seguidos, o JavaScript vem sendo a linguagem de programação com maior crescimento e procura. Ela é amplamente utilizada no desenvolvimento de interfaces interativas para a Web, pois é suportada por todos os navegadores modernos. Segundo a pesquisa anual realizada pela Stack Overflow, cerca de 70% dos 72.525 desenvolvedores profissionais que participaram da pesquisa, afirmaram que utilizam JavaScript. Além disso, é um dos idiomas mais procurados, pois os entrevistados que ainda não usaram, afirmaram que querem aprendê-lo.

Pelo sétimo ano consecutivo, o JavaScript é a linguagem de programação mais utilizada, com Python seguindo de categoria.

Empresas de todo o mundo utilizam JavaScript em seus stacks de linguagens. O JavaScript é o coração de qualquer grande empresa de tecnologia, como o PayPal, que foi um dos primeiros a adotar o NodeJS, Netflix, Groupon, Walmart e LinkedIn. 16 de 25 empresas Unicórnio dos EUA mencionam o JavaScript em suas tecnologias, portanto, é improvável que o JavaScript saia do grid em um futuro próximo.

Em relação aos frameworks web, vemos que os frameworks JavaScript continuam em pleno funcionamento, com o jQuery tomando o primeiro lugar, seguido do Angular/Angular.js, React.js,

ASP.NET entre outros. Ainda vemos o Vue.js em ascensão na lista de frameworks web mais utilizados

.

Entre outros frameworks, bibliotecas e ferramentas, vemos a ascensão do Node.js, que se tornou o mais utilizado, com 50.4%, seguido de .NET e .NET Core. React Native também possui uma grande quantia de usos, com 10.8% dos entrevistados afirmando utilizá-lo

.

Referências:

Gostou desta notícia? Comente abaixo!

Criando Pokedéx com React – Parte 4

Na parte 4 do nosso tutorial, vamos fazer o componente DetailView. Você poderá conferir a parte 3 no link: https://www.mundojs.com.br/2020/04/03/criando-pokedex-com-react-parte-3/

DetailView:

Vá para a sua pasta componentes e crie um arquivo chamado DetailView.js. Também vá para a pasta styles e crie o arquivo DetailView.css.

Abra o DetailView.js e siga esses passos:

  1. Importe o React;
  2. Importe o DetailView css;
  3. Cria uma nova função chamada DetailView;
  4. Retorne uma section vazia com className=”detail-view”;
  5. Adicione elementos para mostrar os dados e a imagem;
  6. Exporte a nova função criada.
import React from 'react';
import './styles/DetailView.css';

const DetailView = () => {
    return (
        <section className="detail-view">
            <img className='sprite-image' />
            <div className='data-wrapper'>
                <h1 className='data-name'></h1>
                <p className="data-char"></p>
            </div>
        </section>
    )
}

export default DetailView;

No seu arquivo DetailView.css, adicione o seguinte código:

.detail-view {
    width: 50%;
    height: 100%;
    padding: 10px;
    background-color: #df095e;
    border-top-right-radius: 10px;
    border-bottom-right-radius: 10px;
    display: flex;
    flex-direction: column;
    justify-content: center;
}

.sprite-image {
    width: 80%;
    height: 150px;
    margin: 10px auto;
    background-color: #585858;
    border: 15px solid #DEDEDE;
    color: #585858;
}

.data-wrapper {
    width: 80%;
    height: 110px;
    padding: 10px;
    margin: 0 auto;
    background-color: #585858;
    border-radius: 5px;
    box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.22);
    color: #FFF;
}

.data-name {
    margin: 0 0 5px;
}

.data-char {
    font-size: 10px;
}
  1. O sprite-image conterá o Sprite Pokemón;
  2. A classe data-chat refere-se às características do Pokemón (id, nome, tipo).

No App.js, importe o componente DetailView. Renderize-o colocando o componente DetailView como uma tag html dentro do elemento pai.

import React, { Component } from 'react';
import PokeList from './PokeList';
import DetailView from './DetailView';
import './styles/App.css';
class App extends Component {
  constructor() {
    super();
    this.state = {};
  }

  render() {
    return (
      <div className = "App">
        <PokeList />
        <DetailView />
      </div>
    );
  }
}

export default App;

E este será o resultado:

Está gostando desta sequência de artigos? Comente abaixo!

Referências: https://blog.cloudboost.io/lets-build-a-pokedex-with-react-part-4-72afd23905a6