Skip to content

Detalhes da Stack Tecnológica ​

As aplicações geradas pelo AI App Factory utilizam uma stack tecnológica comprovada e pronta para produção, focada em desenvolvimento rápido de MVP e escalabilidade futura. Este documento explica detalhadamente cada escolha tecnológica e seus cenários de uso.


O que você poderá fazer após concluir ​

  • Compreender o racional por trás das escolhas tecnológicas das aplicações geradas
  • Dominar as ferramentas e frameworks essenciais da stack de frontend e backend
  • Entender por que estas tecnologias foram escolhidas em vez de outras alternativas
  • Saber como ajustar as configurações técnicas de acordo com as necessidades do projeto

Visão Geral das Tecnologias Principais ​

As aplicações geradas adotam uma solução Full-Stack TypeScript, garantindo segurança de tipos e consistência na experiência de desenvolvimento entre frontend e backend.

CamadaTecnologiaVersãoFinalidade
Runtime BackendNode.js16+Ambiente de execução JavaScript no servidor
Linguagem BackendTypeScript5+Superconjunto JavaScript com tipagem segura
Framework BackendExpress4.xFramework web leve para construção de APIs RESTful
ORMPrisma5.xCamada de acesso a dados com segurança de tipos
Banco DesenvolvimentoSQLite-Banco de dados sem necessidade de configuração, ideal para protótipos rápidos
Banco ProduçãoPostgreSQL-Banco de dados relacional para ambiente de produção
Framework FrontendReact Native-Desenvolvimento de aplicativos móveis multiplataforma
Ferramentas FrontendExpo-Ferramentas de desenvolvimento e build para React Native
Navegação FrontendReact Navigation6+Experiência de navegação nativa
Gerenciamento EstadoReact Context API-Gerenciamento de estado leve (fase MVP)
Cliente HTTPAxios-Cliente HTTP para browser e Node.js

Detalhes da Stack Backend ​

Node.js + TypeScript ​

Por que escolher Node.js?

  • ✅ Ecossistema Rico: npm possui o maior ecossistema de pacotes global
  • ✅ Unificação Frontend-Backend: a equipe precisa dominar apenas uma linguagem
  • ✅ Alta Produtividade: event-driven e I/O não-bloqueante ideal para aplicações em tempo real
  • ✅ Comunidade Ativa: grande quantidade de bibliotecas open source e soluções

Por que escolher TypeScript?

  • ✅ Segurança de Tipos: captura erros em tempo de compilação, reduzindo bugs em runtime
  • ✅ Excelente DX: IntelliSense, autocompletar, suporte a refatoração
  • ✅ Código Manutenível: interfaces explícitas melhoram a eficiência da colaboração em equipe
  • ✅ Integração Perfeita com Prisma: geração automática de definições de tipos

Exemplo de Configuração:

json
// tsconfig.json
{
  "compilerOptions": {
    "strict": true,
    "target": "ES2020",
    "module": "commonjs",
    "esModuleInterop": true,
    "skipLibCheck": true
  }
}

Framework Express ​

Por que escolher Express?

  • ✅ Maduro e Estável: framework web Node.js mais popular
  • ✅ Middleware Rico: autenticação, logs, CORS, etc. prontos para uso
  • ✅ Alta Flexibilidade: não impõe estrutura de projeto, organização livre
  • ✅ Excelente Suporte da Comunidade: abundância de tutoriais e soluções para problemas

Estrutura Típica de Projeto:

src/
├── config/         # Arquivos de configuração
│   ├── swagger.ts  # Configuração da documentação Swagger API
│   └── index.ts    # Configuração da aplicação
├── lib/            # Bibliotecas utilitárias
│   ├── logger.ts   # Ferramenta de logging
│   └── prisma.ts   # Singleton Prisma
├── middleware/     # Middlewares
│   ├── errorHandler.ts
│   └── requestLogger.ts
├── routes/         # Definições de rotas
│   ├── items.ts
│   └── index.ts
├── controllers/    # Camada de controllers
│   ├── items.controller.ts
│   └── index.ts
├── services/       # Camada de lógica de negócio
│   └── items.service.ts
├── validators/     # Validação de entrada
│   └── items.validator.ts
├── __tests__/      # Arquivos de teste
│   └── items.test.ts
├── app.ts          # Aplicação Express
└── index.ts        # Ponto de entrada da aplicação

Middlewares Principais:

