ReactJs

React.JS

O React é uma biblioteca de Javascript que facilita a criação de UIs interativas. Desenvolvido pelo Facebook com lançamento em 2013, tem vindo a ser um dos destaques mais influentes do mercado atual.O maior destaque do React é que a criação de componentes é tão simples como escrever uma função de Javascript, este também atualiza e renderiza de forma eficiente somente os componentes desejados.

JSX & DataFlow

Esta lib é escrita em .jsx, uma extensão de sintaxe do Javascript. Esta é a junção do JS e XML. É basicamente a renderização do Javascript, mas com a estrutura do XML. O React é então compilado para dentro do React.CreateElement o que basicamente mostra que o React Esta a criar elementos por debaixo dos panos.O data flow é uni-direcional, como o React tem uma relação de componentes pai para filho, passamos os dados de cima para baixo, isto através de props.

States

O React faz uso de states internos, neste caso o useState, este retorna um valor e uma função para atualizar o mesmo, counter → Read e setCounter → Write. Ao ser utilizado o counter vai sempre mostrar o seu valor mais recente e sempre que o botão for clicado o react vai reagir a esse evento.
1function App() {
2const [counter, setCounter] = useState(0);
3  return (
4    <>
5	  <p>{counter}</p>
6      <button onClick={() => setCounter(counter + 1)}>Click Me</button>
7    </>
8  );
9}

Event Loop

Neste contexto o Event Loop é responsável por gerenciar as atualizações da UI de forma eficiente. Quando uma ação é disparada, como o clique do botão, o React adiciona a tarefa de atualização à fila de eventos e aguarda a sua vez na fila para ser executada.Isso permite que outras tarefas importantes, como a renderização da interface, sejam realizadas sem serem interrompidas. Por fim o valor do counter vai ser rescrito, logo vai ser dispoletado um re-render desse estado e mostrado o valor mais atual do mesmo na DOM.

Virtual DOM

Esta é a reconstrução virtual da aplicação que é então comparada com o estado real da mesma e onde vai ser somente atualizada a parte que foi alterada, acelerando assim qualquer alteração na aplicação.Este processo de reconstrução somente da parte alterada é conhecido como uma renderização.

Garbage Collector

O Garbage Collector é uma característica do React que se encarrega de libertar memória de componentes que já não são necessários. Ele identifica componentes que foram descartados e remove as suas referências da memória, o que evita o acúmulo de "lixo" e otimiza o desempenho da aplicação.

Vantagens

A curva de aprendizagem do React em comparação a outras frameworks é muito menor, isto deve-se ao facto da sintaxe do React ser clara e fácil de interpretar, para além da questão da performance ser muito mais eficiente que qualquer um dos concorrentes.O React conta também com uma grande comunidade open source para qualquer problema encontrado na fase de desenvolvimento. É também muito mais simples a transição para o ReactNative. Outra grande vantagem da utilização do React é a facilidade de transição para o ReactNative que nos permite começar a construir aplicações mobile.

Stack T3

Esta stack foi desenvolvida pelo Theo um Ex-desenvolvedor da Twitch e atual CEO da Ping.gg, criador de conteúdo, bastante conhecido por diversos posts na plataforma X (Twitter) e Youtube.
A “T3 Stack” é uma stack de desenvolvimento web, que nada mais é que a combinação de linguagens de programação, frameworks, librarias e ferramentas para facilitar o desenvolvimento e deploy de software. O objetivo da T3 é ser modular e typesafe sem comprometer a aplicação todas as ferramentas da stack são pensadas de modo a resolverem algum tipo de problema.Esta tem como peças core o Next.Js, Typescript e Tailwind CSS, estas 3 ferramentas são quase sempre incluidas em todos os projetos, já em certos casos em que esteja a ser desenvolvido algum tipo de backend a stack ainda conta com tRPC, Prisma e NextAuth.js.

Instalação

Para a inicialização de um projeto utilizando a stack T3 é tão simples como correr o seguinte comando em um terminal, Vão ser lançadas algumas questões para melhorar a customização como: nome, type safety, packages, repositório, alias.
1npm create t3-app@latest

NextJs

Next.Js

