Skip to content

Подробное руководство по стеку технологий

Приложения, генерируемые AI App Factory, используют проверенный производственный стек технологий, ориентированный на быструю разработку MVP и последующее масштабирование. В этом документе подробно объясняется причина выбора каждой технологии и сценарии её использования.


Что вы узнаете

  • Поймете обоснование выбора технологий для генерируемых приложений
  • Освоите основные инструменты и фреймворки стека технологий
  • Поймете, почему выбраны именно эти технологии, а не альтернативы
  • Узнаете, как настраивать технологии в зависимости от требований проекта

Обзор основных технологий

Генерируемые приложения используют полный стек TypeScript, обеспечивающий безопасность типов и единообразный опыт разработки как на бэкенде, так и на фронтенде.

УровеньТехнологияВерсияНазначение
Среда выполнения бэкендаNode.js16+Серверная среда выполнения JavaScript
Язык бэкендаTypeScript5+Надмножество JavaScript с безопасностью типов
Фреймворк бэкендаExpress4.xЛегковесный веб-фреймворк для создания RESTful API
ORMPrisma5.xБезопасный слой доступа к базе данных
База данных для разработкиSQLite-База данных без конфигурации для быстрого прототипирования
База данных для продакшенаPostgreSQL-Реляционная база данных для продакшена
Фреймворк фронтендаReact Native-Кроссплатформенная разработка мобильных приложений
Инструментарий фронтендаExpo-Инструменты разработки и сборки для React Native
Навигация фронтендаReact Navigation6+Нативный опыт навигации
Управление состояниемReact Context API-Легковесное управление состоянием (на этапе MVP)
HTTP-клиентAxios-HTTP-клиент для браузера и Node.js

Подробное руководство по стеку бэкенда

Node.js + TypeScript

Почему Node.js?

  • Богатая экосистема: npm — крупнейшая в мире экосистема пакетов
  • Единый язык: команда осваивает только один язык
  • Высокая эффективность разработки: событийно-ориентированная, неблокирующая модель I/O подходит для приложений реального времени
  • Активное сообщество: множество open-source библиотек и решений

Почему TypeScript?

  • Безопасность типов: ошибки выявляются на этапе компиляции, что снижает количество багов во время выполнения
  • Отличный опыт разработки: интеллектуальные подсказки, автодополнение, поддержка рефакторинга
  • Поддерживаемость кода: четкое определение интерфейсов повышает эффективность командной работы
  • Идеальная интеграция с Prisma: автоматическая генерация определений типов

Пример конфигурации:

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

Фреймворк Express

Почему Express?

  • Зрелость и стабильность: самый популярный веб-фреймворк для Node.js
  • Богатые middleware: аутентификация, логирование, CORS и многое другое из коробки
  • Высокая гибкость: не навязывает структуру проекта, можно организовывать свободно
  • Хорошая поддержка сообщества: множество руководств и решений проблем

Типичная структура проекта:

src/
├── config/          # Файлы конфигурации
│   ├── swagger.ts   # Конфигурация Swagger API документации
│   └── index.ts     # Конфигурация приложения
├── lib/             # Утилиты
│   ├── logger.ts    # Утилита логирования
│   └── prisma.ts    # Singleton Prisma
├── middleware/      # Middleware
│   ├── errorHandler.ts
│   └── requestLogger.ts
├── routes/          # Определения маршрутов
│   ├── items.ts
│   └── index.ts
├── controllers/     # Слой контроллеров
│   ├── items.controller.ts
│   └── index.ts
├── services/        # Слой бизнес-логики
│   └── items.service.ts
├── validators/      # Валидация входных данных
│   └── items.validator.ts
├── __tests__/       # Тестовые файлы
│   └── items.test.ts
├── app.ts           # Приложение Express
└── index.ts         # Точка входа приложения

Основные middleware:

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();

// Middleware безопасности
app.use(helmet());           // Заголовки безопасности
app.use(cors(corsOptions));  // Конфигурация CORS

// Middleware обработки запросов
app.use(express.json());     // Парсинг JSON
app.use(compression());      // Сжатие ответов
app.use(requestLogger);      // Логирование запросов

// Middleware обработки ошибок (последним)
app.use(errorHandler);

export default app;

Prisma ORM

