Vue.js

Plop.js – Automatize a criação de arquivos

Olá Web Developers! Vamos conhecer o Plop.js, uma ferramenta incrível que nos permite automatizar a geração de arquivos em nossos projetos. Se você já precisou copiar o conteúdo de um arquivo já existente para criar outro, você precisa conhecer esta ferramenta!

Entendendo o problema

Caso você já tenha trabalhado com Angular, sabe que ele possui comandos do próprio Angular-CLI para gerar services, pipes, classes, modules, etc.

Por exemplo, se você precisar criar um Service, basta executar o comando para criá-lo. Assim será gerado automaticamente um arquivo com o nome do seu service, com código contendo o service com o nome que você escolheu, e ele automaticamente será inserido no seu módulo (atualização de arquivo).

Ou seja, com um simples comando você terá arquivos sendo criados e atualizados, já com o conteúdo pronto para você começar a programar. Então te poupa o trabalho de ter que escrever declarações repetitivas.

ng generate service hero
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class HeroService {

  constructor() { }

}

Porém, não temos essa praticidade em qualquer lugar. Um ótimo exemplo é quando trabalhamos com React. Por ser uma biblioteca, ele não é tão opinativo quanto frameworks como o Angular. Em resumo, cada um pode criar sua própria estrutura, modo de escrever seus códigos, bibliotecas, etc. Esta é uma das diferenças entre bibliotecas e frameworks.

Por consequência, não temos uma ferramenta que gere arquivos para nós. Isso muitas vezes faz com que a gente acabe criando um arquivo vazio e escrevendo tudo, ou até mesmo copiando um arquivo existente para acelerar um pouco. Com o Plop.js você economiza aqueles 5 minutos para cada arquivo criado, seja rota, componente, controller, arquivo de teste, etc.

Plop.js vem ao resgate!

Uma vez que seu projeto começa a crescer, é preciso ter uma boa estrutura, organização e padrões. Também é importante que todos do time sigam esse mesmo padrão.

Com o intuito de resolver isso, o Plop.js nos permite criar comandos que vão gerar arquivos com a estrutura que queremos de forma bem simples!

Grandes empresas utilizam o Plop.js, como Microsoft, PayPal, Adobe e Mozilla.

A imagem abaixo mostra o Plop.js sendo iniciado em um projeto React, me perguntando se quero criar um componente, serviço, hook ou uma estrutura para Redux-Saga (action, reducer e saga).

Plop.js - Escolhendo gerador

Angular - Introdução
Curso de Angular - Introdução
CONHEÇA O CURSO

Instalando o Plop.js

Primeiro precisamos instalar o Plop.js em nosso projeto. Execute o comando:

npm install --save-dev plop

No package.json vamos adicionar um comando para iniciar o Plop!

{
    ...
    "scripts": {
        "plop": "plop"
    }
}

Agora poderemos iniciar o Plop.js com o comando npm run plop.

Iniciando seu primeiro gerador

Crie na raiz do seu projeto um arquivo com o nome plopfile.js com o seguinte conteúdo:

module.exports = function (plop) {

};

Estamos expondo uma função que o Plop.js vai executar e passar para ela o objeto plop como parâmetro. Este objeto possui várias funções a fim de nos permitir criar nossos geradores.

Já podemos criar os geradores dentro desta função. No entanto, em projetos grandes isso vai gerar uma bagunça. Portanto, prefira criar um arquivo para cada gerador.

Por isso, vamos criar uma pasta chamada plop e dentro vamos criar um arquivo chamado hook-generator.js. Ele vai servir para gerarmos um React Hook.

Em hook-generator.js vamos ter o seguinte código:

module.exports = function (plop) {

};

É um código igual ao que fizemos antes, mas agora ele está em um arquivo separado. Então vamos conectá-lo ao arquivo principal, o plopfile.js;

const hookGenerator = require('./plop/hook-generator.js');

module.exports = function (plop) {
    hookGenerator(plop);
};

Dessa forma estamos fazendo com que o plopfile.js seja um lugar onde chamamos nossos geradores ao invés de declará-los diretamente aqui.

Iniciando um gerador de React Hooks

Volte ao arquivo hook-generator.js para podermos ver como é simples criar um gerador de arquivos.

module.exports = function (plop) {
    plop.setGenerator('hook', {
        description: 'Gerador de React Hooks',
        prompts: [],
        actions: []
    })
};

