Перейти к основному содержимому

Первая программа на Astro

Разработчику Архитектору

Первая программа на Astro

Astro — фреймворк для контентных сайтов:

  • блоги;
  • документация;
  • лендинги.

По умолчанию на сервер уходит ноль JavaScript — HTML собирается на этапе build. Интерактивные блоки подключаются как острова (React, Vue, Svelte) только там, где нужны.

Под капотом — Vite — сборка и dev-server. Для полноценного SPA чаще берут React или Next.js. Astro — когда важны SEO и скорость первой отрисовки.

ШагРезультат
1npm create astro@latest — каркас
2index.astro — статическая страница
3Layout и slot — переиспользование
4Остров React — интерактив
5Content Collections — блог из Markdown
6build и деплой — статический хостинг
МатериалЗачем
Vitedev-server, HMR
HTML — о разделеразметка страниц
CSS — о разделеscoped styles
Reactострова client:*
npmscripts

Навигация по фронтенду

Островная архитектура

Большая часть страницы — чистый HTML. JavaScript загружается только для интерактивных блоков (счётчик, форма, корзина). Это ускоряет First Contentful Paint.


Как устроен Astro

РежимJavaScript в браузере
Статический .astro0 KB (только HTML/CSS)
<Counter client:load />JS только для Counter
SSR (output: 'server')HTML на сервере + острова

Шаг 1 — создание проекта

node -v
npm create astro@latest my-astro-site
cd my-astro-site
npm install
npm run dev

В мастере:

ОпцияНа первый раз
TemplateEmpty или Blog
TypeScriptStrict (рекомендуется)
IntegrationsReact или Vue — по желанию

Dev-server: http://localhost:4321 (порт Astro по умолчанию).

Структура:

my-astro-site/
src/
pages/ ← маршруты (файловая)
layouts/
components/
content/ ← коллекции Markdown
public/ ← статика as-is
astro.config.mjs
package.json

Шаг 2 — страница .astro

src/pages/index.astro:

---
const title = 'Мой первый Astro-сайт';
const items = ['Документация', 'Блог', 'Контакты'];
const year = new Date().getFullYear();
---

<html lang="ru">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>{title}</title>
</head>
<body>
<main>
<h1>{title}</h1>
<p>Статический HTML без клиентского JS.</p>
<ul>
{items.map((item) => <li>{item}</li>)}
</ul>
<footer>© {year}</footer>
</main>
</body>
</html>

<style>
main {
max-width: 40rem;
margin: 2rem auto;
font-family: system-ui, sans-serif;
padding: 0 1rem;
}
footer {
margin-top: 2rem;
color: #666;
}
</style>

Разбор:

  • Блок --- сверху — frontmatter на сервере: переменные, fetch, импорты.
  • Ниже — HTML-шаблон; {items.map(...)} выполняется при сборке или SSR.
  • <style> по умолчанию scoped к компоненту — классы не конфликтуют глобально.
  • В браузере нет Svelte/React runtime для этой страницы.

Шаг 3 — Layout и slot

src/layouts/BaseLayout.astro:

---
const { title = 'Astro', description = '' } = Astro.props;
---
<html lang="ru">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<meta name="description" content={description} />
<title>{title}</title>
</head>
<body>
<header>
<nav>
<a href="/">Главная</a>
<a href="/about">О проекте</a>
<a href="/blog">Блог</a>
</nav>
</header>
<slot />
<footer>© {new Date().getFullYear()} IT Universe</footer>
</body>
</html>