Почему Prisma?

  • Безопасность типов: автоматическая генерация определений TypeScript
  • Управление миграциями: декларативная схема, автоматическая генерация скриптов миграции
  • Отличный опыт разработки: поддержка IntelliSense, четкие сообщения об ошибках
  • Поддержка нескольких баз данных: SQLite, PostgreSQL, MySQL и другие
  • Высокая производительность: оптимизация запросов, управление пулом соединений

Типичный пример Schema:

prisma
// prisma/schema.prisma

datasource db {
  provider = "sqlite"      // Среда разработки
  // provider = "postgresql" // Среда продакшена
  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]) // Ручное создание индекса для сортировки
}

Часто используемые операции с базой данных:

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

const prisma = new PrismaClient();

// Создание
const item = await prisma.item.create({
  data: { title: 'Обед', amount: 25.5 }
});

// Запрос (с поддержкой пагинации)
const items = await prisma.item.findMany({
  take: 20,              // Ограничение количества
  skip: 0,               // Смещение
  orderBy: { createdAt: 'desc' }
});

// Обновление
const updated = await prisma.item.update({
  where: { id: 1 },
  data: { title: 'Ужин' }
});

// Удаление
await prisma.item.delete({
  where: { id: 1 }
});

Выбор базы данных

Среда разработки: SQLite

  • Нулевая конфигурация: файловая база данных, не требует установки сервиса
  • Быстрый старт: подходит для локальной разработки и быстрой итерации
  • Переносимость: вся база данных — это один файл .db
  • Не поддерживает параллельную запись: конфликты при одновременной записи нескольких процессов
  • Не подходит для продакшена: ограниченная производительность и возможности параллелизма

Среда продакшена: PostgreSQL

  • Полный функционал: поддержка сложных запросов, транзакций, типа JSON
  • Высокая производительность: поддержка высокой параллельности, сложных индексов
  • Стабильность и надежность: корпоративная база данных, проверенная временем
  • Зрелая экосистема: богатый инструментарий резервного копирования и мониторинга

Стратегия миграции базы данных:

bash
# Среда разработки — использование SQLite
DATABASE_URL="file:./dev.db"

# Среда продакшена — использование PostgreSQL
DATABASE_URL="postgresql://user:password@host:5432/database"

# Создание миграции
npx prisma migrate dev --name add_item_category

# Развертывание в продакшене
npx prisma migrate deploy

# Сброс базы данных (среда разработки)
npx prisma migrate reset

Подробное руководство по стеку фронтенда

React Native + Expo

Почему React Native?

  • Кроссплатформенность: один код работает на iOS и Android
  • Нативная производительность: компилируется в нативные компоненты, а не WebView
  • Горячие обновления: Expo поддерживает обновления без повторной публикации
  • Богатые компоненты: сообщество предоставляет множество качественных компонентов

Почему Expo?

  • Быстрый старт: не требует сложной настройки нативной среды разработки
  • Единый инструментарий: единый процесс разработки, сборки и развертывания
  • Expo Go: сканируйте QR-код для предпросмотра на реальном устройстве
  • EAS Build: облачная сборка с поддержкой публикации в App Store

Структура проекта:

src/
├── api/              # Вызовы API
│   ├── client.ts     # Экземпляр Axios
│   └── items.ts      # Items API
├── components/       # Переиспользуемые компоненты
│   └── ui/           # Базовые UI-компоненты
│       ├── Button.tsx
│       ├── Input.tsx
│       └── Card.tsx
├── hooks/            # Пользовательские Hooks
│   ├── useItems.ts
│   └── useAsync.ts
├── navigation/       # Конфигурация навигации
│   └── RootNavigator.tsx
├── screens/          # Компоненты экранов
│   ├── HomeScreen.tsx
│   ├── DetailScreen.tsx
│   └── __tests__/
├── styles/           # Стили и темы
│   └── theme.ts
└── types/            # Типы TypeScript
    └── index.ts