É desse modo que iniciamos um gerador. Vamos entender cada uma das suas partes:

  • setGenerator: Função para criar um gerador. Ela recebe uma string indicando seu nome e um objeto indicando suas configurações
  • "hook": Indica o nome que demos ao gerador
  • description: Campo para colocarmos uma descrição sobre o nosso gerador
  • prompts: Array que vai receber objetos que vão indicar as perguntas que o terminal vai fazer para nós respondermos, para assim ele saber como criar o arquivo.
  • actions: Outro Array, e ele vai receber objetos que vão indicar as ações que o Plop vai ter que executar baseado em nossas respostas.

Partiremos agora para o prompts. Para criar um hook, vamos simplesmente pedir para o usuário indicar o nome do hook a ser criado. Assim poderemos usar esse nome para criar o nome do arquivo e já criar um código com esse mesmo nome.

Em resumo, vamos usar os prompts quando precisarmos ter o valor de alguma variável. Vamos chamar essa variável de nomeHook. Ficará assim:

    ...
    prompts: [
        {
            type: 'input',
            name: 'nomeHook',
            message: 'Digite o nome do Hook: '
        }
    ],
    ...
  • type indica o tipo de entrada que vamos usar. Para permitir que o usuário escreva, utilizamos o input
  • name é o nome da variável
  • message é o texto que o terminal vai imprimir para pedir uma ação do usuário
React - Despertando o Poder dos Hooks
Curso de React - Despertando o Poder dos Hooks
CONHEÇA O CURSO

Definindo Ações

Para encerrar, precisamos indicar uma ação a ser executada. No nosso caso, um arquivo vai ser criado. Com o intuito de criar um arquivo com o código que quisermos usando as variáveis que pegamos em prompts, criamos um arquivo de template que usa Handlebars.

Crie um arquivo chamado hook-template.hbs. Dentro dele teremos o template do nosso código. Você pode escrever do jeito que quiser.

import { useState, useEffect } from 'react';

export function use{{nomeHook}}(){
    const [value, setValue] = useState(null);

    useEffect(() => {

    }, []);

    return value;
}

Então criamos aqui uma estrutura genérica para um React Hook. Esse é o conteúdo que o Plop.js vai colocar no arquivo que for gerado. Porém, veja que no nome da função escrevemos {{nomeHook}}. O Handlebars vai trocar essa parte pelo nome da nossa variável. Ou seja, se o usuário escrever Scroll, teremos uma função com o nome useScroll().

Por fim, para fazer esse arquivo ser gerado, vamos escrever nossa action.

    ...
    actions: [
        {
            type: 'add',
            path: 'src/hooks/use{{nomeHook}}.js',
            templateFile: 'plop/hook-template.hbs'
        }
    ]
    ...
  • Como queremos criar um novo arquivo, o tipo da ação deve ser add.
  • Em path indicamos o caminho do arquivo e seu nome. Note que colocamos {{nomeHook}} para que seja trocado pela nossa variável. Assim o arquivo será criado com esse nome.
  • templateFile indica o arquivo com a template que será usada para inserir conteúdo no arquivo a ser criado.

Executando o Plop.js

Finalmente, basta executar o comando npm run plop. Como só temos um gerador, ele vai iniciá-lo automaticamente. Vamos dar ao nosso hook o nome Scroll.

Plop.js sendo iniciado pelo terminal

Assim que você pressionar Enter, o arquivo do jeito que queríamos será gerado, como você pode ver na imagem abaixo:

Plop.js - React Hook gerado automaticamente

Desenvolvedor React Sênior
Formação: Desenvolvedor React Sênior
Nesta formação conheceremos a Arquitetura Flux, muito utilizada nas aplicações modernas e que nos trás muitos benefícios em relação às arquiteturas clássicas como o MVC. Aprenderemos a sua principal implementação, o Redux. Também veremos a trabalhar com código assíncrono com Redux Thunk e conceito de programação funcional com Redux-Saga.
CONHEÇA A FORMAÇÃO

Qual a diferença entre Framework e Biblioteca?

Olá Web Developers! Você sabe qual a diferença entre Framework e Biblioteca? Pois esta é uma dúvida muito comum em programadores de vários níveis. Vamos entender melhor as características de cada um para finalmente entender do que se tratam.

O que são Bibliotecas?

Estantes em uma biblioteca com vários livros

