Початок нового React-проєкту
Якщо ви вирішили розробити новий застосунок або новий вебсайт цілком за допомогою React, ми радимо вибрати один із популярних у нашій спільноті React-фреймворків.
Ви можете використовувати React без фреймворку, проте ми з’ясували, що більшість застосунків і сайтів, зрештою, створюють рішення для поширених проблем, наприклад: розбиття коду, маршрутизації, отримання даних і генерування HTML. Ці проблеми — спільні для всіх бібліотек UI, а не лише для React.
Вибравши фреймворк, можна швидко почати роботу з React і уникнути, по суті, розробки власного фреймворку пізніше.
Deep Dive
Звісно можна використовувати React без фреймворку — так само, як можна використовувати React для частини сторінки. Однак якщо ви розробляєте новий застосунок або сайт повністю за допомогою React, ми радимо скористатися фреймворком.
І ось чому.
Навіть якщо вам спершу не потрібні маршрутизація чи отримання даних, то існує ймовірність того, що ви захочете додати для цих функцій кілька бібліотек. Поки ваш бандл JavaScript розростатиметься з кожною новою функцією, ви будете розбиратися, як розбити код для кожного окремого маршруту. Поки ваші потреби з отримання даних ускладнюватимуться, ймовірно, ви зустрінете серверно-клієнтські мережеві водоспади, що зроблять ваш застосунок дуже повільним. Коли серед ваших користувачів з’явиться більше осіб із поганим з’єднанням і бюджетними пристроями, вам може знадобитися генерація HTML із компонентів, щоб показувати вміст раніше — або з боку сервера, або під час збирання сайту. Зміна налаштувань для виконання частини коду на сервері чи під час збирання може стати завданням із зірочкою.
Ці проблеми не стосуються лише React. Це саме те, через що у Svelte є SvelteKit, у Vue є Nuxt і так далі. Щоб вирішити ці проблеми самотужки, доведеться інтегрувати свій бандлер зі своїм маршрутизатором і зі своєю бібліотекою отримання даних. Неважко змусити працювати вкупі якийсь базовий варіант, проте є чимало тонкощів у створенні застосунку, який, зростаючи з часом, буде все ще швидко завантажуватися. Захочеться надсилати до браузера якнайменшу кількість коду застосунку, але робити це за один захід клієнт-сервер і паралельно до завантаження всіх необхідних на сторінці даних. Ймовірно, захочеться, щоб сторінка була інтерактивною навіть до виконання коду JavaScript, щоб підтримувати поступове покращення (progressive enhancement). Може захотітися генерувати теку повністю статичних файлів HTML для рекламних сторінок, які можуть викладатися будь-де і працювати навіть із вимкненим JavaScript. Розробка такого функціоналу вимагає суттєвих зусиль.
Наведені на цій сторінці фреймворки React вже вирішують такі проблеми, не потребуючи додаткових зусиль з вашого боку. Вони дають змогу почати з малого, аби потім масштабувати застосунок відповідно до потреб. Кожний React-фреймворк має свою спільноту, тож шукати відповіді на питання та оновлювати інструменти розробки буде легше. Також фреймворки задають структуру коду, допомагаючи вам та іншим зберігати той самий контекст і користуватися тими ж навичками в різних проєктах. І навпаки: із саморобними налаштуваннями легше застрягнути у версіях залежностей, що більше не підтримуються, і, по суті, доведеться створювати власний фреймворк — але без власної спільноти та інструкцій з оновлення (і якщо він буде схожим на те, що колись писали ми, то цей ваш фреймворк буде написаний абияк).
Якщо ваш застосунок містить незвичні обмеження, які не спрацюють із переліченими нижче фреймворками, або ви хочете розв’язувати ці проблеми самотужки, то можете розгорнути власну конфігурацію з React. Візьміть react
і react-dom
із npm, налаштуйте власний процес збирання з використанням бандлеру, як-от Vite або Parcel, і додавайте інші інструменти за необхідності для маршрутизації, статичної генерації, серверного рендерингу чи чогось іще.
Готові до впровадження фреймворки React
Ці фреймворки підтримують усі функції, що знадобляться для розгортання та масштабування застосунку в публічному середовищі (in production), та прямують до підтримки нашого бачення архітектури повного стеку. Усі фреймворки, які ми радимо, є відкритим програмним забезпеченням з активною спільнотою для підтримки та можуть бути розгорнуті на власних серверах чи сторонніх хостингах. Якщо ви автор фреймворку та зацікавлені у потраплянні до цього списку, будь ласка, повідомте нас.
Next.js
Page Router від Next.js — це фреймворк React повного стеку. Він багатоцільовий та дає змогу розробляти застосунки React будь-якого розміру — від здебільшого статичних блогів до складних динамічних програм. Щоб створити новий проєкт Next.js, запустіть у терміналі:
Якщо Next.js — це для вас дещо нове, то погляньте на курс вивчення Next.js.
Next.js підтримується командою Vercel. Розгорнути застосунок Next.js можна на будь-якому Node.js- або безсерверному хостингу, а також на власному сервері. Також Next.js підтримує статичне експортування, якому не потрібен сервер.
Remix
Remix — це фреймворк React повного стеку з вкладеною маршрутизацією. Він дає змогу розбивати застосунок на вкладені одна в одну частини, які можуть паралельно завантажувати дані та оновлювати їх, реагуючи на дії користувача. Щоб створити новий проєкт Remix, запустіть:
Якщо Remix — це для вас щось нове, перегляньте його посібник зі створення блогу (коротко) та посібник зі створення застосунку (довго).
Remix підтримується командою Shopify. Для створення проєкту Remix необхідно вибрати свій варіант шаблону для розгортання. Застосунок Remix можна розгорнути на будь-якому хостингу, що підтримує Node.js або є безсерверним, за допомогою готового чи власного адаптера.
Gatsby
Gatsby — це фреймворк React для швидких вебсайтів із системою керування вмістом. Його багата екосистема плагінів і шар даних на основі GraphQL спрощують інтеграцію вмісту, API і сторонніх служб в один вебсайт. Щоб створити новий проєкт Gatsby, запустіть:
Якщо Gatsby — це для вас щось нове, перегляньте підручник Gatsby.
Gatsby підтримується командою Netlify. Повністю статичний сайт Gatsby можна розгорнути на будь-якому статичному хостингу. За бажання скористатися суто серверними функціями фреймворку слід перевірити, що хостинг підтримує ці можливості для Gatsby.
Expo (для нативних застосунків)
Expo — це фреймворк React, що дає змогу створювати універсальні застосунки для Android, iOS і вебу з по-справжньому нативним UI. Він пропонує набір інструментів для React Native, завдяки якому цими нативними частинами легше користуватися. Щоб створити новий проєкт Expo, запустіть:
Якщо Expo — це для вас щось нове, перегляньте підручник Expo.
Expo підтримується компанією Expo. Розробляти застосунки за допомогою Expo можна безкоштовно, і їх можна подавати до каталогів застосунків Google і Apple без жодних обмежень. На додачу Expo пропонує необов’язкові платні хмарні послуги.
Передові фреймворки React
Під час досліджень заради подальшого покращення React ми усвідомили, що тісніша інтеграція React із фреймворками (а саме з маршрутизацією, згортанням і серверними технологіями) — це наша найбільша нагода допомогти користувачам React створювати кращі застосунки. Команда Next.js погодилася співпрацювати з нами щодо досліджень, розробки, інтегрування та тестування незалежних від фреймворків функцій React штибу серверних компонентів React.
З кожним днем ці функції наближаються до стану готовності до впровадження (production-ready), і ми обговорюємо їх інтеграцію з іншими розробниками бандлерів і фреймворків. Сподіваємося, що за рік чи два усі фреймворки, перелічені на цій сторінці, матимуть підтримку цих функцій. (Якщо ви автор фреймворку та зацікавлені у співпраці щодо експериментів із цими функціями, будь ласка, повідомте нас!)
Next.js (App Router)
App Router від Next.js — це переробка API Next.js, що прагне втілити бачення повностекової архітектури команди React. Вона дає змогу отримувати дані в асинхронних компонентах, що запускаються на сервері чи навіть під час збирання.
Next.js підтримується командою Vercel. Застосунок Next.js можна розгорнути на будь-якому Node.js- або безсерверному хостингу, а також на власному сервері. Також Next.js підтримує статичне експортування, якому не потрібен сервер.
Deep Dive
Бандлер App Router від Next.js повністю реалізує офіційну специфікацію серверних компонентів React. Це дає змогу поєднувати компоненти, що запускаються під час збирання, ті, що працюють суто на сервері, та інтерактивні компоненти в єдине дерево React.
Наприклад, можна написати суто серверний компонент React як async
функцію, що зчитує дані з бази даних або з файлу. Потім можна передати дані до інтерактивних компонентів:
// Цей компонент запускається *лише* на сервері (або під час збирання).
async function Talks({ confId }) {
// 1. Ви на сервері, тож можете спілкуватися зі своїм шаром даних. Наявність API — необов'язкова.
const talks = await db.Talks.findAll({ confId });
// 2. Додавайте будь-яку кількість логіки рендерингу. Це не збільшить ваш бандл JavaScript.
const videos = talks.map(talk => talk.video);
// 3. Передайте дані до компонентів, що запустяться в браузері.
return <SearchableVideoList videos={videos} />;
}
App Router від Next.js також інтегрує отримання даних із Suspense. Це дає змогу задати стан завантаження (наприклад, каркасний елемент для заповнення (skeleton placeholder)) для різних частин інтерфейсу безпосередньо в дереві React:
<Suspense fallback={<TalksLoading />}>
<Talks confId={conf.id} />
</Suspense>
Серверні компоненти та Suspense — це радше функції React, аніж Next.js. Проте їхнє залучення на рівні фреймворку вимагає нетривіальних зусиль для реалізації. Наразі App Router Next.js — це найповніша імплементація. Команда React працює разом із розробниками бандлерів, щоб було легше реалізувати ці функції в наступному поколінні фреймворків.