Пример типичного экрана:

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>Ошибка загрузки: {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

Почему React Navigation?

  • Официальная рекомендация: официальное решение для навигации в React Native
  • Безопасность типов: TypeScript поддерживает полную типизацию параметров навигации
  • Нативный опыт: предоставляет нативные режимы навигации, такие как стековая и таб-навигация
  • Глубокие ссылки: поддержка URL Scheme и глубоких ссылок

Пример конфигурации навигации:

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

// Определение типов параметров навигации
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: 'Главная' }}
        />
        <Stack.Screen
          name="Detail"
          component={DetailScreen}
          options={({ route }) => ({ title: `Детали ${route.params.itemId}` })}
        />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

Управление состоянием

React Context API (на этапе MVP)

Подходит для простых приложений, нулевые зависимости:

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 должен использоваться внутри ItemsProvider');
  }
  return context;
}

Zustand (приложения средней сложности)

Легковесная библиотека управления состоянием с простым API:

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' } // Персистентность в AsyncStorage
    )
  )
);

Инструментарий разработки

Фреймворк тестирования

Бэкенд: 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('should return items list', async () => {
    const res = await request(app).get('/api/items');
    expect(res.status).toBe(200);
    expect(Array.isArray(res.body.data)).toBe(true);
  });
});

Фронтенд: 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('should render without crashing', () => {
    render(<HomeScreen />);
  });

  it('should show loading state initially', () => {
    const { getByTestId } = render(<HomeScreen />);
    expect(getByTestId('loading-indicator')).toBeTruthy();
  });
});

API документация: Swagger/OpenAPI

Генерируемые приложения автоматически включают Swagger UI, доступный по адресу http://localhost:3000/api-docs.

typescript
import swaggerJsdoc from 'swagger-jsdoc';

const options = {
  definition: {
    openapi: '3.0.0',
    info: {
      title: 'API Documentation',
      version: '1.0.0',
    },
  },
  apis: ['./src/routes/*.ts'], // Сканирование комментариев маршрутов
};

export const swaggerSpec = swaggerJsdoc(options);

Логирование и мониторинг

Логирование бэкенда: 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(),
  ],
});

// Примеры использования
logger.info('Item created', { itemId: 1 });
logger.error('Failed to create item', { error: 'Database error' });

Мониторинг фронтенда: запись времени выполнения API-запросов, ошибок и метрик производительности.


Инструменты развертывания

Docker + docker-compose

Генерируемые приложения включают Dockerfile и docker-compose.yml, поддерживая контейнеризованное развертывание.

Пример 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

Автоматизация тестирования, сборки и развертывания:

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

Принципы выбора стека технологий

Основные принципы выбора стека технологий AI App Factory:

1. Простота в приоритете

  • Выбор зрелых и стабильных технологий для снижения затрат на обучение
  • Избегание чрезмерного проектирования, фокус на основной функционал
  • Запуск без конфигурации, быстрая проверка идей

2. Безопасность типов

  • Единое использование TypeScript на бэкенде и фронтенде
  • Prisma автоматически генерирует типы базы данных
  • React Navigation с безопасностью типов параметров навигации

3. Готовность к продакшену

  • Полное покрытие тестами
  • Предоставление конфигураций развертывания (Docker, CI/CD)
  • Полное логирование, мониторинг и обработка ошибок

4. Масштабируемость

  • Резервирование точек расширения (например, кэширование, очереди сообщений)
  • Поддержка миграции базы данных (SQLite → PostgreSQL)
  • Модульная архитектура для удобства разделения и рефакторинга

5. Фокус на MVP

  • Четкое определение того, что не входит в цели, без внедрения аутентификации, авторизации и других неосновных функций
  • Ограничение количества страниц (максимум 3)
  • Быстрая доставка, последующие итерации

Часто задаваемые вопросы

В: Почему не NestJS?

О: NestJS — отличный фреймворк, но слишком сложный для этапа MVP. Express более легковесный и гибкий, подходит для быстрого прототипирования. Если проект масштабируется, можно рассмотреть миграцию на NestJS.

В: Почему не MongoDB?

О: Большинство MVP-приложений имеют реляционную модель данных, для которой PostgreSQL или SQLite более подходят. MongoDB подходит для документо-ориентированных данных, и не рекомендуется использовать, если явно не требуются возможности NoSQL.

В: Почему не Redux?

О: Redux подходит для крупных приложений, но имеет высокие затраты на обучение. На этапе MVP достаточно React Context API или Zustand. Если управление состоянием усложняется, можно внедрить Redux Toolkit.

