Chrysthian Simão
Construir Soluções Web
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
Não tem uma conta? hora de fazer uma
Agora!
Já!
Nesse instante!
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.
Como eu sei que instalou corretamente?
git --versionA 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.
Configurando usuário global
$ git config --global user.name "Fulano de Tal"
$ git config --global user.email fulanodetal@exemplo.brPara 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.
git clone https://github.com/chrysthian/up.gitComo 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 pullgit pull (só que menor)
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).
É 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
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 é uma ação LOCAL!
O repositório ainda não sabe das suas alterações!!!
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.
Aqui entra o push, você "empurra" o código para o repositório.
git pull
git add .
git commit -m"mensagem curta sobre as alterações"
git pushVS 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
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
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
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.
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
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.
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.
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.
Existem outros esquemas, tais como: https, FTP, mailto.
Tudo que vier depois de "://" é específico do protocolo que estiver sendo utilizado.
https://slides.com/chrysthian/
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.
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
https://slides.com/chrysthian/
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
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.
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.
https://slides.com/chrysthian/
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.
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
http://localhost:3000
Ctrl+Shift+J (Edge)
F12 (Chrome, Firefox)
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)
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.
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.
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!
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.
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.
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.
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.
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.
É um motor de tempo de execução JavaScript de código aberto. Ele executa o código JavaScript fora de um navegador.
Como eu sei que instalou corretamente?
node --version
npm --version
npx --versionO 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.
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
Hello React.js
npx create-react-app nome-do-seu-projeto
npm startfunction MyButton() {
return (
<button>I'm a button</button>
);
}export default function MyApp() {
return (
<div>
<h1>Welcome to my app</h1>
<MyButton />
</div>
);
}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.
npm install
npm run devExemplos do que vem a seguir no projeto "next-freestyle" do repositório, MAS é altamente aconselhável fazer junto na aula
Hello Next.js
npx create-next-app@13.5.6
npm run devRequer Node 16.14.0 no mínimo!
(LTS mais recente está na versão 20)
"files.associations": {
"*.css": "tailwindcss"
}Configurações adicionais se estiver com tailwind:
CTRL + SHIFT + P
workspace settings (JSON)
/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)
import React from 'react';
export default function Simple() {
return (<div> Simples </div>)
}import React, { ReactNode } from 'react';
interface params {
name: string;
age?: number;
}
const SimpleWithParam = (values: params): ReactNode => {
return (<div> {values.name} </div>)
}
export default SimpleWithParam;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;import React from 'react';
interface params {
children: React.ReactNode
}
const SimpleWithChildren = (values: params)
: React.ReactNode => {
return (<div> {values.children} </div>)
}
export default SimpleWithChildren;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>
)
}
Fontes são importantes para fortalecer imagem e características para a sua aplicação, e felizmente utilizar fontes customizáveis é bem simples.
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
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.
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
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
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
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.
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 aqui utilizam o contexto de pastas, apenas respeitando a estrutura ela se resolve automagicamente.
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 .
import styles from './styles.module.css'
export default function DashboardLayout({
children,
}: {
children: React.ReactNode
}) {
return <section className={styles.dashboard}>{children}</section>
}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.
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
npm install clsx<div
className={clsx(
'status',
{
'bg-gray-100 text-gray-500': status === 'pending',
'bg-green-500 text-white': status === 'paid',
},
)}
>import Status from './ui/Status';
<div>
<Status status='pending' />
<Status status='paid' />
</div>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.
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
@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 */
}Outra ferramenta é usar elementos com
display:flex
display:grid
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.
É 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 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...
Quero instalar o Material-UI
npm install @mui/material @emotion/react @emotion/styled
npm install @fontsource/roboto
npm install @mui/icons-materialReact 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
Por padrão, hooks são nomeados com o prefixo "use", como useState, useEffect, useMemo, useRouter etc...
useState é um comportamento adicionado aos nosso componentes que guarda... um estado próprio do componente, algo que só ele precisa saber.
const [count, setCount] = useState(0)Variável que guarda o valor
função pra alterar esse valor
chamada do hook + inicialização
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(
() => {
// executa o side effect / função
},
// array opcional de critérios para execução
[
// 0 ou mais critérios
]
)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]);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)
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?
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.
npm install zustandExemplos estão no projeto "hooks-states-api" do repositório
Baixem o projeto base, instalem as dependências e vamos incluir estados locais e globais!
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
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
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