Vamos imaginar que precisamos calcular quantos dias existem entre duas datas utilizando JavaScript. Mas no momento não há uma funcionalidade da linguagem que faça este cálculo para nós. Então teremos que criar uma função em que a gente passe duas datas e ela nos retornará a quantidade de dias.

E depois pode aparecer a necessidade de pegar uma data e adicionar um certo número de dias. Que data teremos como resultado? E se precisarmos adicionar horas ou minutos?

A príncipio podem parecer funções sem conexão, mas note que estamos falando de cálculos que nos remetem a tempo. Com o intuito de deixar o código mais organizado, podemos juntar estas funções em uma “coleção” de funções relacionadas ao cálculo de tempo.

Em conclusão, podemos dizer que uma biblioteca (do inglês library, não confundir com livraria que em inglês é book store) é uma coleção de códigos voltados a resolver um determinado tipo de problema.

Exemplos de Bibliotecas JavaScript

  • Moment.js: Biblioteca para converter, validar, manipular e exibir datas e horários
  • Chart.js: Biblioteca para a criação de gráficos
  • Voca: Biblioteca para trabalhar com Strings
  • mo.js: Biblioteca para criar animações incríveis com SVG. Já fizemos um post sobre como começar com o mo.js
  • React: Biblioteca para criar interfaces de usuário. Se quiser conhecer um pouquinho, temos um post aqui no blog para você conhecer o React
React - Despertando o Poder dos Hooks
Curso de React - Despertando o Poder dos Hooks
CONHEÇA O CURSO

O que são Frameworks?

Já fizemos um post sobre o propósito dos frameworks. Mas vamos fazer uma pequena recapitulação.

Um framework possui várias funcionalidades prontas, e normalmente já possuem um fluxo de trabalho ou estrutura a serem seguidos. É algo bem mais abstrato do que uma biblioteca. Isso realmente confunde muitas pessoas. Por exemplo, o jQuery se autodenominava um framework, mas já faz um bom tempo que ele se chama de biblioteca.

O foco dos frameworks é mais amplo que das bibliotecas. Aliás, um framework pode ser feito a partir de uma coleção de padrões, APIs e até mesmo de bibliotecas.

Só para exemplificar, o Angular, framework JavaScript para desenvolvimento de aplicações, é feito a partir de bibliotecas de animação, requisições http, internacionalização, testes, tratamento de dados em formulários, reatividade, roteamento, etc.

Exemplos de Frameworks JavaScript

  • Angular: Framework para criação de aplicações web
  • Vue.js: Framework também para criação de aplicações web
  • Ionic: Framework para criar aplicativos mobile com Angular, React ou Vue
  • Express: Framework para criar aplicações com Node.js
  • LoopBack: Framework para criar APIs e microserviços com Node.js
Angular - Tópicos avançados
Curso de Angular - Tópicos avançados
CONHEÇA O CURSO

Mas então, qual a diferença entre Framework e Biblioteca?

Por mais que a gente tenha visto características de framework e biblioteca, ainda assim há confusão, pois nem sempre as funções do software deixa claro a sua natureza. É provável até que não seja nenhum dos dois. Bem como também é comum ver lugares chamando Angular de biblioteca e React de framework, sendo que na verdade é ao contrário.

Antes de tudo, algo que podemos notar além das diferenças já mostradas aqui é que normalmente as bibliotecas são usadas pelos nossos códigos, enquanto os frameworks é quem costumam utilizar os nossos códigos.

Por isso podemos diferenciar React de Angular. Se acaso você já usou os dois verá as seguintes diferenças:

No React nós temos basicamente funções para a criação de componentes e criação de estados. Estamos no controle o tempo todo, nós chamamos as funções do React, podemos decidir qual será a estrutura da nossa aplicação e o fluxo com o qual ela funciona. Se acaso a gente precisar de funcionalidades de roteamento, animações, internacionalização, etc, precisaremos buscar bibliotecas para isso.

function App(props) {
    return (
      <div>
        Olá, {this.props.name}!
      </div>
    );
}

ReactDOM.render(
  <App name="Taylor" />,
  document.getElementById('hello-example')
);

Em contrapartida no Angular todas essas funcionalidades já vêm inclusas. Há uma estrutura que devemos seguir (componentes, serviços, pipes, rotas, módulos), e o Angular é quem vai chamar o nosso código seguindo seu próprio fluxo. Essa característica de já ter uma estrutura é o principal diferencial entre um framework e uma biblioteca. Você pode notar que em nenhum momento nós chamamos alguma função como Angular.nomeFuncao(). Eventualmente, caso queira fazer algo num fluxo ou estrutura diferente, o Angular não vai entender e você terá um erro.

