All skills
sergiodxa avatar

/frontend-react-router-best-practices

@9da9532

React Router performance and architecture patterns. Use when writing loaders, actions, forms, routes, or working with React Router data fetching. Triggers on tasks involving React Router routes, data loading, form handling, or route organization.

Use this Skill: https://skilld.dev/gh/sergiodxa/agent-skills/frontend-react-router-best-practices

This session only. Nothing lands on disk.

rulesmigrate-json-to-data.md

≈872 tokens on demand. Your agent reads this file only when SKILL.md points to it.

Migrate from json() to data()

Replace json() with data() from react-router. The json() helper is deprecated with Single Fetch.

Why

  • json() is deprecated with Single Fetch enabled
  • data() is the new standard for all loader and action responses
  • data() supports automatic promise streaming
  • Consistent API for responses with or without status codes/headers

Migration Pattern

Loaders

// Before
import { json } from "react-router";

export async function loader({ request }: Route.LoaderArgs) {
  let items = await getItems();
  return json({ items });
}

// After
import { data } from "react-router";

export async function loader({ request }: Route.LoaderArgs) {
  let items = await getItems();
  return data({ items });
}

Actions

// Before
import { json } from "react-router";

export async function action({ request }: Route.ActionArgs) {
  let formData = await request.formData();
  let result = await processForm(formData);
  return json({ success: true, result });
}

// After
import { data } from "react-router";

export async function action({ request }: Route.ActionArgs) {
  let formData = await request.formData();
  let result = await processForm(formData);
  return data({ success: true, result });
}

With Status Codes

// Before
import { json } from "react-router";

export async function action({ request }: Route.ActionArgs) {
  try {
    // ... validation
  } catch (error) {
    if (error instanceof z.ZodError) {
      return json({ errors: error.issues }, { status: 400 });
    }
    throw error;
  }
}

// After
import { data } from "react-router";

export async function action({ request }: Route.ActionArgs) {
  try {
    // ... validation
  } catch (error) {
    if (error instanceof z.ZodError) {
      return data({ errors: error.issues }, { status: 400 });
    }
    throw error;
  }
}

With Headers

// Before
import { json } from "react-router";

export async function loader({ request }: Route.LoaderArgs) {
  let items = await getItems();
  return json(
    { items },
    {
      headers: {
        "Cache-Control": "max-age=300",
      },
    },
  );
}

// After
import { data } from "react-router";

export async function loader({ request }: Route.LoaderArgs) {
  let items = await getItems();
  return data(
    { items },
    {
      headers: {
        "Cache-Control": "max-age=300",
      },
    },
  );
}

Throwing Errors

// Before
import { json } from "react-router";

export async function loader({ params }: Route.LoaderArgs) {
  let item = await getItem(params.id);
  if (!item) {
    throw json({ message: "Not found" }, { status: 404 });
  }
  return json({ item });
}

// After
import { data } from "react-router";

export async function loader({ params }: Route.LoaderArgs) {
  let item = await getItem(params.id);
  if (!item) {
    throw data({ message: "Not found" }, { status: 404 });
  }
  return data({ item });
}

Important: Always Use data()

Do NOT return raw objects from loaders or actions:

// Bad: raw object return
export async function loader({ request }: Route.LoaderArgs) {
  let items = await getItems();
  return { items }; // Don't do this
}

// Good: always use data()
export async function loader({ request }: Route.LoaderArgs) {
  let items = await getItems();
  return data({ items });
}

Source: SKILL.md on GitHub

2 warnings16d5 checks · Risk SAFE
  • Gen Agent Trust Hub16d

    The skill provides a comprehensive set of developer guidelines and best practices for building React Router applications. It emphasizes performance, type safety, and security measures like input validation (Zod), safe redirects, and CSRF protection (Sec-Fetch). No malicious code, obfuscation, or data exfiltration patterns were detected.

  • Socket16d

    1 alert: gptSecurity

  • Snyk16d

    Risk: LOW · No issues

  • Runlayer7mo

    56/56 files flagged

  • ZeroLeaks5mo

    Score: 93/100 · 2 sections analyzed

Signed by skilld at 9da9532. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 2 months ago.

Dormantupdated 8 months ago

README badge

README badge for sergiodxa/agent-skills/frontend-react-router-best-practices