Українська

Дізнайтеся про серверні дії React — потужну функцію для обробки надсилань форм та мутацій даних безпосередньо на сервері, що спрощує розробку та підвищує безпеку.

Серверні дії React: спрощена обробка форм на стороні сервера

Серверні дії (Server Actions) React, представлені в React 18 і значно вдосконалені в Next.js, пропонують революційний підхід до обробки надсилань форм і мутацій даних безпосередньо на сервері. Ця потужна функція спрощує процес розробки, підвищує безпеку та покращує продуктивність у порівнянні з традиційним отриманням та маніпулюванням даними на стороні клієнта.

Що таке серверні дії React?

Серверні дії — це асинхронні функції, які виконуються на сервері та можуть викликатися безпосередньо з компонентів React. Вони дозволяють виконувати завдання на стороні сервера, такі як:

Ключова перевага серверних дій полягає в тому, що вони дозволяють писати серверний код у ваших компонентах React, усуваючи потребу в окремих маршрутах API та складній логіці отримання даних на стороні клієнта. Таке поєднання UI та серверної логіки призводить до більш зручної в обслуговуванні та ефективної кодової бази.

Переваги використання серверних дій React

Використання серверних дій React надає кілька значних переваг:

Спрощена розробка

Серверні дії зменшують кількість шаблонного коду, дозволяючи обробляти надсилання форм та мутації даних безпосередньо у ваших компонентах React. Це усуває потребу в окремих кінцевих точках API та складній логіці отримання даних на стороні клієнта, спрощуючи процес розробки та роблячи ваш код легшим для розуміння та підтримки. Розглянемо просту контактну форму. Без серверних дій вам знадобився б окремий маршрут API для обробки надсилання форми, клієнтський JavaScript для відправки даних та логіка обробки помилок як на клієнті, так і на сервері. З серверними діями все це можна обробити в самому компоненті.

Підвищена безпека

Виконуючи код на сервері, серверні дії зменшують поверхню атаки вашого застосунку. Конфіденційні дані та бізнес-логіка залишаються поза клієнтом, що не дозволяє зловмисникам маніпулювати ними. Наприклад, облікові дані бази даних або ключі API ніколи не розкриваються в клієнтському коді. Всі взаємодії з базою даних відбуваються на сервері, що знижує ризик SQL-ін'єкцій або несанкціонованого доступу до даних.

Покращена продуктивність

Серверні дії можуть покращити продуктивність, зменшуючи кількість JavaScript, який потрібно завантажувати та виконувати на клієнті. Це особливо корисно для користувачів на малопотужних пристроях або з повільним інтернет-з'єднанням. Обробка даних відбувається на сервері, і лише необхідні оновлення UI надсилаються клієнту, що призводить до швидшого завантаження сторінок та більш плавного користувацького досвіду.

Оптимістичні оновлення

Серверні дії безшовно інтегруються з Suspense та Transitions у React, що дозволяє реалізувати оптимістичні оновлення. Оптимістичні оновлення дозволяють негайно оновлювати UI, навіть до того, як сервер підтвердить дію. Це забезпечує більш чуйний та привабливий користувацький досвід, оскільки користувачам не доводиться чекати відповіді сервера, щоб побачити результати своїх дій. В електронній комерції додавання товару в кошик може відображатися миттєво, поки сервер підтверджує додавання у фоновому режимі.

Прогресивне покращення

Серверні дії підтримують прогресивне покращення, що означає, що ваш застосунок може функціонувати, навіть якщо JavaScript вимкнено або не завантажився. Коли JavaScript вимкнено, форми надсилатимуться як традиційні HTML-форми, і сервер обробить надсилання та перенаправить користувача на нову сторінку. Це гарантує, що ваш застосунок залишається доступним для всіх користувачів, незалежно від конфігурації їхнього браузера або умов мережі. Це особливо важливо для доступності та SEO.

Як використовувати серверні дії React

Щоб використовувати серверні дії React, вам потрібно використовувати фреймворк, який їх підтримує, наприклад, Next.js. Ось покрокова інструкція:

1. Визначте серверну дію

Створіть асинхронну функцію, яка буде виконуватися на сервері. Ця функція повинна обробляти логіку, яку ви хочете виконати на сервері, наприклад, оновлення бази даних або виклик API. Позначте функцію директивою `"use server"` на початку, щоб вказати, що це серверна дія. Ця директива вказує компілятору React розглядати функцію як серверну та автоматично обробляти серіалізацію та десеріалізацію даних між клієнтом та сервером.

// app/actions.js
'use server'

import { revalidatePath } from 'next/cache';
import { saveMessage } from './db';

export async function createMessage(prevState, formData) {
  const message = formData.get('message');

  try {
    await saveMessage(message);
    revalidatePath('/'); // Очистити кеш маршруту
    return { message: 'Повідомлення успішно збережено!' };
  } catch (e) {
    return { message: 'Не вдалося зберегти повідомлення' };
  }
}

Пояснення:

2. Імпортуйте та використовуйте серверну дію у вашому компоненті