@Component({
  selector:    'app-hero-list',
  templateUrl: './hero-list.component.html',
  providers:  [ HeroService ]
})
export class HeroListComponent implements OnInit {

}

Veja como já temos uma estrutura a seguir. É como se no framework nós precisássemos preencher os campos que ele pede, é ele quem está no controle de tudo.

Qual o melhor? Framework ou Biblioteca?

Podemos concluir que enquanto na biblioteca nós mesmos criamos a base e o fluxo, no framework já temos toda a estrutura pronta para utilizarmos e seguirmos. Mas isso não significa necessariamente que um é melhor do que o outro. São ferramentas diferentes para propósitos diferentes.

Ao passo que no Angular nós já temos toda a estrutura pronta, nos poupando desse trabalho, teremos menos liberdade para certas escolhas. Em contrapartida, no React temos que definir coisas comuns como arquitetura e fluxo, mas teremos mais liberdade de escolher cada biblioteca responsável por cada funcionalidade em nossa aplicação.

Desenvolvedor Front-end Sênior
Formação: Desenvolvedor Front-end Sênior
HTML, CSS e JavaScript são a base de toda a web. Tudo o que você está vendo aqui agora depende deste tripé.Nesta formação aprenderemos Sass, Google Analytics, empacotar nossas aplicações com Webpack, criação de aplicações Desktop com Electron, UX/UI e uma introdução aos frameworks mais utilizados no mercado: Angular, React, Vue e Ember.
CONHEÇA A FORMAÇÃO

Perdendo o preconceito com o novo Angular

Olá, Web Developers! Quem aqui também já desanimou com tantas notícias sobre a nova versão do Angular? (Eu mesmo já tinha desanimado).

Com tantas pessoas mais experientes que eu listando coisas boas e ruins, eu realmente desanimei. Mesmo assim, por saber da demanda no mercado, eu continuei seguindo a evolução dele, pensando que as coisas iriam melhorar. Muitas coisas que vejo ainda me desanimam, mas mudei alguns pensamentos e até vejo o novo Angular como um aliado.

Vou listar aqui alguns itens que me desanimavam e o motivo de eu ter mudado de ideia. Quem sabe você se inspire e considere utilizá-lo para o seu próximo projeto? É sempre bom manter a mente aberta, não? 😉

Angular - Criação de interfaces web
Curso de Angular - Criação de interfaces web
CONHEÇA O CURSO

Major version a cada 6 meses

O novo Angular não tem nada a ver com o Angular 1. Ele foi criado do zero. No final de 2016 foi anunciado que uma nova versão seria lançada a cada 6 meses, ou seja, logo logo teremos o Angular 4.

Por causa desse versionamento “agressivo”, não há mais razão para chamarmos de Angular 2. O recomendado é chamar o antigo de AngularJS e o novo simplesmente de Angular. Você pode entender melhor a razão lendo esse post. O medo de muitas pessoas é: “Major Versions a cada 6 meses? Meu deus, muita coisa vai quebrar!”

Lembro do AngularJS em sua versão 1.2. Após um tempo eu precisei muito de algumas funcionalidades lançadas no 1.4, mas isso quebrou muitas coisas de bibliotecas de terceiros. Tive que me contentar com algumas coisas que já haviam na 1.3 mesmo.

Até mesmo quem quis sair na frente e escreveu livros e criou cursos na fase alpha ou na fase de lançamento do novo Angular teve que arrumar muita coisa. Várias coisas mudaram de um dia para o outro.

Estão dizendo que agora todas as versões serão compatíveis com versões mais antigas. Já ouvi essa história antes no AngularJS, e não aconteceu. Mas eu aceitei, porque realmente há momentos em que temos que evoluir algumas funcionalidades, e outras acabam se tornando obsoletas. Faz parte do desenvolvimento e, com o tempo, algumas funcionalidades acabam sendo removidas. Seria muito pior uma ferramenta que não evolui ou que fica carregando código legado o “resto da vida”.

Será que o seu sistema realmente vai precisar ficar migrando para cada versão nova que sair? Se for o caso, será que você escolheu bem a ferramenta ou modo de desenvolver?

Sintaxe completamente diferente