В: Почему не GraphQL?

О: RESTful API проще и подходит для большинства CRUD-приложений. Преимущества GraphQL — гибкие запросы и сокращение количества запросов, но для этапа MVP REST API достаточно, а документация Swagger более полная.

В: Почему не Next.js?

О: Next.js — это React-фреймворк, подходящий для SSR и веб-приложений. Цель этого проекта — генерация мобильных приложений, для которых React Native является лучшим выбором. Если требуется веб-версия, можно использовать React Native Web.


Сравнение стеков технологий

Сравнение бэкенд-фреймворков

ФреймворкПреимуществаНедостаткиСценарии использования
ExpressЛегковесный, гибкий, богатая экосистемаТребует ручной настройки структурыПриложения среднего размера, API-сервисы
NestJSБезопасность типов, модульность, внедрение зависимостейКрутая кривая обучения, чрезмерное проектированиеКрупные корпоративные приложения
FastifyВысокая производительность, встроенная валидацияМеньшая экосистемаСценарии с высокой параллельностью
KoaЛегковесный, элегантные middlewareДокументация и экосистема уступают ExpressСценарии, требующие тонкого контроля

Сравнение фронтенд-фреймворков

ФреймворкПреимуществаНедостаткиСценарии использования
React NativeКроссплатформенность, нативная производительность, богатая экосистемаТребуется изучение нативной разработкиПриложения iOS + Android
FlutterОтличная производительность, единообразный UIМеньшая экосистема DartСценарии, требующие максимальной производительности
IonicВеб-стек технологий, быстрый стартНе нативная производительностьПростые гибридные приложения

Сравнение баз данных

База данныхПреимуществаНедостаткиСценарии использования
PostgreSQLПолный функционал, отличная производительностьТребует отдельного развертыванияСреда продакшена
SQLiteНулевая конфигурация, легковеснаяНе поддерживает параллельную записьСреда разработки, небольшие приложения
MySQLПопулярность, богатая документацияФункционал уступает PostgreSQLТрадиционные веб-приложения

Рекомендации по расширению

По мере развития проекта можно рассмотреть следующие расширения:

Краткосрочное расширение (v1.1)

  • Добавление слоя кэширования Redis
  • Внедрение поиска Elasticsearch
  • Реализация аутентификации и авторизации (JWT)
  • Добавление WebSocket для коммуникации в реальном времени

Среднесрочное расширение (v2.0)

  • Миграция на микросервисную архитектуру
  • Внедрение очередей сообщений (RabbitMQ/Kafka)
  • Добавление CDN-ускорения
  • Реализация многоязычной поддержки

Долгосрочное расширение

  • Внедрение GraphQL API
  • Реализация Serverless-архитектуры
  • Добавление функций AI/ML
  • Реализация поддержки мультиарендности

Анонс следующего урока

В следующем уроке мы изучим Справочник по командам CLI.

Вы узнаете:

  • Как factory init инициализирует проект
  • Как factory run запускает конвейер
  • Как factory continue продолжает выполнение в новой сессии
  • Параметры и использование других часто используемых команд

Приложение: Справка по исходному коду

Нажмите, чтобы развернуть и посмотреть расположение исходного кода

Обновлено: 2026-01-29

ФункцияПуть к файлу
Обзор стека технологийREADME.md (строки 211-230)
Руководство по технической архитектуреskills/tech/skill.md
Руководство по генерации кодаskills/code/skill.md
Шаблон бэкендаskills/code/references/backend-template.md
Шаблон фронтендаskills/code/references/frontend-template.md

Ключевой стек технологий:

  • Бэкенд: Node.js + Express + Prisma + SQLite/PostgreSQL
  • Фронтенд: React Native + Expo + React Navigation + Zustand
  • Тестирование: Vitest (бэкенд) + Jest (фронтенд)
  • Развертывание: Docker + GitHub Actions

Почему выбраны именно эти технологии:

  • Простота в приоритете: запуск без конфигурации, быстрая проверка идей
  • Безопасность типов: TypeScript + автоматическая генерация типов Prisma
  • Готовность к продакшену: полное тестирование, документация, конфигурации развертывания
  • Масштабируемость: резервирование точек расширения для кэширования, очередей сообщений и т.д.