<style>
nav a { margin-right: 1rem; }
footer { margin-top: 3rem; font-size: 0.875rem; color: #666; }
</style>

src/pages/about.astro:

---
import BaseLayout from '../layouts/BaseLayout.astro';
---
<BaseLayout title="О проекте" description="Кратко о нашем сайте">
<h1>О нас</h1>
<p>Контент страницы попадает в <code>&lt;slot /&gt;</code> layout.</p>
</BaseLayout>

Файловая маршрутизация:

ФайлURL
src/pages/index.astro/
src/pages/about.astro/about
src/pages/blog/index.astro/blog

Шаг 4 — данные на этапе сборки

src/pages/team.astro:

---
import BaseLayout from '../layouts/BaseLayout.astro';

const members = [
{ name: 'Анна', role: 'Автор' },
{ name: 'Борис', role: 'Редактор' },
];

// Можно fetch к API на build time:
// const res = await fetch('https://api.example.com/team');
// const members = await res.json();
---

<BaseLayout title="Команда">
<h1>Команда</h1>
<ul>
{members.map((m) => (
<li><strong>{m.name}</strong> — {m.role}</li>
))}
</ul>
</BaseLayout>

fetch в frontmatter выполняется при сборке (SSG) или на сервере (SSR) — не в браузере пользователя.


Шаг 5 — остров React

Установка интеграции:

npx astro add react

src/components/Counter.jsx:

import { useState } from 'react';

export default function Counter() {
const [n, setN] = useState(0);
return (
<button type="button" onClick={() => setN(n + 1)}>
Кликов: {n}
</button>
);
}

На странице:

---
import BaseLayout from '../layouts/BaseLayout.astro';
import Counter from '../components/Counter.jsx';
---
<BaseLayout title="Главная">
<h1>Главная</h1>
<p>Ниже — интерактивный остров:</p>
<Counter client:load />
</BaseLayout>

Директивы клиента:

ДирективаКогда гидрировать
client:loadСразу при загрузке
client:visibleКогда элемент в viewport
client:idleКогда браузер простаивает
client:media="(max-width: 768px)"При совпадении media query

Без client:* компонент остаётся статическим HTML — кнопка не кликается.

Тот же паттерн работает с Svelte и Vue — через astro add svelte / vue.


Шаг 6 — Content Collections (блог)

src/content/config.ts:

import { defineCollection, z } from 'astro:content';

const blog = defineCollection({
type: 'content',
schema: z.object({
title: z.string(),
date: z.date(),
draft: z.boolean().optional(),
}),
});

export const collections = { blog };

src/content/blog/hello-world.md:

---
title: "Первый пост"
date: 2026-06-15
---

Текст поста в **Markdown**.

src/pages/blog/[...slug].astro:

---
import { getCollection } from 'astro:content';
import BaseLayout from '../../layouts/BaseLayout.astro';

export async function getStaticPaths() {
const posts = await getCollection('blog');
return posts.map((post) => ({
params: { slug: post.slug },
props: { post },
}));
}

const { post } = Astro.props;
const { Content } = await post.render();
---

<BaseLayout title={post.data.title}>
<article>
<h1>{post.data.title}</h1>
<time>{post.data.date.toLocaleDateString('ru-RU')}</time>
<Content />
</article>
</BaseLayout>

Astro валидирует frontmatter через Zod и генерирует типы для IDE.


Шаг 7 — сборка и preview

npm run build
npm run preview
КомандаРезультат
buildСтатические HTML/CSS в dist/
previewЛокальный сервер для проверки production

Конфиг astro.config.mjs:

import { defineConfig } from 'astro/config';

export default defineConfig({
site: 'https://example.com',
output: 'static',
});

site нужен для абсолютных URL в RSS и sitemap.


Astro и Next.js — обзор задач

ЗадачаAstroNext.js
Документация, блог✓ islands, мало JSвозможен, тяжелее
Dashboard SPAслабо
Минимум JS на странице✓ islandscode splitting
API routes✓ server endpoints
Единый React SPAне цель

Astro дополняет React — не заменяет его для сложных клиентских приложений.


Упражнения

  1. Добавьте страницу /contacts с формой (остров client:visible).
  2. Создайте коллекцию docs с тремя Markdown-файлами.
  3. Подключите @astrojs/sitemap и сгенерируйте sitemap.xml.
  4. Сравните размер бандла с и без client:load на Counter (DevTools → Network).
  5. Перенесите Counter на Svelte через astro add svelte.

Частые ошибки и troubleshooting

СимптомПричинаРешение
Кнопка React не кликаетсяНет client:loadДобавьте директиву client
404 на маршрутФайл вне src/pages/Проверьте путь и имя
Стили "утекают"Глобальный CSSScoped или CSS modules
getCollection пустойНет файлов в content/Добавьте .md с frontmatter
Ошибка schema ZodНеверный frontmatterСмотрите сообщение CLI
Build падает на fetchAPI недоступен при buildMock или fallback
Порт 4321 занятДругой Astro devnpm run dev -- --port 4322

FAQ

Astro — это статический генератор?

По умолчанию да (output: 'static'). Можно включить SSR и server endpoints.

Можно ли без React?

Да. Чистые .astro + <script> в компоненте для простой интерактивности.

Astro для документации как Docusaurus?

Да, многие docs-сайты на Astro + Starlight (официальная тема).

Как подключить API Node?

Server endpoints в src/pages/api/ или fetch на build time / client islands.


Production и деплой

Статический хостинг

После npm run build загрузите dist/ на:

  • Netlify, Vercel, Cloudflare Pages;
  • GitHub Pages (с site в config);
  • любой nginx/static bucket.

SSR и Node

npx astro add node

output: 'server' — HTML на каждый запрос. Деплой через Docker или Node-хостинг.

Переменные окружения

Секреты — через import.meta.env только на сервере (frontmatter, endpoints). Не экспортируйте секреты в client islands.

Production

Проверяйте npm run preview перед деплоем. Для SEO — meta description, Open Graph, sitemap. CDN и gzip/brotli — на стороне хостинга.


Шаг 8 — server endpoints (API routes)

src/pages/api/notes.ts:

import type { APIRoute } from 'astro';

const notes = [{ id: 1, text: 'Пример' }];

export const GET: APIRoute = () => {
return new Response(JSON.stringify(notes), {
headers: { 'Content-Type': 'application/json' },
});
};

export const POST: APIRoute = async ({ request }) => {
const body = await request.json();
const note = { id: Date.now(), text: body.text ?? '' };
notes.push(note);
return new Response(JSON.stringify(note), { status: 201 });
};

URL: /api/notes. Работает в dev и при output: 'server'.

Для статического output: 'static' API routes требуют adapter с server capability.


Шаг 9 — fetch к внешнему API на build time

src/pages/status.astro:

---
const res = await fetch('https://api.github.com/repos/withastro/astro');
const data = await res.json();
---
<p>Stars: {data.stargazers_count}</p>

Запрос выполняется при сборке — страница статическая. Для актуальных данных — SSR или client island с client:load.


Шаг 10 — Markdown с компонентами MDX

npx astro add mdx

src/content/blog/post.mdx:

---
title: "MDX пост"
date: 2026-06-15
---

import Counter from '../../components/Counter.jsx';

# Заголовок

<Counter client:load />

MDX смешивает Markdown и JSX — удобно для документации.


Шаг 11 — SEO и meta-теги

BaseLayout.astro:

---
const { title, description, image = '/og.png' } = Astro.props;
const canonical = new URL(Astro.url.pathname, Astro.site);
---
<head>
<title>{title}</title>
<meta name="description" content={description} />
<link rel="canonical" href={canonical} />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content={image} />
</head>

astro.config.mjs:

export default defineConfig({
site: 'https://example.com',
});

Шаг 12 — RSS и sitemap

npx astro add sitemap
import sitemap from '@astrojs/sitemap';

export default defineConfig({
site: 'https://example.com',
integrations: [sitemap()],
});

После buildsitemap-index.xml в dist/.


Деплой на статический хостинг

Пример GitHub Actions:

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: npm run build
- uses: actions/upload-pages-artifact@v3
with:
path: dist

Интеграция с Node API

ПодходКогда
Build-time fetchДанные редко меняются
Server endpoint AstroЛёгкий BFF
Client island + fetchДинамика в браузере
Отдельный Node APIПолноценный backend

Расширенный troubleshooting

СимптомДетали
Hydration mismatchРазный HTML server/client
Island не грузитсяПуть import, client:*
Images не оптимизированы@astrojs/image
MDX frontmatter errorZod schema в config
Slow buildМного страниц — incremental

Дополнительные упражнения

  1. RSS feed для коллекции blog.
  2. Страница поиска по заголовкам постов.
  3. React form с client:visible и POST на /api/notes.
  4. Lighthouse audit до и после islands.
  5. Starlight theme для docs-подраздела.

Production checklist

ПунктДействие
site в configCanonical, OG URLs
CompressionBrotli на CDN
Security headersCSP, HSTS на CDN
Preview deployPR previews на Netlify
MonitorUptime на /

View Transitions API

---
import { ViewTransitions } from 'astro:transitions';
---
<head>
<ViewTransitions />
</head>

Плавные переходы между страницами без тяжёлого SPA — встроено в Astro 3+.


Partial hydration — когда какой client:*

ДирективаJS budgetUX
без client0Статика
client:visibleНизкийLazy widgets
client:idleСреднийНекритичный UI
client:loadВысокийСразу интерактив

Стратегия: 90% страницы статика, острова только для форм и виджетов.


Astro + Tailwind

npx astro add tailwind
<h1 class="text-3xl font-bold text-blue-600">Заголовок</h1>

Tailwind генерирует utility-классы — быстрый прототип лендингов. CSS-основы — CSS — о разделе.


i18n (многоязычность) — обзор

Структура:

src/pages/
ru/index.astro
en/index.astro

Или библиотека astro-i18n. Для документации часто дублируют content/ по локалям.


Performance checklist

МетрикаИнструментЦель
LCPLighthouse< 2.5s
JS sizeCoverage tabМинимум islands
Images@astrojs/imageWebP, lazy
Fontsfont-display: swapБез FOIT

Astro hybrid rendering

astro.config.mjs:

export default defineConfig({
output: 'hybrid',
});

Отдельные страницы помечают export const prerender = false для SSR — гибрид SSG и server.



Второй проход — расширенный практикум (Astro)

Серия мини-туториалов

Туториал 1 — Starlight docs

Команда или API: npm create starlight.

Детали: documentation theme.

// пример шага
console.log('ok');
ШагПроверка
1Выполнить Starlight docs
2Перезапустить dev-сервер
3Убедиться в отсутствии ошибок в консоли

Туториал 2 — MDX pages

Команда или API: .mdx in content.

Детали: React in Markdown.

// пример шага
console.log('ok');
ШагПроверка
1Выполнить MDX pages
2Перезапустить dev-сервер
3Убедиться в отсутствии ошибок в консоли

Туториал 3 — View Transitions

Команда или API: ClientRouter.

Детали: SPA-like nav static site.

// пример шага
console.log('ok');
ШагПроверка
1Выполнить View Transitions
2Перезапустить dev-сервер
3Убедиться в отсутствии ошибок в консоли

Туториал 4 — Image component

Команда или API: <Image />.

Детали: optimized responsive images.

// пример шага
console.log('ok');
ШагПроверка
1Выполнить Image component
2Перезапустить dev-сервер
3Убедиться в отсутствии ошибок в консоли

Туториал 5 — RSS feed

Команда или API: @astrojs/rss.

Детали: blog.xml autogen.

// пример шага
console.log('ok');
ШагПроверка
1Выполнить RSS feed
2Перезапустить dev-сервер
3Убедиться в отсутствии ошибок в консоли

Туториал 6 — Sitemap

Команда или API: @astrojs/sitemap.

Детали: SEO sitemap.xml.

// пример шага
console.log('ok');
ШагПроверка
1Выполнить Sitemap
2Перезапустить dev-сервер
3Убедиться в отсутствии ошибок в консоли

Туториал 7 — Server endpoints

Команда или API: src/pages/api/data.ts.

Детали: GET handler Response json.

// пример шага
console.log('ok');
ШагПроверка
1Выполнить Server endpoints
2Перезапустить dev-сервер
3Убедиться в отсутствии ошибок в консоли

Туториал 8 — Middleware

Команда или API: src/middleware.ts.

Детали: auth gate routes.

// пример шага
console.log('ok');
ШагПроверка
1Выполнить Middleware
2Перезапустить dev-сервер
3Убедиться в отсутствии ошибок в консоли

Туториал 9 — Hybrid output

Команда или API: output hybrid.

Детали: static + server routes mix.

// пример шага
console.log('ok');
ШагПроверка
1Выполнить Hybrid output
2Перезапустить dev-сервер
3Убедиться в отсутствии ошибок в консоли

Туториал 10 — Markdoc

Команда или API: @astrojs/markdoc.

Детали: custom content components.

// пример шага
console.log('ok');
ШагПроверка
1Выполнить Markdoc
2Перезапустить dev-сервер
3Убедиться в отсутствии ошибок в консоли

Расширенные упражнения (второй проход)

  1. Contacts page form client:visible.

Подсказка к упражнению 13: Начните с минимального изменения, затем добавьте тест. Тема: Contacts.

  1. Collection docs три markdown файла.

Подсказка к упражнению 14: Начните с минимального изменения, затем добавьте тест. Тема: Collection.

  1. sitemap.xml через integration.

Подсказка к упражнению 15: Начните с минимального изменения, затем добавьте тест. Тема: sitemap.xml.

  1. Compare bundle with without client:load.

Подсказка к упражнению 16: Начните с минимального изменения, затем добавьте тест. Тема: Compare.

  1. Counter on Svelte island astro add svelte.

Подсказка к упражнению 17: Начните с минимального изменения, затем добавьте тест. Тема: Counter.

  1. RSS для blog collection.

Подсказка к упражнению 18: Начните с минимального изменения, затем добавьте тест. Тема: RSS.

  1. View Transitions между pages.

Подсказка к упражнению 19: Начните с минимального изменения, затем добавьте тест. Тема: View.

  1. Server endpoint proxy external API.

Подсказка к упражнению 20: Начните с минимального изменения, затем добавьте тест. Тема: Server.

  1. Draft posts filter getCollection.

Подсказка к упражнению 21: Начните с минимального изменения, затем добавьте тест. Тема: Draft.

  1. Dark mode toggle minimal script.

Подсказка к упражнению 22: Начните с минимального изменения, затем добавьте тест. Тема: Dark.


Расширенный FAQ (второй проход)

Astro или Next для блога?

Astro меньше JS по умолчанию для content.

React only island?

Да, partial hydration client directives.

CMS headless?

Content collections или Sanity loader.

i18n routes?

[lang]/blog structure folders.

Env secrets server?

import.meta.env server only in .astro frontmatter.

Build fetch fail?

Fallback mock data if API down at build.

Tailwind?

npx astro add tailwind.

Deploy Netlify?

adapter netlify auto.

Partial prerender?

export const prerender = true per route.

Markdown components?

import Callout from '../components'.


Production — дополнительные рекомендации

#ПрактикаЗачем
1npmnpm run preview before deploy
2CDNCDN cache HTML short TTL if SSR
3ImageImage optimization widths configured
4SecuritySecurity headers platform or middleware
5MonitorMonitor Core Web Vitals field data
6SeparateSeparate analytics island client:idle
7404404 custom page src/pages/404.astro
8Robots.txtRobots.txt in public/

Troubleshooting — расширенная таблица

СимптомВероятная причинаДействие
Сборка падает без текстаКэш или версия NodeОчистить node_modules, lock-файл, переустановить
Тесты flakyПорядок или timingИзолировать example, убрать sleep, добавить wait matchers
Production 502Process не слушает PORTПроверить env PORT и health endpoint
Данные пропали после deployIn-memory store или migrateПодключить БД, migrate deploy
CORS в браузереПрямой URL APIProxy dev или enableCors origin
Медленный первый запросCold start DB poolWarmup health check после deploy
Ошибка подписи iOSCertificate expiredRenew в Developer portal, download profiles
Turbo frame blankId mismatchСверить turbo-frame id в request и response
Prisma client outdatedSchema changednpx prisma generate после migrate
Vite blank prodНеверный base pathПроверить base и URL деплоя

Пошаговый walkthrough — контрольный список

День 1

  1. Шаг 1 дня 1: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 2 дня 1: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 3 дня 1: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 4 дня 1: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 5 дня 1: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check

День 2

  1. Шаг 1 дня 2: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 2 дня 2: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 3 дня 2: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 4 дня 2: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 5 дня 2: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check

День 3

  1. Шаг 1 дня 3: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 2 дня 3: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 3 дня 3: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 4 дня 3: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 5 дня 3: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check

День 4

  1. Шаг 1 дня 4: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 2 дня 4: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 3 дня 4: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 4 дня 4: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 5 дня 4: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check

День 5

  1. Шаг 1 дня 5: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 2 дня 5: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 3 дня 5: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 4 дня 5: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 5 дня 5: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check

День 6

  1. Шаг 1 дня 6: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 2 дня 6: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 3 дня 6: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 4 дня 6: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 5 дня 6: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check

День 7

  1. Шаг 1 дня 7: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 2 дня 7: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 3 дня 7: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 4 дня 7: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check
  1. Шаг 5 дня 7: закрепить часть стека Astro. Запишите результат в README проекта.
# checkpoint
npm test || bundle exec rspec || echo manual check

Чек-лист самопроверки перед сдачей практикума

  • Проект создаётся с нуля по статье без пропусков шагов

  • CRUD или эквивалентный сценарий работает end-to-end

  • Есть обработка ошибок валидации или 404

  • Данные переживают перезапуск там, где это требуется темой

  • Написан минимум один автоматический тест или system check

  • Production-секция прочитана и применена к деплою или Docker

  • FAQ просмотрен — типичные ошибки воспроизведены и исправлены

  • Связанные материалы открыты для следующего шага обучения


Дополнение второго прохода — финальные пункты

#ТемаДействие
1Content CollectionsПроверить Zod schema на всех постах
2IslandsСравнить размер бандла с client:idle
3Deploynpm run preview перед загрузкой dist

Связанные материалы

ТемаМатериал
ViteVite — сборка и dev-server
SvelteПервая программа на Svelte
ReactПервая программа на React
SSR metaNext.js
Node APIПервая программа на Node.js
npmnpm — команды и lock-файлы
HTML основаHTML — о разделе
CSSCSS — о разделе

Итоговый чек-лист Astro

  • client:* директива на интерактивных островах
  • npm run build и preview перед деплоем
  • Content collections со schema
  • Sitemap и meta для SEO

Содержание