В статье вы познакомитесь с React и создадите первый простой компонент — прямоугольник с собачкой. В этом примере мы не будем запускать код в браузере. Вместо этого напишем простой скрипт, который запустит сервер и отдаст HTML-страницу с компонентом. Эта техника называется рендеринг на стороне сервера (Server-Side Rendering, SSR).
Что такое React?
СкопированоReact — это библиотека, которая позволяет создавать переиспользуемые кусочки интерфейса – компоненты. Для описания компонента вы используете JavaScript или TypeScript, специальные правила и синтаксис, который называется JSX.
Комбинируя компоненты, вы создаёте свой уникальный React-мир.
Обычно код React-компонентов запускается в браузере. Так как браузеры не понимают JSX, нужно несколько дополнительных шагов, чтобы показать наш React-мир пользователям:
- Создать компонент с помощью JavaScript/TypeScript и JSX.
- Написать код для отображения компонента.
- Преобразовать весь код в понятный браузеру JavaScript (без JSX).
- Подключить преобразованный код к HTML-странице. (как и любой другой JavaScript, используя тег
<script>
).
Однако в этой статье мы сделаем всё по-другому 🙃
- Создадим компонент с помощью TypeScript и JSX (тот же самый шаг).
- Напишем скрипт, который запускает сервер и отдаёт HTML-страницу с нашим компонентом.
- Откроем страницу и полюбуемся результатом.
Подготовка рабочего места
СкопированоЗдесь и далее я предполагаю, что вы работаете на macOS. Для Windows и Linux инструкции не должны отличаться, но если у вас вдруг что-то не заведётся, приносите issues.
Если вы используете Windows, посмотрите в сторону WSL.
Убедитесь, что у вас установлен Node.js. Если Node.js нет, скачайте его с официального сайта программной платформы.
Создайте папку для проекта и перейдите в неё в терминале.
mkdir -p expressive-react/rectanglecd expressive-react/rectangle
mkdir -p expressive-react/rectangle cd expressive-react/rectangle
Выполните команду:
npx bun init
npx bun init
Булочка создаст все нужные файлы и папки.
Выполните команду:
npx bun index.ts
npx bun index.ts
Полюбуйтесь на «Hello, World!» в консоли.
Теперь установите React.
npx bun install react react-dom
npx bun install react react-dom
Создаём прямоугольник и собачку
СкопированоСоздайте файл Rectangle.tsx с таким содержимым:
const Rectangle = () => <div style={{border: "1px solid brown" }}>🐶</div>;export const rectangleElement = <Rectangle />;
const Rectangle = () => <div style={{border: "1px solid brown" }}>🐶</div>; export const rectangleElement = <Rectangle />;
В этом файле создаётся React-компонент Rectangle
. Любой React-компонент — это просто функция, которая возвращает разметку, описанную при помощи JSX.
Затем создадим React
. React
— это то, что может отобразить браузер. Вы можете думать о React-компоненте как о шаблоне, а о React
как о конкретном экземпляре этого шаблона.
Мы экспортировали React
, чтобы переиспользовать его в другом файле.
Генерируем HTML
СкопированоДобавим в файл index.ts код, который будет создавать и запускать сервер. В результате работы сервер выдаст HTML-страницу с собачкой в прямоугольнике.
import { renderToString } from "react-dom/server";import { rectangleElement } from './Rectangle';const html = `<!DOCTYPE html><html lang="ru"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Собачка в прямоугольнике</title></head><body> ${renderToString(rectangleElement)}</body></html>`Bun.serve({ port: 8080, async fetch() { return new Response(html, { headers: { "Content-Type": "text/html", } }); },});
import { renderToString } from "react-dom/server"; import { rectangleElement } from './Rectangle'; const html = ` <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Собачка в прямоугольнике</title> </head> <body> ${renderToString(rectangleElement)} </body> </html>` Bun.serve({ port: 8080, async fetch() { return new Response(html, { headers: { "Content-Type": "text/html", } }); }, });
Запускаем сервер командой:
npx bun index.ts
npx bun index.ts
Откройте http://localhost:8080, и убедитесь, что собачка видна. Если да, то значит всё получилось, а мне не нужно редактировать эту статью 😊
Разберёмся, что происходит в файле index.ts. Мы импортировали элемент rectangle
и функцию render
из библиотеки react
. Эта функция преобразует React-элемент в строку, которую можно вставить в HTML.
Как это работает?
СкопированоМы сделали свой собственный серверный рендеринг с очень ограниченными возможностями. Например, в текущей реализации мы не можем добавить интерактивности собачке ☹️ Здесь нам это и не нужно, мы разберёмся как оживлять React-миры в другой статье.
Дальше мы создали шаблон HTML-страницы, вставили в него наш прямоугольник и собачку. После этого мы вызвали специальное API из нашего инструментария. Bun
создаёт сервер, который отдаёт нашу HTML-страницу. Чтобы это сделать, мы определили колбэк fetch
, который возвращает ответ Response
с нашей страницей.
На практике
Скопированосоветует Скопировано
Для установки bun
на Windows необязательно использовать WSL. Официальная документация содержит раздел с описанием установки на Windows 10.
Для установки требуется выполнить команду:
powershell -c "irm bun.sh/install.ps1|iex"
powershell -c "irm bun.sh/install.ps1|iex"
☝️ После установки не забудьте перезапустить терминал.
Для проверки успешности установки выполните команду:
bun --version
bun --version
После успешной установки во всех приведённых в статье командах вместо npx bun
используйте bun
. Например:
bun index.ts
bun index.ts