Se tanta gente já estava acostumada com o modo de desenvolver do AngularJS, por que criar uma sintaxe tão diferente?

AngularJS:

<input type="text" ng-model="name" ng-click="doSomething()" />

<ul>
   <li ng-for="item in list" ></li>
</ul>

Angular:

<input type="text" [(ngModel)]="name" (click)="doSomething()" />

<ul>
   <li *ngFor="let item of list" ></li>
</ul>

Esse foi um tapa na cara de quem veio do AngularJS e achou que poderia reaproveitar algumas coisas no Angular. Mesmo as partes mais simples e conhecidas do AngularJS são bem diferentes das do Angular, como podemos ver no exemplo acima, ao utilizar o famoso ng-model, fazer loopings ou chamar eventos.

Quem conhece o novo Angular sabe o motivo por trás da sintaxe [()], conhecida como “banana in a box”, ou o * do *ngFor. Mas dava muito bem para tentar deixar algumas coisas com a sintaxe igual, né? Facilitaria muito, pois aprenderíamos intuitivamente, só de lembrar da sintaxe do AngularJS, sem ter que procurar como fazer algo.

Hoje eu tenho outra opinião. Por ser uma ferramenta totalmente diferente, funcionar diferente, é importante que saibamos conscientemente o que estamos fazendo.

Trabalhar com um serrote levando em conta a sua experiência com um martelo pode fazer com que você não faça um bom códigão.

Hanashiro, Akira

A mudança até nos detalhes que já conhecíamos nos força a estudar do zero. O nome da ferramenta pesou bastante por seu legado. Por ser algo feito do zero, talvez teria sido bom (ou essencial) criar um novo nome. Chamar de Angular 2 foi puro marketing.

Lembre-se: Angular é uma ferramenta totalmente diferente do AngularJS.

Início de projeto muito complicado

Nossa, essa no começo era indiscutível. Tínhamos que configurar o transpilador para o TypeScript, pegar as dependências do Angular como o zone.js, pegar o SystemJS, angular2-polyfills, etc.

Depois o arquivo principal. Tem que saber o que importar. Tem coisas que vêm do @angular/core, outras do @angular/forms, @angular/platform-browser, etc. Com o tempo você se acostuma.

E então criamos uma classe e passamos algumas (muitas!) informações para a anottation @ngModule. Várias das coisas que importamos temos que passar para a anottations. E isso, após um tempo, começa a cansar, concorda?

E depois de várias linhas, estamos prontos para nosso primeiro Hello World! Para quem está iniciando na profissão, a sensação é tipo essa:

Este aqui não é para principiantes

Sendo que no AngularJS, bastava importar o código, colocar um ng-app no container da aplicação e pronto! Até mesmo o React, que necessita transpilar o JSX, o que nos faz ir em busca de ferramentas como Babel, é bem mais simples para quem está iniciando.

Hoje em dia podemos iniciar facilmente uma aplicação com o @ang/cli, ferramenta feita em cima do ember-cli, que serve para estruturar a aplicação automaticamente a partir de comandos. Até os imports são colocados automaticamente.

Eu não gosto muito de ferramentas assim, pois muitas vezes produzem muito código que não iremos utilizar, e se precisarmos apagar alguma coisa, teremos que conhecer bem o que foi criado, pois teremos que apagar na mão.

Outros podem dizer: “Estruturar automaticamente sem nem saber o que está acontecendo? Isso é loucura. Não dá certo!”.

Bem, já foi provado que aprendemos mais rápido se formos logo de “cabeça” em algo ao invés de ficar estudando a teoria primeiro. É como dizem: “Aprendemos a andar caindo, não observando.”

Muitos cursos modernos de línguas estimulam a prática do idioma já no início, ao invés de ficar primeiro te ensinando pronomes, depois verbos, e só depois formar frases. Esse é um dos motivos por trás do sucesso de aplicativos como o Duolingo, que para muitos é só uma brincadeira mas para outros é uma ferramenta muito bem elaborada.

Tenho que admitir que depois que parei de me preocupar com o que cada linha fazia, e mergulhei de cabeça na criação de código, aprendi mais rápido. Agora que já conheço melhor a ferramenta, entender o que cada uma daquelas linhas faziam ficou mais fácil.

Mais uma vez: É uma ferramenta diferente e com propósitos diferentes. Esteja aberto à mudanças ao invés de ignorá-las e ficar comparando com outras soluções.

TypeScript

