2. Установка

В этом уроке поднимем полноценный стек: Apollo Server (бэкенд) + Apollo Client (React фронтенд).
Структура проекта
Заголовок раздела «Структура проекта»graphql-demo/├── server/ # Apollo Server│ ├── index.js│ └── package.json└── client/ # React + Apollo Client ├── src/ │ ├── App.jsx │ └── main.jsx └── package.jsonЧасть 1: Apollo Server
Заголовок раздела «Часть 1: Apollo Server»Установка
Заголовок раздела «Установка»mkdir graphql-demo && cd graphql-demomkdir server && cd servernpm init -ynpm install @apollo/server graphqlМинимальный сервер
Заголовок раздела «Минимальный сервер»import { ApolloServer } from '@apollo/server';import { startStandaloneServer } from '@apollo/server/standalone';
// 1. Определяем схемуconst typeDefs = ` type Book { title: String author: String }
type Query { books: [Book] }`;
// 2. Данные (в реальном приложении — БД)const books = [ { title: 'Война и мир', author: 'Лев Толстой' }, { title: 'Преступление и наказание', author: 'Достоевский' },];
// 3. Resolvers — функции для получения данныхconst resolvers = { Query: { books: () => books, },};
// 4. Запускаем серверconst server = new ApolloServer({ typeDefs, resolvers });
const { url } = await startStandaloneServer(server, { listen: { port: 4000 },});
console.log(`🚀 Server ready at: ${url}`);# В package.json добавь "type": "module"node index.js# 🚀 Server ready at: http://localhost:4000/Открой http://localhost:4000 — увидишь Apollo Sandbox для тестирования.
Первый запрос в Sandbox
Заголовок раздела «Первый запрос в Sandbox»query GetBooks { books { title author }}Ответ:
{ "data": { "books": [ { "title": "Война и мир", "author": "Лев Толстой" }, { "title": "Преступление и наказание", "author": "Достоевский" } ] }}Часть 2: Apollo Client (React)
Заголовок раздела «Часть 2: Apollo Client (React)»Установка
Заголовок раздела «Установка»# В корне проектаcd ..npm create vite@latest client -- --template reactcd clientnpm install @apollo/client graphqlНастройка клиента
Заголовок раздела «Настройка клиента»import React from 'react';import ReactDOM from 'react-dom/client';import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';import App from './App';
// Создаём клиентconst client = new ApolloClient({ uri: 'http://localhost:4000/', // URL нашего сервера cache: new InMemoryCache(), // Кэш в памяти});
// Оборачиваем приложение в ApolloProviderReactDOM.createRoot(document.getElementById('root')).render( <ApolloProvider client={client}> <App /> </ApolloProvider>);Первый компонент с GraphQL
Заголовок раздела «Первый компонент с GraphQL»import { useQuery, gql } from '@apollo/client';
// Определяем запросconst GET_BOOKS = gql` query GetBooks { books { title author } }`;
function BookList() { const { loading, error, data } = useQuery(GET_BOOKS);
if (loading) return <p>Загрузка...</p>; if (error) return <p>Ошибка: {error.message}</p>;
return ( <ul> {data.books.map((book, i) => ( <li key={i}> <strong>{book.title}</strong> — {book.author} </li> ))} </ul> );}
export default function App() { return ( <div> <h1>Мои книги</h1> <BookList /> </div> );}Запуск клиента
Заголовок раздела «Запуск клиента»npm run dev# http://localhost:5173CORS настройка на сервере
Заголовок раздела «CORS настройка на сервере»Если клиент и сервер на разных портах — нужен CORS:
npm install corsimport { expressMiddleware } from '@apollo/server/express4';import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer';import express from 'express';import http from 'http';import cors from 'cors';import bodyParser from 'body-parser';
const app = express();const httpServer = http.createServer(app);
const server = new ApolloServer({ typeDefs, resolvers, plugins: [ApolloServerPluginDrainHttpServer({ httpServer })],});
await server.start();
app.use( '/graphql', cors(), bodyParser.json(), expressMiddleware(server),);
await new Promise((resolve) => httpServer.listen({ port: 4000 }, resolve));console.log(`🚀 Server ready at http://localhost:4000/graphql`);TypeScript версия
Заголовок раздела «TypeScript версия»npm install typescript ts-node @types/node -Dnpm install @apollo/server graphqlimport { ApolloServer } from '@apollo/server';import { startStandaloneServer } from '@apollo/server/standalone';
interface Book { title: string; author: string;}
const typeDefs = `#graphql type Book { title: String author: String } type Query { books: [Book] }`;
const books: Book[] = [ { title: 'Война и мир', author: 'Лев Толстой' },];
const resolvers = { Query: { books: (): Book[] => books, },};
const server = new ApolloServer<{}>({ typeDefs, resolvers });const { url } = await startStandaloneServer(server, { listen: { port: 4000 } });console.log(`🚀 Server ready at: ${url}`);Практика
Заголовок раздела «Практика»- Подними минимальный Apollo Server с книгами
- Подключи Apollo Client к React-приложению
- Выведи список книг на странице
- Добавь в схему новое поле
year: Intи данные к нему - Запроси это поле в React-компоненте
- Apollo Server — GraphQL сервер на Node.js
- Apollo Client — клиент для React/Vue/Angular
ApolloProviderоборачивает приложение и даёт доступ к клиентуuseQuery(GQL_QUERY)— хук для запроса данных
Следующий урок → Schema Definition Language →