typescript
import express from 'express';
import cors from 'cors';
import helmet from 'helmet';
import compression from 'compression';
import { requestLogger } from './middleware/requestLogger';
import { errorHandler } from './middleware/errorHandler';

const app = express();

// Middlewares de segurança
app.use(helmet());                          // Headers de segurança
app.use(cors(corsOptions));                 // Configuração CORS

// Middlewares de processamento de requisições
app.use(express.json());                    // Parsing JSON
app.use(compression());                     // Compressão de resposta
app.use(requestLogger);                    // Logging de requisições

// Middleware de tratamento de erros (por último)
app.use(errorHandler);

export default app;

Prisma ORM ​

Por que escolher Prisma?

  • ✅ Segurança de Tipos: geração automática de definições de tipos TypeScript
  • ✅ Gerenciamento de Migrações: schema declarativo, geração automática de scripts de migração
  • ✅ Excelente DX: suporte IntelliSense, mensagens de erro claras
  • ✅ Suporte a Múltiplos Bancos: SQLite, PostgreSQL, MySQL, etc.
  • ✅ Performance Excelente: otimização de queries, gerenciamento de pool de conexões

Exemplo Típico de Schema:

prisma
// prisma/schema.prisma

datasource db {
  provider = "sqlite"           // Ambiente de desenvolvimento
  // provider = "postgresql"   // Ambiente de produção
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model Item {
  id          Int      @id @default(autoincrement())
  title       String
  description String?
  amount      Float
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  @@index([createdAt])  // Criação manual de índice para ordenação
}

Operações Comuns de Banco de Dados:

typescript
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

// Criar
const item = await prisma.item.create({
  data: { title: 'Almoço', amount: 25.5 }
});

// Consultar (suporta paginação)
const items = await prisma.item.findMany({
  take: 20,       // Limitar quantidade
  skip: 0,        // Offset
  orderBy: { createdAt: 'desc' }
});

// Atualizar
const updated = await prisma.item.update({
  where: { id: 1 },
  data: { title: 'Jantar' }
});

// Deletar
await prisma.item.delete({
  where: { id: 1 }
});

Escolha do Banco de Dados ​

Ambiente de Desenvolvimento: SQLite

  • ✅ Zero Configuração: banco de dados em arquivo, sem necessidade de instalar serviço
  • ✅ Inicialização Rápida: ideal para desenvolvimento local e iteração rápida
  • ✅ Portabilidade: todo o banco de dados é um único arquivo .db
  • ❌ Sem Suporte a Escrita Concorrente: múltiplos processos escrevendo simultaneamente causam conflitos
  • ❌ Não Adequado para Produção: performance e capacidade de concorrência limitadas

Ambiente de Produção: PostgreSQL

  • ✅ Funcionalidade Completa: suporte a queries complexas, transações, tipo JSON
  • ✅ Excelente Performance: suporte a alta concorrência, índices complexos
  • ✅ Estável e Confiável: banco de dados enterprise, testado e comprovado
  • ✅ Ecossistema Maduro: ferramentas abundantes de backup e monitoramento

Estratégia de Migração de Banco de Dados:

bash
# Ambiente de Desenvolvimento - Usar SQLite
DATABASE_URL="file:./dev.db"

# Ambiente de Produção - Usar PostgreSQL
DATABASE_URL="postgresql://user:password@host:5432/database"

# Criar migração
npx prisma migrate dev --name add_item_category

# Deploy em Produção
npx prisma migrate deploy

# Resetar Banco de Dados (Ambiente de Desenvolvimento)
npx prisma migrate reset

Detalhes da Stack Frontend ​

React Native + Expo ​

Por que escolher React Native?

  • ✅ Multiplataforma: um único código rodando em iOS e Android
  • ✅ Performance Nativa: compilado para componentes nativos, não WebView
  • ✅ Hot Updates: Expo suporta atualizações sem necessidade de republicação
  • ✅ Componentes Ricos: comunidade fornece grande quantidade de componentes de alta qualidade

Por que escolher Expo?

  • ✅ Inicialização Rápida: sem necessidade de configurar complexos ambientes de desenvolvimento nativo
  • ✅ Ferramentas Unificadas: processos unificados de desenvolvimento, build e deploy
  • ✅ Expo Go: escaneie o QR code para visualizar no dispositivo real instantaneamente
  • ✅ EAS Build: build em nuvem, suporte a publicação na App Store

Estrutura do Projeto:

src/
├── api/           # Chamadas de API
│   ├── client.ts  # Instância Axios
│   └── items.ts   # Items API
├── components/    # Componentes reutilizáveis
│   └── ui/        # Componentes UI básicos
│       ├── Button.tsx
│       ├── Input.tsx
│       └── Card.tsx
├── hooks/         # Hooks customizados
│   ├── useItems.ts
│   └── useAsync.ts
├── navigation/    # Configuração de navegação
│   └── RootNavigator.tsx
├── screens/       # Componentes de página
│   ├── HomeScreen.tsx
│   ├── DetailScreen.tsx
│   └── __tests__/
├── styles/        # Estilos e temas
│   └── theme.ts
└── types/         # Tipos TypeScript
    └── index.ts

Exemplo de Página Típica:

typescript
import React from 'react';
import { View, Text, FlatList, StyleSheet } from 'react-native';
import { useItems } from '@/hooks/useItems';
import { Card } from '@/components/ui/Card';
import { LoadingIndicator } from '@/components/ui/LoadingIndicator';

export function HomeScreen() {
  const { data, loading, error, refresh } = useItems();

  if (loading) {
    return <LoadingIndicator />;
  }

  if (error) {
    return <Text>Falha ao carregar: {error.message}</Text>;
  }

  return (
    <View style={styles.container}>
      <FlatList
        data={data}
        keyExtractor={(item) => item.id.toString()}
        renderItem={({ item }) => (
          <Card title={item.title} description={item.description} />
        )}
        refreshing={loading}
        onRefresh={refresh}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
  },
});