Імпортуйте серверну дію у ваш компонент React і використовуйте її як пропс `action` для елемента форми. Хук `useFormState` можна використовувати для керування станом форми та відображення зворотного зв'язку користувачеві.

// app/page.jsx
'use client';

import { useFormState } from 'react-dom';
import { createMessage } from './actions';

export default function Home() {
  const [state, formAction] = useFormState(createMessage, {message: ''});

  return (
    
{state?.message &&

{state.message}

}
); }

Пояснення:

3. Обробка даних форми

Всередині серверної дії ви можете отримати доступ до даних форми за допомогою API `FormData`. Цей API надає зручний спосіб доступу до значень полів форми.

'use server'

export async function createMessage(prevState, formData) {
  const message = formData.get('message');

  // ...
}

4. Обробка помилок

Використовуйте блоки `try...catch` для обробки помилок, які можуть виникнути під час виконання серверної дії. Повертайте повідомлення про помилку в об'єкті стану, щоб відобразити його користувачеві.

'use server'

export async function createMessage(prevState, formData) {
  const message = formData.get('message');

  try {
    // ...
  } catch (e) {
    return { message: 'Не вдалося зберегти повідомлення' };
  }
}

5. Ревалідація даних

Після того, як серверна дія успішно змінила дані, вам може знадобитися ревалідувати кеш даних, щоб переконатися, що UI відображає останні зміни. Використовуйте функції `revalidatePath` або `revalidateTag` з `next/cache` для ревалідації конкретних шляхів або тегів.

'use server'

import { revalidatePath } from 'next/cache';

export async function createMessage(prevState, formData) {
  // ...
  revalidatePath('/'); // Очистити кеш маршруту
  // ...
}

Розширене використання

Мутація даних

Серверні дії особливо добре підходять для мутації даних, таких як оновлення баз даних або зовнішніх API. Ви можете використовувати серверні дії для обробки складних мутацій даних, які вимагають серверної логіки, наприклад, перевірки даних, виконання обчислень або взаємодії з кількома джерелами даних. Розглянемо сценарій, де вам потрібно оновити профіль користувача та надіслати лист-підтвердження. Серверна дія може обробити як оновлення бази даних, так і процес надсилання листа в одній атомарній операції.

Автентифікація та авторизація

Серверні дії можна використовувати для обробки автентифікації та авторизації. Виконуючи перевірки автентифікації та авторизації на сервері, ви можете гарантувати, що лише авторизовані користувачі мають доступ до конфіденційних даних та функціональності. Ви можете використовувати серверні дії для обробки входу користувачів, реєстрації та скидання пароля. Наприклад, серверна дія може перевірити облікові дані користувача в базі даних і повернути токен, який можна використовувати для автентифікації наступних запитів.

Edge-функції

Серверні дії можна розгортати як Edge-функції, які виконуються у глобальній мережі серверів, розташованих близько до ваших користувачів. Це може значно зменшити затримку та покращити продуктивність, особливо для користувачів у географічно віддалених місцях. Edge-функції ідеально підходять для обробки серверних дій, які вимагають низької затримки, таких як оновлення даних у реальному часі або доставка персоналізованого контенту. Next.js надає вбудовану підтримку для розгортання серверних дій як Edge-функцій.

Стримінг

Серверні дії підтримують стримінг, що дозволяє надсилати дані клієнту частинами, у міру їх доступності. Це може покращити сприйняття продуктивності вашого застосунку, особливо для серверних дій, які виконуються довго. Стримінг особливо корисний для обробки великих наборів даних або складних обчислень. Наприклад, ви можете передавати результати пошуку клієнту в міру їх отримання з бази даних, забезпечуючи більш чуйний користувацький досвід.

Найкращі практики

Ось деякі найкращі практики, яких слід дотримуватися при використанні серверних дій React:

Приклади з реального світу

Розглянемо деякі приклади з реального світу, як серверні дії React можуть використовуватися в різних типах застосунків:

Застосунок для електронної комерції

Застосунок для соціальних мереж

Система управління контентом (CMS)

Аспекти інтернаціоналізації

При розробці застосунків для глобальної аудиторії важливо враховувати інтернаціоналізацію (i18n) та локалізацію (l10n). Ось деякі аспекти використання серверних дій React в інтернаціоналізованих застосунках:

Наприклад, при обробці форми, яка вимагає введення дати, серверна дія може використовувати API `Intl.DateTimeFormat` для розбору дати відповідно до локалі користувача, гарантуючи, що дата буде правильно інтерпретована незалежно від регіональних налаштувань користувача.

Висновок

Серверні дії React — це потужний інструмент для спрощення обробки форм на стороні сервера та мутацій даних у застосунках React. Дозволяючи писати серверний код безпосередньо у ваших компонентах React, серверні дії зменшують кількість шаблонного коду, підвищують безпеку, покращують продуктивність та дозволяють реалізувати оптимістичні оновлення. Дотримуючись найкращих практик, викладених у цьому посібнику, ви можете використовувати серверні дії для створення більш надійних, масштабованих та зручних у підтримці застосунків React. Оскільки React продовжує розвиватися, серверні дії, безсумнівно, відіграватимуть все більш важливу роль у майбутньому веб-розробки.