O Next.js é um framework popular do React que facilita a construção de aplicações web rápidas e prontas para produção. Esta oferece várias funcionalidades e otimizações prontas para uso, como renderização do lado do servidor, divisão automática de código e navegação fácil do lado do cliente.É utilizado por algumas das maiores empresas do mundo, esta ferramenta permite a criação de aplicações full-stack. Usa “blocos de construção” para agilizar a criação de aplicações web. Esta framework pode ser utilizada para desenvolvimento individual ou ser escalado numa grande equipa.

Server-side Rendering

A Renderização do Lado do Servidor (SSR), permite que se renderize componentes React do lado do servidor. Isto melhora o desempenho do carregamento inicial da página e é benéfico para o Otimização para motores de busca (SEO).

Divisão Automática de Código

O Next.js divide automaticamente o código JavaScript em partes menores. Isso reduz a carga inicial e melhora o desempenho da aplicação.

Components

O Next.js fornece vários componentes para facilitar o desenvolvimento da aplicação.O component Link do Next por exemplo facilita a navegação do lado do cliente, tornando a construção e a navegação entre páginas mais fáceis.
1<Link href="/" className="flex w-full items-center gap-6 p-2 md:w-auto">
2  <Image src={images.itsector} width={32} height={32} alt="itsector_logo" />
3  <span className="text-2xl font-bold text-white">{resources.title}</span>
4</Link>

Geração de Site Estático

Podem-se gerar arquivos HTML estáticos no momento da construção para partes da aplicação, o que é excelente para sites orientados por conteúdo.

API Routes

O Next.js facilita a criação de rotas de API, que podem ser usadas para funções serverless ou para encontrar dados dentro da aplicação.

Routing

O Next.js utiliza um sistema de roteamento baseado em arquivos, onde arquivos e pastas no diretório de páginas determinam as rotas na aplicação.

Suporte Integrado para CSS

A framework conta também com suporte integrado para CSS-in-JS com styled-components ou mesmo com a importação de arquivos CSS e SCSS para a estilização da aplicação.

Configuração Zero

O Next.js é opinativo e vem com padrões sensatos, porém qualquer funcionalidade da framework pode ser configurada para se enquadrar melhor no objetivo pretendido durante o tempo de desenvolvimento de determina aplicação.

Criação de uma página Web

Já para o desenvolvimento de uma página web com o uso dos componentes disponibilizados pelo next podemos seguir este exemplo.
1// pages/index.js
2import Link from 'next/link'
3
4function Home(){
5  return (
6    <div>
7      <h1>Welcome to Next.js</h1>
8      <Link href="/about">
9        <a>About</a>
10      </Link>
11    </div>
12  )
13}

Typescript

Typescript

O Javascript é uma terra sem grandes regras, podemos referenciar variáveis que não existem ou até mesmo trabalhar com objetos sem forma definida, o código é então interpretado por um browser, mas caso exista algum erro só vai ser descoberto quando a aplicação estiver a correr, o Typescript previne estes erros de sequer acontecerem estendendo o Javascript com tipagens.Tipagens estas que fazem parte do superset que é um conjunto de ferramentas montado em cima do Javascript onde são devolvidas tipagens estáticas, parâmetros e retornos.
1//Javascript 👎
2randomObj.random() 
3
4IDE ->5RUN -> ⛔️ Uncaught ReferenceError: randomObj is not defined at X:2:1
6
7//Typescript 👍
8randomObj.random() 
9
10IDE -> ⛔️ Cannot find name "randomObj". ts(2304)
11RUN -> ⛔️ Cannot find name "randomObj". ts(2304)

Configuração

O Typescript permite também, através do ficheiro tsconfig, criar uma experiência única de utilização para cada projeto e desenvolvedor modificando as regras de utilização do mesmo.Uma das funcionalidades principais do Typescript é a tipagem estática que conta com explicit e implicit types.
1//Explicit Type
2let name: string;
3
4//Implicit Type
5let surname = "Gonçalves"

Utilização do Typescript

Neste pequeno exemplo podemos ver a diferença de dois componentes onde um tem acesso a tipagem definida por nós e algumas props são marcadas como sendo obrigatórias.
1import {ComponentProps} from "react"
2
3type ButtonProps = {
4    name:string // example
5} & ComponentProps<'button'>
6
7export const ButtonWithProps = ({name, children, ...props}:ButtonProps) => {
8    return <button data-name={name} {...props}>{children ?? "Button with props"}</button>
9}
10
11export const ButtonWithoutProps = () => {
12    return <button>Button without props</button>
13}

