Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Выразительный React - Прямоугольник и собачка #5168

Merged
merged 11 commits into from Mar 31, 2024
134 changes: 134 additions & 0 deletions js/expressive-react-rectangle/index.md
@@ -0,0 +1,134 @@
---
title: "Выразительный React: прямоугольник и собачка"
solarrust marked this conversation as resolved.
Show resolved Hide resolved
description: "Создаем простой компонент на React"
HellSquirrel marked this conversation as resolved.
Show resolved Hide resolved
authors:
- hellsquirrel
tags:
- article
solarrust marked this conversation as resolved.
Show resolved Hide resolved
---

Это первая статья из серии "Выразительный React". Здесь мы познакомимся с React и запилим первый простой компонент - прямоугольничек с собачкой. Чтобы нам не было скучно мы даже не будем запускать наш код в браузере. Вместо этого напишем простой скрипт который, который запустит сервер и отдаст HTML страницу с нашим компонентом.
TatianaFokina marked this conversation as resolved.
Show resolved Hide resolved

## React в одном абзаце
HellSquirrel marked this conversation as resolved.
Show resolved Hide resolved
React это библиотека которая позволяет создавать переиспользуемые кусочки интерфейса – компоненты. Для описания компонента вы используете JavaScript или TypeScript, специальные правила и синтаксис, который называется JSX.
TatianaFokina marked this conversation as resolved.
Show resolved Hide resolved

Комбинируя компоненты вы создаете свой уникальный React-мир.
solarrust marked this conversation as resolved.
Show resolved Hide resolved

<aside>
React можно использовать и без JSX - но это редко когда бывает нужно. Код React-компонента с использванием JSX читать значительно легче.
</aside>
solarrust marked this conversation as resolved.
Show resolved Hide resolved

Самый стандрарный способ использования React запускать его в браузере.
Так как браузеры не понимают JSX, нужно несколько дополнительных шагов, чтобы показать наш React-мир пользователям:
* Сначала нужно создать компонент с помощью JavaScript/TypeScript и JSX.
* Затем нужно написать код для отображения компонента.
* Потом преобразовать весь код в понятный браузеру JavaScript (без JSX).
* И наконец подключить преобразованный код к HTML странице (как и любой другой JavaScript, используя тег <script>).

Мы обязательно займемся этим в другой статье. А сейчас сделаем совсем по-другому.
* Мы создадим компонент с помощью TypeScript и JSX. (тот же самый шаг)
* Напишем скрипт, который поднимает сервер и отдает HTML страницу с нашим компонентом.
* Откроем страницу и полюбуемся на результатом.
solarrust marked this conversation as resolved.
Show resolved Hide resolved

## Подготавливаем рабочее место
HellSquirrel marked this conversation as resolved.
Show resolved Hide resolved

> Здесь и далее я предполагаю что вы работаете на Mac. Для Windows и Linux инструкции не должны отличаться, но если у вас вдруг что-то не заведется приносите issues.
TatianaFokina marked this conversation as resolved.
Show resolved Hide resolved

Убедитесь что у вас установлен Node. Если Node нет, утащите его с [официального сайта](https://nodejs.org/en/download).
HellSquirrel marked this conversation as resolved.
Show resolved Hide resolved

Создайте папку для проекта и перейдите в нее в терминале.
solarrust marked this conversation as resolved.
Show resolved Hide resolved

```bash
mkdir -p expressive-react/rectangle
cd expressive-react/rectangle
```

Выполните команду
```bash
npx bun init
```
<aside>
Мы будем использовать набор инструментов из библиотеки [`bun`](https://bun.sh/docs/bundler). Для других сборщиков команды инициализации и установки дополнительных библиотек будут отличаться.
</aside>
solarrust marked this conversation as resolved.
Show resolved Hide resolved

Булочка создаст для вас все нужные файлы и папки.
TatianaFokina marked this conversation as resolved.
Show resolved Hide resolved

Выполните команду
solarrust marked this conversation as resolved.
Show resolved Hide resolved
```bash
npx bun index.ts
```

Полюбуйтесь на "Hello, World!" в консоли.

Теперь установите React.
```bash
npx bun install react react-dom
```
solarrust marked this conversation as resolved.
Show resolved Hide resolved

## Создаем прямоугольник и собачку
solarrust marked this conversation as resolved.
Show resolved Hide resolved
Создайте файл `Rectangle.tsx` вот с таким содержимым:
HellSquirrel marked this conversation as resolved.
Show resolved Hide resolved

```tsx
const Rectangle: FC = () => <div>🐶</div>;

export const rectangleElement = <Rectangle />;
```

🧐 В этом файле мы создали React-компонент `Rectangle`
Любой React-компонент это просто функция которая возвращает разметку, описанную при помощи JSX.
HellSquirrel marked this conversation as resolved.
Show resolved Hide resolved

<aside>
`null` или обычная JavaScript строка это тоже валидная JSX разметка.
</aside>
HellSquirrel marked this conversation as resolved.
Show resolved Hide resolved

Затем мы создали React-element. React-element это то что может отобразить ваш браузер. Вы можете думать о React-компоненте как о шаблоне, а о React-element как о конкретном экземпляре этого шаблона.

Мы экспортировали React-element, чтобы переиспользовать его в другом файле.

solarrust marked this conversation as resolved.
Show resolved Hide resolved
## Cобачка отправляется в HTML
solarrust marked this conversation as resolved.
Show resolved Hide resolved

Давайте отредактируем файл `index.ts` чтобы он создал сервер, который выдаст HTML страницу с прямоугольником и собачкой.
HellSquirrel marked this conversation as resolved.
Show resolved Hide resolved

```tsx
import { renderToString } from "react-dom/server";
import { rectangleElement } from './Rectangle';

const html = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Собачка в прямоугольнике</title>
</head>
<body>
${renderToString(rectangleElement)}
</body>
</html>`

Bun.serve({
port: 8080,
async fetch() {
return new Response(html, {
headers: {
"Content-Type": "text/html",
}
});
},
});
```

Запускаем:
HellSquirrel marked this conversation as resolved.
Show resolved Hide resolved
```bash
npx bun index.ts
```
Открываем [http://localhost:8080](http://localhost:8080), если вы видите собачку значит у вас все получилось, а мне не нужно редактировать эту статью :)
HellSquirrel marked this conversation as resolved.
Show resolved Hide resolved

Разберемся что просходит в файле `index.ts`:
Мы сделали свой собственный [серверный рендеринг](https://react.dev/reference/react-dom/server) с очень ограниченными возможностями. Например в текущей реализации мы никак не можем добавить интерактивности к нашей собачке :( Здесь нам этого и не нужно, мы резберемся как оживлять React-миры позже.

Мы импортировали наш элемент `rectangleElement` функцию `renderToString` из библиотеки `react-dom/server`. Эта функция преобразует React-элемент в строку, которую можно вставить в HTML.

Дальше мы создали шаблон HTML страницы, вставили в него наш прямоугольник и собачку
После этого мы вызвали специальное API из нашего инструментария. [`Bun.serve`](https://bun.sh/docs/api/http) создает сервер, который отдает нашу HTML страницу. Чтобы это сделать мы определили колбек `fetch`, который возвращает ответ `Response` с нашей HTML страницей.
solarrust marked this conversation as resolved.
Show resolved Hide resolved