React Navigation ​

Por que escolher React Navigation?

  • ✅ Recomendação Oficial: solução de navegação oficial do React Native
  • ✅ Segurança de Tipos: TypeScript suporta tipos completos de parâmetros de navegação
  • ✅ Experiência Nativa: fornece modos de navegação nativos como stack navigation e tab navigation
  • ✅ Deep Linking: suporte a URL Scheme e deep linking

Exemplo de Configuração de Navegação:

typescript
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

// Definir tipos de parâmetros de navegação
export type RootStackParamList = {
  Home: undefined;
  Detail: { itemId: number };
};

const Stack = createStackNavigator<RootStackParamList>();

export function RootNavigator() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen
          name="Home"
          component={HomeScreen}
          options={{ title: 'Início' }}
        />
        <Stack.Screen
          name="Detail"
          component={DetailScreen}
          options={({ route }) => ({ title: `Detalhes ${route.params.itemId}` })}
        />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

Gerenciamento de Estado ​

React Context API (Fase MVP)

Adequado para aplicações simples, sem dependências:

typescript
import React, { createContext, useContext, useState } from 'react';

interface ItemsContextType {
  items: Item[];
  addItem: (item: Omit<Item, 'id'>) => void;
}

const ItemsContext = createContext<ItemsContextType | undefined>(undefined);

export function ItemsProvider({ children }) {
  const [items, setItems] = useState<Item[]>([]);

  const addItem = (item: Omit<Item, 'id'>) => {
    setItems([...items, { ...item, id: Date.now() }]);
  };

  return (
    <ItemsContext.Provider value={{ items, addItem }}>
      {children}
    </ItemsContext.Provider>
  );
}

export function useItems() {
  const context = useContext(ItemsContext);
  if (!context) {
    throw new Error('useItems deve ser usado dentro de ItemsProvider');
  }
  return context;
}

Zustand (Aplicações de Complexidade Média)

Biblioteca de gerenciamento de estado leve, com API simples:

typescript
import { create } from 'zustand';
import { devtools, persist } from 'zustand/middleware';

interface ItemsStore {
  items: Item[];
  addItem: (item: Omit<Item, 'id'>) => void;
  removeItem: (id: number) => void;
}

export const useItemsStore = create<ItemsStore>()(
  devtools(
    persist(
      (set) => ({
        items: [],
        addItem: (item) =>
          set((state) => ({
            items: [...state.items, { ...item, id: Date.now() }]
          })),
        removeItem: (id) =>
          set((state) => ({
            items: state.items.filter((item) => item.id !== id)
          })),
      }),
      { name: 'items-storage' } // Persistir no AsyncStorage
    )
  )
);

Ferramentas de Desenvolvimento ​

Frameworks de Teste ​

Backend: Vitest

