Web Avançado
Chrysthian Simão
Frameworks de frontend
Web Avançado
Construir Soluções Web
- Frontend com React e TS
- Backend com Node
- Integração com Banco de dados NOSQL MongoDB
Git
Git
Repositório de códigos para poupar a sua pressão sanguínea e pra ajudar você do futuro.
Na universidade está instalado nas máquinas, mas em casa, você precisa instalar ele
Git
Não tem uma conta? hora de fazer uma
Agora!
Já!
Nesse instante!
Git
Você pode instalar a ferramenta da sua preferência para trabalhar se quiser, mas eu vou mostrar via linha de comando mesmo.
O GitHub tem o github desktop por exemplo.

Git
Como eu sei que instalou corretamente?
git --version
Usuário
A primeira coisa que você deve fazer ao instalar Git é configurar seu nome de usuário e endereço de e-mail.
Isto é importante porque cada commit usa esta informação, e ela é carimbada de forma imutável nos commits que você começa a criar.
Usuário
Configurando usuário global
$ git config --global user.name "Fulano de Tal"
$ git config --global user.email fulanodetal@exemplo.br
Clonando um repositório
Para pegar código de um repositório, dizemos que estamos clonando ele, isso quer dizer que tudo o que ele tem, na versão mais atual vai ser copiado para o seu equipamento.
Clonando um repositório
git clone https://github.com/chrysthian/up.git
Git pull
Como o comando clone só copia o repositório *naquele momento*, manter o projeto atualizado requer que você atualize ele.
Por exemplo se o professor enviar uma atualização de exercício ou código depois que você clonou.
Git pull
git pull
git pull (só que menor)
Gerenciando alterações
Nos arquivos locais (na sua máquina) você pode fazer o que achar melhor.
Mas você só pode enviar código para um repositório que você tem acesso, sendo como dono ou parte do time (isso é configurado no próprio repositório).
Add
É muito comum adicionarmos arquivos novos ao trabalhar em uma solução de código, mas para isso precisamos dizer ao repositório para versionar os arquivos novos também
Commit
A ação de commit, é salvar e versionar os arquivos alterados em relação ao código do repositório.
As alterações realizadas podem ser comparadas linha a linha, e é possível "voltar no tempo" entre as versões do código que passaram por um commit.
Commit
Commit é uma ação LOCAL!
O repositório ainda não sabe das suas alterações!!!
Push
Uma vez adicionados os arquivos novos, salvo as alterações nos arquivos antigos através de um commit, é hora de avisar o repositório que a versão do seu trabalho foi atualizada.
Push
Aqui entra o push, você "empurra" o código para o repositório.
Gerenciando alterações
git pull
git add .
git commit -m"mensagem curta sobre as alterações"
git push
Gerenciando alterações

VS Code resolve isso pra você, pode usar? pode
A vantagem do terminal é que os comandos são os mesmos sempre, já interface pode mudar de ferramenta pra ferramenta, então tem que acostumar com cada uma.
A gosto do freguês desde que entenda o conceito
Resolvendo conflitos

Quando duas pessoas mexem em um mesmo trecho de código, como o repositório sabe qual é o correto?
Isso acontece quando esse cenário é identificado em um pull, por isso o primeiro comando antes de enviar código deve ser pull
Resolvendo conflitos

Quando o conflito aparece o git tentará resolver os conflitos automaticamente, (por exemplo somando alterações em um mesmo arquivo, mas trechos diferentes de código)
Mas se ainda assim existir conflitos eles precisam ser resolvidos manualmente
Resolvendo conflitos

O próprio VS Code trará uma listagem de arquivos que precisam de uma intervenção do desenvolvedor para que sejam solucionados.
Uma vez resolvidos, é necessário um commit e um push.
Mas claro, TESTE antes de enviar a sua atualização ou todos que estiverem consumindo o repositório podem acabar puxando um código quebrado.
Caminhos "alternativos"
Algumas pessoas tentam postegar o uso do git ao acessar os sites que contém os repositórios e navegar pelo código diretamente no navegador.
Embora as ferramentas como github e bitbucket tenham essa facilidade, é preferível clonar o repositório de fato, permitindo o uso de IDEs, gerar alterações locais, além de aplicações mais complexas precisarem de um processo de build antes de rodar.
Consulte pelo navegador somente em casos de consultas rápidas, mas via de regra, clone o repositório
Web comofas?
Cliente x Servidor