Muita gente reclama do TypeScript, mas eu sou neutro neste item. Realmente não me incomoda. Muitas das funcionalidades que utilizamos no Angular faz parte da nova versão do EcmaScript.

Fora isso, o que o TypeScript tem de diferente mesmo é a tipagem, mas você pode muito bem continuar declarando variáveis sem declarar o tipo.

Complica o que o React facilita

Criar componentes no AngularJS era chatinho. Tinha muita coisa que não era tão simples ou intuitiva, e tentar explicar para os outros da equipe só fazia eles desejarem não chegar mais perto do front-end.

Não há como negar que criar componentes no Angular agora é mais simples, mas nem tão simples quanto no React. Há muitas reclamações contra o React e sobre o uso do JSX, mas também há reclamações do Angular por termos que importar os módulos e declararmos mais umas duas vezes no @decorator .

Tem gente que defenderia o Angular simplesmente por dizer que código no React fica feio por “misturar HTML e JS”. Não adianta dizer: “É JSX! Você pode escrever JS se quiser!” para os outros. Essas pessoas não estão abertas a testar algo novo só porque já foi considerado ruim há muitos anos.

Só digo que é pouco JSX que vai nos componentes. Se você tem muito código no seu componente, pode ser que você esteja fazendo errado, pois, praticamente você está criando uma View.

Saindo do React, outros podem acabar dizendo: O Aurelia faz o mesmo de maneira bem mais simples! Sim! Quem já testou o Aurelia vai concordar que nem parece que temos um framework lá. Escrevemos um HTML no arquivo HTML e no arquivo JavaScript criamos uma classe comum, tornando tudo muito intuitivo! Fim.

Para quem tem seguido a evolução do Angular, muitas funcionalidades têm sido simplificadas. Quem sabe esse monte de código que repetimos uma hora saia?

Não sei como defender esse ponto. Só decidi aceitar que é uma ferramenta diferente e torço para que as partes ruins sejam melhoradas o quanto antes.

Documentação ruim

Não tem desculpa. Se formos comparar a qualidade da documentação do Angular com outras, como React ou Vue.js, ela é bem complicada para quem está começando.

Quando decidi estudar Vue.js, apenas umas 2 horas lendo a documentação já foi suficiente para aprender como trabalhar com ele, discutir com minha equipe sobre as vantagens e desvantagens e porque deveríamos considerá-lo para nosso próximo projeto.

Uma das razões que me desanimavam no Angular é que no começo a documentação era nossa única fonte de estudo, quando ele ainda estava em fase alpha.

Hoje em dia isso não me incomoda mais, pois já temos muitos cursos, livros e posts sobre o assunto (esse foi fácil defender :p).

Concluindo

Bom, a ideia desse post não foi falar mal ou bem de Angular, Vue, React, Ember, Aurelia, etc. Foi mais para apontar os principais motivos de eu (e várias pessoas) evitarmos tanto ele e a razão de eu ter dado mais uma chance.

Como eu disse muitas vezes, é uma ferramenta nova com ideias novas para projetos novos. Pense bem nas suas necessidades, estude ferramentas diferentes, analise a melhor para a necessidade do seu projeto, pois não existe ferramenta perfeita que se encaixa em tudo, e mesmo se existir, um dia ficará ultrapassada.

Somos maduros e profissionais o bastante para experimentar coisas novas, e não crianças discutindo o que é melhor: Pokémon ou Digimon. Espero que este texto tenha te inspirado a refletir sobre o assunto, não só sobre Angular, mas também sobre outras ferramentas.

E você, o que acha do front-end moderno e sua enorme quantidade de ferramentas? Compartilhe com a gente aí nos comentários!

Ah, aqui no TreinaWeb temos cursos sobre AngularJS, React e Vue.

Angular - Criação de interfaces web
Curso de Angular - Criação de interfaces web
CONHEÇA O CURSO
React.JS - Criação de interfaces web
Curso de React.JS - Criação de interfaces web
CONHEÇA O CURSO
Vue.js - Criação de interfaces web
Curso de Vue.js - Criação de interfaces web
CONHEÇA O CURSO

Em breve lançaremos os cursos de Angular 2 e Aurelia. o/

© 2004 - 2019 TreinaWeb Tecnologia LTDA - CNPJ: 06.156.637/0001-58 Av. Paulista, 1765, Conj 71 e 72 - Bela Vista - São Paulo - SP - 01311-200