typescript
// src/__tests__/items.test.ts
import { describe, it, expect } from 'vitest';
import request from 'supertest';
import app from '../app';

describe('Items API', () => {
  it('deve retornar lista de items', async () => {
    const res = await request(app).get('/api/items');
    expect(res.status).toBe(200);
    expect(Array.isArray(res.body.data)).toBe(true);
  });
});

Frontend: Jest + React Native Testing Library

typescript
// src/screens/__tests__/HomeScreen.test.tsx
import { render } from '@testing-library/react-native';
import HomeScreen from '../HomeScreen';

describe('HomeScreen', () => {
  it('deve renderizar sem erros', () => {
    render(<HomeScreen />);
  });

  it('deve mostrar estado de carregamento inicialmente', () => {
    const { getByTestId } = render(<HomeScreen />);
    expect(getByTestId('loading-indicator')).toBeTruthy();
  });
});

Documentação de API: Swagger/OpenAPI ​

As aplicações geradas incluem automaticamente Swagger UI, acessível em http://localhost:3000/api-docs.

typescript
import swaggerJsdoc from 'swagger-jsdoc';

const options = {
  definition: {
    openapi: '3.0.0',
    info: {
      title: 'Documentação da API',
      version: '1.0.0',
    },
  },
  apis: ['./src/routes/*.ts'], // Escanear comentários nas rotas
};

export const swaggerSpec = swaggerJsdoc(options);

Logging e Monitoramento ​

Backend Logging: winston

typescript
import winston from 'winston';

export const logger = winston.createLogger({
  level: process.env.LOG_LEVEL || 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.Console(),
  ],
});

// Exemplo de uso
logger.info('Item criado', { itemId: 1 });
logger.error('Falha ao criar item', { error: 'Erro no banco de dados' });

Frontend Monitoramento: Registra tempo de resposta de requisições de API, erros e métricas de performance.


Ferramentas de Deployment ​

Docker + docker-compose ​

As aplicações geradas incluem Dockerfile e docker-compose.yml, suportando deployment containerizado.

Exemplo docker-compose.yml:

yaml
version: '3.8'

services:
  postgres:
    image: postgres:15
    environment:
      POSTGRES_DB: appdb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"

  backend:
    build: ./backend
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://user:password@postgres:5432/appdb
    depends_on:
      - postgres

CI/CD: GitHub Actions ​

Automação de testes, build e deployment:

yaml
name: CI/CD

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
      - run: npm ci
      - run: npm test
      - run: npm run build

Princípios da Seleção da Stack ​

Os princípios fundamentais do AI App Factory na seleção desta stack tecnológica:

1. Simplicidade em Primeiro Lugar ​

  • Escolher tecnologias maduras e estáveis para reduzir curva de aprendizado
  • Evitar over-engineering, focar nas funcionalidades principais
  • Inicialização sem configuração, validação rápida de ideias

2. Segurança de Tipos ​

  • TypeScript unificado em frontend e backend
  • Prisma gera tipos de banco de dados automaticamente
  • React Navigation com parâmetros de navegação tipados de forma segura

3. Pronto para Produção ​

  • Cobertura completa de testes
  • Configurações de deployment fornecidas (Docker, CI/CD)
  • Logging, monitoramento e tratamento de erros completos

4. Escalabilidade ​

  • Pontos de extensão reservados (cache, message queue)
  • Suporte a migração de banco de dados (SQLite → PostgreSQL)
  • Arquitetura modular, facilita divisão e refatoração

5. Foco em MVP ​

  • Definição clara do que não está no escopo, não introduzir funcionalidades não-core como autenticação e autorização
  • Limite de número de páginas (máximo 3)
  • Entrega rápida, iterações subsequentes

Perguntas Frequentes ​

P: Por que não usar NestJS? ​

R: NestJS é um excelente framework, mas excessivamente complexo para fase MVP. Express é mais leve e flexível, ideal para protótipos rápidos. Se a escala do projeto crescer no futuro, migração para NestJS pode ser considerada.

P: Por que não usar MongoDB? ​

R: A maioria dos aplicativos MVP tem modelos de dados relacionais, PostgreSQL ou SQLite são mais adequados. MongoDB é adequado para dados documentais, não recomendado a menos que recursos NoSQL sejam explicitamente necessários.

P: Por que não usar Redux? ​