Navegadores
(por baixo dos panos)
- Seu navegador (cliente) faz requisições para um servidor
- O servidor processa essa requisição
-
Seu navegador recebe uma resposta
- O Navegador baixa os arquivos localmente (cache)
- Usando as informações locais, o browser as interpreta e exibe na tela o resultado
HTTP é a sigla para Hypertext Transfer Protocol, que em português significa Protocolo de Transferência de Hipertexto.
Trata-se de um padrão de comunicação utilizado para a transferência de informações na World Wide Web e em outros sistemas de rede.
Protocolo HTTP
Ele é a base da comunicação na internet e permite que os navegadores solicitem páginas da web e outros recursos de servidores, bem como enviem informações de volta para esses servidores.
Protocolo HTTP
http, a parte antes de "://" é o que chamamos de URL Scheme.
Nesse caso, estamos falando para o navegador usar o Hypertext Transfer Protocol, o HTTP.
URL
Existem outros esquemas, tais como: https, FTP, mailto.
Tudo que vier depois de "://" é específico do protocolo que estiver sendo utilizado.
URL
https://slides.com/chrysthian/
Protocolo HTTP
Hypertext Transfer Protocol Secure (HTTPS) é uma extensão do HTTP que usa criptografia de dados, ou seja é igual, só que diferente
Endereços como google.com são na verdade o nome do servidor que armazena nosso recurso.
Nosso navegador vai realizar um processo conhecido como DNS Lookup para traduzir o nome em um endereço de rede (IP) e vai enviar a requisição para esse endereço.
DNS
Domain Name System
A sua função não é hospedar sites ou aplicações que criamos, mas sim permitir que as requisições cheguem aos locais corretos.
Um servidor DNS é feito única e exclusivamente para a tradução de domínios para endereços de IP
DNS
Domain Name System
https://slides.com/chrysthian/
DNS
18.211.49.95
Url path é o que aparece depois do DNS.
O servidor irá identificar qual é o recurso específico que deve devolver para este caminho quando a requisição chega
URL PATH
Podem ser recursos a serem interpretados como uma página
OU
Arquivos que fazem parte da apresentação como arquivos CSS, JS, vídeos e imagens.
URL PATH
Na nossa disciplina, uma aplicação desenvolvida em node irá tratar a requisição no servidor, fará uma consulta em um banco de dados e o recurso que será devolvido para ser construído dinamicamente por esta aplicação.
URL PATH
https://slides.com/chrysthian/
URL PATH
Esse número 80 representa o número da porta que o servidor está usando para “ouvir” requisições HTTPS.
A porta 80 é a padrão e é opcional no caso do uso do endereço em um navegador, então, normalmente você não vê esse 80 nas URLs.
PORT
https://slides.com:80/chrysthian
É mais comum especificarmos esta porta quando estamos testando a aplicação em ambiente de homologação/testes.
Como por exemplo http://localhost:3000
PORT
http://localhost:3000
PORT
Aba Network do seu browser

Ctrl+Shift+J (Edge)
F12 (Chrome, Firefox)
Status

Para saber se uma requisição foi bem sucedida ou não há um padrão de códigos de status.
Respostas Informativas (100 – 199)
Respostas bem-sucedidas (200 – 299)
Mensagens de redirecionamento (300 – 399)
Respostas de erro do cliente (400 – 499)
Respostas de erro do servidor (500 – 599)
React!
(Finally!)
Um pouco de história
Era uma vez o facebook... Eles tem uma aplicação de complexidade crescente que precisava de um controle adequado na exibição, sem que as coisas fossem complexas demais para gerenciar.
A partir daí os engenheiros criaram essa biblioteca, viram que ela era muito robusta, então disponibilizaram ela em código aberto para a comunidade.
Dezoito versões depois, cá estamos.
Framework
Um framework é um conjunto de ferramentas e bibliotecas que fornecem um conjunto de recursos e funcionalidades prontas para programadores.
Isso permite construir aplicativos mais rapidamente, com menos esforço e código, e com menores chances de erros.
Framework
Algumas pessoas dizem que o React não é um framework e sim uma biblioteca, porque o react te da ferramentas, mas você é livre pra usá-las como achar melhor.
É bom porque você pode fazer o que quiser
É ruim porque você pode fazer o que quiser!
Framework
MAS, contudo, todavia, entretanto, existem algumas soluções que são consideradas frameworks, como o next.js.
Ele é construído em cima de react.js e a própria página de quick start cita o uso de um framework.
React.js base é perfeitamente capaz de suportar uma aplicação de alta disponibilidade, MAS a arquitetura é por nossa conta.

