Bird
Raised Fist0
NextJSframework~8 mins

Form actions with server functions in NextJS - Performance & Optimization

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Performance: Form actions with server functions
MEDIUM IMPACT
This affects how quickly a form submission is processed and how fast the page updates after submission.
Handling form submission in a Next.js app
NextJS
'use server'

import { redirect } from 'next/navigation';

export const action = async (formData) => {
  // server-side processing
  return redirect('/success');
};

export default function MyForm() {
  return <form action={action}>...</form>;
}
Form submits directly to server function, reducing client JS and improving responsiveness.
📈 Performance GainNo client fetch delay, smaller client bundle by ~5-10kb, faster INP due to server handling.
Handling form submission in a Next.js app
NextJS
function MyForm() {
  const handleSubmit = async (event) => {
    event.preventDefault();
    const data = new FormData(event.target);
    await fetch('/api/submit', { method: 'POST', body: data });
    // client-side state update
  };
  return <form onSubmit={handleSubmit}>...</form>;
}
Client-side JavaScript handles submission and calls API, adding bundle size and delaying response.
📉 Performance CostBlocks interaction during fetch, adds ~5-10kb to client bundle, triggers multiple reflows on state update.
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Client-side fetch on submitMultiple (form + state updates)Multiple reflows on state changeMedium paint cost[X] Bad
Server function form actionMinimal (form submit only)Single reflow after redirectLow paint cost[OK] Good
Rendering Pipeline
Form submission triggers a server function call, bypassing client fetch and state updates, reducing layout recalculations.
Network
Server Processing
Layout
Paint
⚠️ BottleneckNetwork round-trip and server processing time
Core Web Vital Affected
INP
This affects how quickly a form submission is processed and how fast the page updates after submission.
Optimization Tips
1Use server functions to handle form submissions to reduce client JavaScript.
2Avoid client fetch calls on submit to improve input responsiveness (INP).
3Minimize client state updates triggered by form submissions to reduce reflows.
Performance Quiz - 3 Questions
Test your performance knowledge
What is a main performance benefit of using server functions for form actions in Next.js?
ATriggers more reflows on form submit
BReduces client-side JavaScript bundle size
CIncreases client-side state updates
DBlocks server processing
DevTools: Performance
How to check: Record a submission interaction, then inspect the flame chart for scripting and network delays.
What to look for: Look for long scripting tasks on client and network wait times; shorter scripting means better performance.

Practice

(1/5)
1. What is the main purpose of using form actions with server functions in Next.js App Router?
easy
A. To fetch data from an external API on the client
B. To run client-side validation before submitting the form
C. To style the form elements dynamically
D. To handle form submissions securely on the server without client-side JavaScript

Solution

  1. Step 1: Understand form actions role

    Form actions in Next.js let you handle form data processing on the server side, improving security and simplicity.
  2. Step 2: Compare with client-side logic

    Unlike client-side validation or styling, form actions avoid running JavaScript in the browser for form handling.
  3. Final Answer:

    To handle form submissions securely on the server without client-side JavaScript -> Option D
  4. Quick Check:

    Form actions = server-side handling [OK]
Hint: Form actions run on server, not client [OK]
Common Mistakes:
  • Thinking form actions run client-side
  • Confusing form styling with form handling
  • Assuming form actions fetch external APIs on client
2. Which of the following is the correct way to define a server action function for a form in Next.js?
easy
A. export async function action(formData) { /* handle data */ }
B. function action() { return }
C. const action = () => console.log('submit')
D. export default function action() { alert('submitted') }

Solution

  1. Step 1: Identify server action syntax

    Server actions are async functions exported to handle form data, receiving formData as parameter.
  2. Step 2: Check other options

    Other options either return JSX incorrectly or use client-side code like alert or console.log without async/await.
  3. Final Answer:

    export async function action(formData) { /* handle data */ } -> Option A
  4. Quick Check:

    Server action = async export function [OK]
Hint: Server actions are async exported functions with formData param [OK]
Common Mistakes:
  • Defining action as a React component
  • Using alert or console.log inside server action
  • Not marking function as async
3. Given this server action function in Next.js, what will be the output after submitting the form?
export async function action(formData) {
  const name = formData.get('name');
  return new Response(`Hello, ${name}!`);
}
medium
A. The page will reload without any message
B. The form data is ignored and no response is sent
C. The server responds with 'Hello, [name]!' where [name] is the input value
D. A syntax error occurs because Response is not allowed

Solution

  1. Step 1: Extract form data value

    The function uses formData.get('name') to get the input named 'name'.
  2. Step 2: Return a Response with greeting

    The function returns a Response object with a greeting message including the name value.
  3. Final Answer:

    The server responds with 'Hello, [name]!' where [name] is the input value -> Option C
  4. Quick Check:

    formData.get + Response = greeting message [OK]
Hint: formData.get returns input value used in Response [OK]
Common Mistakes:
  • Assuming Response is invalid in server action
  • Thinking form data is ignored
  • Expecting page reload without message
4. Identify the error in this Next.js server action function:
export async function action(formData) {
  const email = formData.email;
  return new Response(`Email: ${email}`);
}
medium
A. Response object cannot be returned from server actions
B. Using formData.email instead of formData.get('email')
C. Missing async keyword in function declaration
D. Function should not be exported

Solution

  1. Step 1: Check how formData is accessed

    formData is a FormData object; to get values, use formData.get('fieldName'), not dot notation.
  2. Step 2: Validate other parts

    The function is async and exported correctly; returning Response is allowed in server actions.
  3. Final Answer:

    Using formData.email instead of formData.get('email') -> Option B
  4. Quick Check:

    Access formData with get() method [OK]
Hint: Use formData.get('field') to access form values [OK]
Common Mistakes:
  • Accessing formData fields with dot notation
  • Forgetting async keyword
  • Thinking Response cannot be returned
5. You want to create a Next.js form that submits user feedback and then redirects to a thank-you page using a server action. Which code snippet correctly implements this behavior?
export async function action(formData) {
  const feedback = formData.get('feedback');
  // Save feedback to database (omitted)
  return redirect('/thank-you');
}
hard
A. This code correctly handles form data and redirects after submission
B. You cannot use redirect in server actions; must return JSON instead
C. The formData.get call should be replaced with formData.feedback
D. Server actions cannot perform side effects like saving data

Solution

  1. Step 1: Verify form data retrieval

    The code correctly uses formData.get('feedback') to get the input value.
  2. Step 2: Confirm redirect usage

    Next.js server actions support returning redirect() to navigate after processing.
  3. Final Answer:

    This code correctly handles form data and redirects after submission -> Option A
  4. Quick Check:

    formData.get + redirect() = correct pattern [OK]
Hint: Use redirect() in server action to navigate after submit [OK]
Common Mistakes:
  • Thinking redirect() is not allowed in server actions
  • Accessing formData with dot notation
  • Believing server actions cannot save data or cause side effects