TailwindCSS

TailwindCSS

O TailwindCSS é uma framework de design para criação de UI responsivas e modernas para projetos web. Ao contrário do Bootstrap que oferece componentes, este fornece classes utilitárias de baixo nível que podem ser aplicadas diretamente aos elementos HTML.Classes estas que cobrem desde espaçamento e tipografia até cores e posicionamento, desta forma, estilizar o conteúdo é muito mais eficiente e flexível.

Classes Utilitárias

Como referido anteriormente a framework oferece uma variedade de classes utilitárias que podem ser aplicadas diretamente aos elementos HTML.
1<h2 className="bg-gradient-to-r from-white to-lightgrey bg-clip-text text-4xl font-bold text-transparent">
2Classes Utilitárias
3</h2>

Responsividade

A framework possui classes responsivas que permitem ajustar a estilização dependentemente do tamanho do ecrã no qual a aplicação esta a ser renderizada.
1<div className="flex items-center gap-10 until-md:flex-col">{...children}</div>

Plugins

O Tailwind CSS possui um rico ecossistema de plugins e extensões que podem ser adicionados para melhorar a sua funcionalidade. Por exemplo, o plugin oficial Tailwind CSS Typography fornece um conjunto de classes relacionadas à tipografia..Existem diversos plugins criados pela comunidade que adicionam recursos extras, como estilos de terceiros e animações, para usar um plugin, bastante fazer a instalação do mesmo e adiciona-lo ao ficheiro tailwind.config.js na secção de plugins.

Bibliotecas de Componentes

Embora o Tailwind CSS não ofereça componentes prontos a utilizar, é possível usar algumas bibliotecas de componentes como o TailwindUI ou a DaisyUI.

Configuração

O Tailwind é altamente configurável. Os desenvolvedores podem personalizar as classes já existentes ou estender os seus próprios estilos para facilitar no desenvolvimento da aplicação.
1import { type Config } from "tailwindcss";
2
3export default {
4  content: ["./src/**/*.{js,ts,jsx,tsx}"],
5  theme: {
6    extend: {
7      colors: {
8        blue: "#4165FF",
9        purple: "#7241FF",
10        darkblue: "#182542",
11      },},},
12
13  plugins: [
14    // eslint-disable-next-line
15    require("tailwindcss-accent")({
16      colors: ["violet", "blue", "orange"],
17      root: "violet",
18    }),],} 
19    satisfies Config;

Prisma

Prisma

O Prisma é uma camada moderna para aceder e manipular dados de uma base de dados. Este Object-Relational Mapping (ORM) simplifica a interação com as base de dados das aplicações web e mobile. O prisma é projetado para ser usado com o Javascript e Typescript.Este é uma escolha popular entre desenvolvedores para trabalhar com base de dados relacionais de forma eficiente e segura.

Type-Safe Queries

O Prisma gera tipagens automaticamente com base no seu modelo de base de dados, isto signafica que o desenvolvimento da base de dados é feita de forma segura e sem erros de tipos.

Database Agnostic

O Prisma suporta diferentes tipos de base de dados, como PostgreSQL, MySQL, SQLite e SQL Server, etc. Isto permite a troca de base de dados sem a necessidade do código da aplicação ser rescrito na totalidade.

Migrações de Base de Dados

O Prisma fornece uma ferramenta de migração que facilita a criação e aplicação de migrações de base de dados para atualizar o schema da base de dados de forma controlada.

Relações e Modelos

É possível definir modelos da base de dados e as suas relações de forma clara e intuitiva no Prisma, com esta facilidade a modelagem de dados e a navegação entre tabelas acaba por se tornar muito mais intuitiva.

Queries e Mutações

O Prisma facilita também na criação de consultas e mutações, recorrendo a uma sintaxe amigável e clara. Este suporta também inúmeras operações avançadas como filtragem, ordenação e paginação.

Segurança

O Prisma ajuda a proteger contra ataques de injeção de SQL, pois gera consultas parametrizadas e evita a concatenação de strings para formar consultas SQL.

Integração com Frameworks

O Prisma é frequentemente usado com frameworks populares, como Express.js, Next.js, e NestJS, tornando-o uma escolha popular para desenvolvimento web.