Porque React?
Aplicações web ricas que precisam ser atualizadas em tempo real e que permita a criação de soluções escaláveis em times de qualquer tamanho.
Componentes
A principal característica do React é permitir a criação de componentes reutilizáveis, como blocos de montar.
Estes componentes podem ser tão atômicos quanto necessário, de linhas e botões, até a páginas inteiras.
Virtual DOM
O que torna o React tão rãpido é o conceito introduzido pela lib, o Virtual DOM.
A árvore do DOM como vimos até agora é lenta demais para atualizações constantes.
Virtual DOM
Como o nome diz, é uma representação da árvore do DOM em memória, que uma vez atualizada é replicada inteira para o DOM final, sendo muito mais rápida porque acaba modificando somente o elemento necessário e não reconstruindo todos os nós.
Montando Ambiente
Node.js
É um motor de tempo de execução JavaScript de código aberto. Ele executa o código JavaScript fora de um navegador.

Node.js
Como eu sei que instalou corretamente?
node --version
npm --version
npx --version
NPM
O NPM (Node Package Manager), é o gerenciador de pacotes do node, e permite baixar e gerenciar bibliotecas javascript.
React é uma delas, mas muitas outras bibliotecas podem ser instaladas através dessa ferramenta.
node_modules

Terminal

Usuários do windão (provavelmente 99,9%), windows terminal é seu amigo, se não tem instalado na sua máquina em casa, instale!
https://apps.microsoft.com/detail/9n0dx20hk701?hl=en-us&gl=BR
Hands On
Hello React.js
npx create-react-app nome-do-seu-projeto
npm start
JSX (WTF!?)
function MyButton() {
return (
<button>I'm a button</button>
);
}export default function MyApp() {
return (
<div>
<h1>Welcome to my app</h1>
<MyButton />
</div>
);
}
JSX
JSX é uma extensão da linguagem JavaScript que é usada pelo React para criar interfaces de usuário.
Ele permite que você misture código JS com sintaxe de HTML, o que torna mais fácil escrever componentes de interface de usuário em um único arquivo de código.
Diferente do Angular, que traz lógica para o HTML, o React traz o HTML pra dentro do JS.
Next.js
Exemplo de código
npm install
npm run dev
Exemplos do que vem a seguir no projeto "next-freestyle" do repositório, MAS é altamente aconselhável fazer junto na aula
Hands On
Hello Next.js
npx create-next-app@13.5.6
npm run dev
Requer Node 16.14.0 no mínimo!
(LTS mais recente está na versão 20)
Hands On
"files.associations": {
"*.css": "tailwindcss"
}
Configurações adicionais se estiver com tailwind:
CTRL + SHIFT + P
workspace settings (JSON)
Estrutura de pastas
/app - rotas componentes e lógica da sua aplicação
/app/globals.css - Configurações CSS globais da sua aplicação
/public: Contêm os assets estáticos da sua aplicação (ex. imagens)
Simple component
import React from 'react';
export default function Simple() {
return (<div> Simples </div>)
}Simple component+
import React, { ReactNode } from 'react';
interface params {
name: string;
age?: number;
}
const SimpleWithParam = (values: params): ReactNode => {
return (<div> {values.name} </div>)
}
export default SimpleWithParam;Simple component++
import React from 'react';
const SimpleWithChildren =
({ children }: // nome do parâmetro
{ children: React.ReactNode }) // tipo do parâmetro
: React.ReactNode => { // retorno da função
return (<div> {children} </div>)
}
export default SimpleWithChildren;Simple component++ (v2)
import React from 'react';
interface params {
children: React.ReactNode
}
const SimpleWithChildren = (values: params)
: React.ReactNode => {
return (<div> {values.children} </div>)
}
export default SimpleWithChildren;Como usa?
import styles from './page.module.css'
import Simple from './components/Simple'
import SimpleWithChildren from './components/SimpleWithChildren'
import SimpleWithParam from './components/SimpleWithParam'
export default function Home() {
return (
<main className={styles.main}>
<Simple />
<SimpleWithChildren>
<h1>Quero café</h1>
</SimpleWithChildren>
<SimpleWithParam name="Takoyaki" />
</main>
)
}
Google Fonts
Fontes são importantes para fortalecer imagem e características para a sua aplicação, e felizmente utilizar fontes customizáveis é bem simples.
Serifas
Elas funcionam para conduzir o texto, guiando os olhos do leitor em um fluxo horizontal.
Durante a leitura, nosso cérebro não decifra letra por letra e sim
palavras ou conjuntos delas, facilitando a leitura.
Medium.com usa serifas para texto contínuo
Sem Serifas
Essas fontes são bastante utilizadas para textos mais curtos e para a criação de peças de design gráfico.
No entanto as interfaces de aplicações tendem a ser mais sucintas e abusam de fontes SEM serifas, muitas vezes adotando a fonte ao layout.
Fonte Primária
import { Poppins } from 'next/font/google'
const poppins = Poppins({ subsets: ['latin'],
variable: '--font-poppins', weight: ['400'] });
return (
<html lang="en">
<body className={poppins.variable}>{children}</body>
</html>
)Layout.jsx
Mais fontes!
import { Lusitana } from 'next/font/google';
export const lusitana = Lusitana({
weight: ['400', '700'],
subsets: ['latin'],
});./ui/fonts.ts
import { lusitana } from './ui/fonts';
<p className={`${lusitana.className} text-3xl text-white`}>
Que ninguém se engane, só se consegue a simplicidade
através de muito trabalho.
</p>
page.tsx
Otimização de Imagens
Arquivos estáticos como imagens podem ser otimizados para responsividade.
Impedir um "flick" conforme o conteúdo é incorporado a página e trazendo carregamendo tardio (lazy-loading) com o Next.js
Otimização de Imagens
Para isso utilizamos o componetne de <Image> no Next.js.
Bônus que ele já é um componente que exige acessibilidade obrigando o atributo alt na tag.
Rotas
Uma facilidade do Next é a resolução natural as rotas de novas páginas, no React vanilla é necessário adicionar uma biblioteca e configurar manualmente
Rotas
Rotas aqui utilizam o contexto de pastas, apenas respeitando a estrutura ela se resolve automagicamente.
Rotas