R: Redux é adequado para aplicações grandes, mas tem curva de aprendizado íngreme. Para fase MVP, React Context API ou Zustand são suficientes. Se o gerenciamento de estado se tornar complexo posteriormente, Redux Toolkit pode ser introduzido.

P: Por que não usar GraphQL? ​

R: APIs RESTful são mais simples, adequadas para a maioria das aplicações CRUD. As vantagens do GraphQL são em queries flexíveis e redução de requisições, mas para fase MVP REST API é suficiente, e a documentação Swagger é mais completa.

P: Por que não usar Next.js? ​

R: Next.js é um framework React, adequado para SSR e aplicações web. O objetivo deste projeto é gerar aplicativos mobile, React Native é a melhor escolha. Se versão web for necessária, React Native Web pode ser utilizado.


Comparação de Stacks Tecnológicas ​

Comparação de Frameworks Backend ​

FrameworkVantagensDesvantagensCenários de Uso
ExpressLeve, flexível, ecossistema ricoRequer configuração manual de estruturaAplicações pequenas a médias, serviços API
NestJSSegurança de tipos, modular, injeção de dependênciaCurva de aprendizado íngreme, over-engineeringAplicações empresariais grandes
FastifyAlta performance, validação integradaEcossistema menorCenários de alta concorrência
KoaLeve, middleware eleganteDocumentação e ecossistema menores que ExpressCenários que requerem controle fino

Comparação de Frameworks Frontend ​

FrameworkVantagensDesvantagensCenários de Uso
React NativeMultiplataforma, performance nativa, ecossistema ricoRequer aprendizado de desenvolvimento nativoAplicativos iOS + Android
FlutterExcelente performance, UI consistenteEcossistema Dart menorCenários que exigem performance extrema
IonicStack web, rápido aprendizadoPerformance não nativaAplicativos híbridos simples

Comparação de Bancos de Dados ​

Banco de DadosVantagensDesvantagensCenários de Uso
PostgreSQLFuncionalidade completa, excelente performanceRequer deployment independenteAmbiente de produção
SQLiteZero configuração, leveSem suporte a escrita concorrenteAmbiente de desenvolvimento, aplicações pequenas
MySQLPopular, documentação ricaFuncionalidades ligeiramente inferiores ao PostgreSQLAplicações web tradicionais

Recomendações de Extensão ​

À medida que o projeto evolui, as seguintes extensões podem ser consideradas:

Extensões de Curto Prazo (v1.1) ​

  • Adicionar camada de cache Redis
  • Introduzir Elasticsearch para busca
  • Implementar autenticação e autorização (JWT)
  • Adicionar comunicação em tempo real via WebSocket

Extensões de Médio Prazo (v2.0) ​

  • Migração para arquitetura de microsserviços
  • Introduzir message queue (RabbitMQ/Kafka)
  • Adicionar aceleração via CDN
  • Implementar suporte a múltiplos idiomas

Extensões de Longo Prazo ​

  • Introduzir API GraphQL
  • Implementar arquitetura Serverless
  • Adicionar funcionalidades de AI/ML
  • Implementar suporte a multi-tenant

Prévia da Próxima Lição ​

Na próxima lição, aprenderemos Referência de Comandos CLI.

Você aprenderá:

  • Como factory init inicializa projetos
  • Como factory run executa pipelines
  • Como factory continue continua execução em nova sessão
  • Parâmetros e usos de outros comandos comuns

Apêndice: Referência de Código Fonte ​

Clique para expandir e ver localização do código fonte

Última atualização: 2026-01-29

FuncionalidadeCaminho do Arquivo
Visão Geral da StackREADME.md (linhas 211-230)
Guia de Arquitetura Técnicaskills/tech/skill.md
Guia de Geração de Códigoskills/code/skill.md
Template Backendskills/code/references/backend-template.md
Template Frontendskills/code/references/frontend-template.md

Configuração Principal da Stack Tecnológica:

  • Backend: Node.js + Express + Prisma + SQLite/PostgreSQL
  • Frontend: React Native + Expo + React Navigation + Zustand
  • Testes: Vitest (backend) + Jest (frontend)
  • Deployment: Docker + GitHub Actions

Por que escolher estas tecnologias:

  • Simplicidade Primeiro: inicialização sem configuração, validação rápida de ideias
  • Segurança de Tipos: TypeScript + geração automática de tipos Prisma
  • Pronto para Produção: testes completos, documentação, configurações de deployment
  • Escalabilidade: pontos de extensão para cache, message queue, etc.