Ecossistema

O Prisma possui uma comunidade ativa e uma variedade de plugins e extensões para melhorar o fluxo de trabalho e suporte para diferentes cenários durante a fase de desenvolvimento.

NextAuth

NextAuthJs

NextAuth.js é uma biblioteca de autenticação open source para o Next.Js. Esta simplifica a implementação de autenticação nas aplicações, fornecendo um conjunto de utilitários e um fluxo de autenticação flexível.Suporta vários providers de autenticação, incluindo OAuth, JWT e outros, que facilitam a integração com logins sociais, providers de identidade externos ou com o próprio sistema de autenticação personalizado.

Instalação

Podemos usar vários providers de autenticação, como o Google, Facebook, GitHub, etc. Para configurar um provider, precisamos de obter os IDs de cliente e segredos do serviço respetivo e adicioná-los às variáveis de ambiente.Para começar, precisamos de instalar a biblioteca NextAuth.js em um projeto Next.js. Para tal podemos fazer isso com o seguinte comando:.
1npm i next-auth
2# or
3yarn add next-auth

Configuração

O NextAuth.js requer configuração no projeto Next.js. Cria-se um arquivo chamado next-auth.js na raiz do projeto para definir provedores de autenticação e opções. Aqui está um exemplo de configuração simples:.
1import NextAuth from "next-auth"
2import Providers from "next-auth/providers"
3
4export default NextAuth({
5  providers: [
6    Providers.Google({
7      clientId: process.env.GOOGLE_CLIENT_ID,
8      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
9    }),
10    // Additional authentication providers if needed
11  ],
12  // Other Configuration options
13})

Custom Provider

O NextAuth.js também suporta autenticação personalizada. Pode-se implementar uma lógica própria de autenticação ao utilizar um provider personalizado.
1import { CustomProvider } from "next-auth/providers"
2
3const options = {
4  credentials: {
5    username: { label: "Username", type: "text" },
6    password: { label: "Password", type : "password" }
7  },
8  async authorize(credentials) {
9    // Add your authentication logic here
10    const user = { id: 1, name: "Humberto" }
11    user ? Promise.resolve(user) : Promise.resolve(null)
12  }
13}
14
15export default CustomProvider(options)

Proteção de Rotas

Para proteger rotas ou páginas específicas, usamos o middleware de autenticação integrado do NextAuth.js. Por exemplo, em rotas API.
1import { getSession } from "next-auth/react"
2
3export default async (req, res) => {
4  const session = await getSession({ req })
5
6  if(session){
7    // User is authenticated
8  } else {
9    // User is not authenticated
10  }
11}

Informação do User

Com a utilização do NextAuth.Js é possivel e de maneira simples ter acesso às informações do usuário e aos dados da sessão nas páginas Next.Js.
1import { getSession } from "next-auth/react"
2
3function MyPage() {
4  const { data: session } = useSession()
5
6  return (
7    <div>
8    {session ? (
9      <p>Welcome, {session.user.name}</p>
10    ): (
11      <p>You are not logged in</p>
12    )}
13    </div>
14  )
15}
16

tRPC

tRPC

O tRPC é uma biblioteca de código aberto para construir APIs em Node.js e JavaScript. O nome tRPC significa Typescript Remote Procedure Call.Esta biblioteca foi projetada para simplificar o desenvolvimento de APIs em aplicações React com TypeScript.

Tipagem Forte

O tRPC utiliza tipagem forte por meio do TypeScript. Isso significa que os tipos de dados são verificados em tempo de compilação, ajudando a evitar erros comuns durante o desenvolvimento.

Integração com React

O tRPC é especialmente voltado para aplicações React. Ele oferece um conjunto de hooks personalizados que facilitam a integração das suas APIs com componentes React.

Autenticação e Autorização

O tRPC suporta autenticação e autorização de maneira flexível. É possível definir políticas de acesso para controlar quem pode acessar cada endpoint.

Validação de Dados

Este oferece suporte à validação de dados que entram e saem, garantindo assim que os estes estejam corretos e seguros.

Documentação Automática

O tRPC gera automaticamente documentação, facilitando assim a integração e entendimento de qualquer desenvolvedor de como utiliza-la.

Performance

O tRPC é projetado para ser eficiente em termos de desempenho, minimizando uses desnecessários e otimizando consultas.