CSS Modules

Permite a criação de nomes únicos de classes por componentes, adicionando um hash, Isso existe para evitar conflitos.
Next.js tem um suporte nativo a módulos CSS usando a extensão .module.css .
CSS Modules
import styles from './styles.module.css'
export default function DashboardLayout({
children,
}: {
children: React.ReactNode
}) {
return <section className={styles.dashboard}>{children}</section>
}CLSX

Lógica com classes CSS?
Já pensou em aplicar uma classe CSS em situações específicas?
A biblioteca clsx te salva, MAS ela não vem instalada por padrão no Next.js.
Bibliotecas NPM
Algumas coisas mais comuns pra uma aplicação provavelmente já foram resolvidas, então não é necessário reinventar a roda, talvez uma biblioteca NPM resolva seu caso.
Isso vai instalar a biblioteca e as dependências no node_modules e atualizar o package.json e package-lock.json
Hands On
npm install clsx
Componente Status
<div
className={clsx(
'status',
{
'bg-gray-100 text-gray-500': status === 'pending',
'bg-green-500 text-white': status === 'paid',
},
)}
>Como usa?
import Status from './ui/Status';
<div>
<Status status='pending' />
<Status status='paid' />
</div>Tailwind
Tailwind é uma biblioteca incorporada ao Next que traz facilidades em escrever CSS para coisas usuais.
Pode parecer um pouco amendrontador no início mas com o tempo ela fica mais natural de usar.
Funciona junto com o seu CSS customizado, MAS pode ter problemas dependendo da biblioteca externa que você tentar juntar ao projeto.
Responsividade
Existem ferramentas para ajudar na responsividade (conteúdo adequado ao tamanho de tela), uma delas é utilizar media queries do CSS, isso permite que regras CSS sejam aplicadas conforme o tamanho da tela do navegador
Responsividade
@media (min-width: 640px) {
/*
aqui só será aplicado se a tela
tiver 640px ou MENOS
*/
}
@media (min-width:400px) and (max-width:900px) {
/* Não menor que 400px nem maior que 900px */
}Responsividade
Outra ferramenta é usar elementos com
display:flex
display:grid
1-line-css layouts

Material UI
Seguindo a mágica de componentes em React, e se a gente tivesse uma biblioteca de componetnes inteligentes e ricos para podermos utilizar em nossas aplicações?
Alguns componentes, digamos... da google.
Material UI
É um conjunto de componentes que segue os princípios da Google de design, tudo é feito de forma a simular uma representação física, um....material.
Material UI + Tailwind
Material UI tem seu CSS, suas definições, tailwind também, então eles não conversam muito bem...
Então se você vai usar uma estrutura que precisa de uns componentes mais complicados, comece pelo material UI, se a estrutura é mais próxima de uma landing page, é preferível usar o tailwind.
Da pra juntar os dois? até da, mas vai precisar resolver uns conflitos...
Hands On
Quero instalar o Material-UI
npm install @mui/material @emotion/react @emotion/styled
npm install @fontsource/roboto
npm install @mui/icons-material
Avaliação A2!
- Somente frontend (backend vai pra A1)
- React + TS (Next não é obrigatório, mas recomendado)
- Somente GIT! (zipão não vai colar)
- 2 páginas (mínimo)
- Componentes customizados com lógica, igual a quantidate de integrantes (minimo 3)
- Responsivo
- Com controle de estado (Redux/Zustand)
- Com hooks
- O tema que você quiser, defendendo o código durante a apresentação
Exemplos e Templates
React hooks
React tem a sua forma de reagir a coisas que ocorrem na página, incluímos em nossos componentes algumas coisas específicas da biblioteca, chamados hooks
React hooks
Por padrão, hooks são nomeados com o prefixo "use", como useState, useEffect, useMemo, useRouter etc...
useState
useState é um comportamento adicionado aos nosso componentes que guarda... um estado próprio do componente, algo que só ele precisa saber.
useState
const [count, setCount] = useState(0)Variável que guarda o valor
função pra alterar esse valor
chamada do hook + inicialização
useEffect
Essa é a forma de reagir a aplicação, mudança do ciclo de vida do nosso componente (criação, montagem e desmontagem de acordo com o virtualDOM).
É uma função que vai ser chamada e fazer... alguma coisa quando um critério de execução acontecer
useEffect
useEffect(
() => {
// executa o side effect / função
},
// array opcional de critérios para execução
[
// 0 ou mais critérios
]
)useEffect
useEffect(() => {
// Executa toda vez que o componente for
// renderizado (mudou valor,
// desenhou um componente filho etc...)
});
useEffect(() => {
// Executa apenas uma vez
// quando o componente aprece
}, []);
useEffect(() => {
// Executa a primeira vez que renderizar
// E toda vez que "count" mudar de valor
}, [count, count2]);useEffect

No fim só parece aplicar lógica com passos extras! (meme aqui)
Mas agora coloque em perpectiva que chamadas de APIs externas podem acontecer no useEffect
(Ex. apertei um botão para envio de um formulário, eu vou REAGIR a resposta)
Gerenciando estados da aplicação
Lembra da história do facebook com React?
Eles precisavam controlar não só o estado de cada componente, mas o estado da aplicação como um todo, para que cada componente reaja de acordo com as mudanças da aplicação.
Ex. Usuário logado, ele tem permissões a quais telas? qual o tema de cores ele escolheu, claro ou escuro?
Gerenciando estados da aplicação
Além do que, não era incomum componentes precisarem mandar informações para outros componentes, e aí, comofas?
Entrou em pauta o gerenciamento de estados da aplicação, pra não virar um macarrão de componetnes pasasndo informações de forma desorganizada, isso começou com uma tecnologia chamada Redux.
MAS para a sua sorte esse tipo de abordagem evoluiu pra alguns conceitos com uma curva de aprendizado mais amena.
Gerenciando estados da aplicação

Zustand
npm install zustand

Exemplos estão no projeto "hooks-states-api" do repositório
Revisão
next-day-night
Baixem o projeto base, instalem as dependências e vamos incluir estados locais e globais!
next-day-night
Estado Local (por componente)
Cada janela vai exibir um texto se ela está aberta ou fechada e ao clicar no botão isso se atualiza
next-day-night
Se o modo for escuro a cor do fundo da página será: #292c35
Se o modo for claro a cor do fundo da página será: #fff
next-day-night
Se o modo for escuro as janelas vão ter a cor: #0e4a66 e texto #ffff00
Se o modo for claro as janelas vão ter a cor: #0e4aaa e texto #ffffff
Avaliação A2! (AGAIN!)
- Somente frontend (backend vai pra A1)
- React + TS (Next não é obrigatório, mas recomendado)
- Somente GIT! (zipão não vai colar)
- 2 páginas (mínimo)
- Componentes customizados com lógica, igual a quantidate de integrantes (minimo 3)
- Responsivo
- Com controle de estado (Redux/Zustand)
- Com hooks
- O tema que você quiser, defendendo o código durante a apresentação
Web Avançado 2
By Chrysthian Simão
Web Avançado 2
- 621