К основному содержанию
скилл CX Codex

encore-frontend — скилл для Claude Code: клиент Encore.ts и фронтенд

Скилл связывает фронтенд на React, Next.js, Vue или Svelte с бэкендом Encore.ts: генерация типизированного клиента, CORS и токены авторизации.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add encoredev/skills --skill encore-frontend -a claude-code
npx skills add encoredev/skills --skill frontend -a claude-code
Открыть на GitHub

Что делает encore-frontend

Скилл подсказывает агенту, как подключить браузерный код к API на Encore.ts. Он ведёт по трём вещам: генерация TypeScript-клиента командой encore gen client, настройка CORS в encore.app и передача токена авторизации через заголовок Authorization.

Клиент генерируется под конкретное окружение: encore gen client --output=./frontend/src/client.ts --env=local для локальной разработки, --env=staging для развёрнутого. Внутри — типизированные вызовы вида client.user.getUser({ id: "123" }). В скилле есть примеры для React с useState, для TanStack Query с useQuery и useMutation, для серверных компонентов Next.js. Если генерировать клиент не хочется, остаётся обычный fetch.

Для запросов с куками и заголовками авторизации нужен allow_origins_with_credentials в encore.app — без него браузер отклонит такой запрос. Адрес API держите в переменных окружения: VITE_API_URL для Vite, NEXT_PUBLIC_API_URL для Next.js. И не забудьте перегенерировать клиент после правок API, иначе типы разъедутся с бэкендом.

Какие задачи решает

  • сгенерировать типизированный TypeScript-клиент под локальное или staging-окружение
  • настроить CORS в encore.app для доменов продакшена
  • пробросить токен авторизации через заголовок Authorization
  • подключить API Encore к React-компоненту с загрузкой и ошибками
  • вызвать эндпоинт из серверного компонента Next.js

Примеры запросов агенту

  • Сгенерируй TypeScript-клиент для Encore и подключи его к React-компоненту профиля
  • Настрой CORS в encore.app, чтобы фронтенд с localhost:3000 мог обращаться к бэкенду
  • Покажи, как передать токен авторизации в запросах через TanStack Query

Как установить encore-frontend

1Через Skills CLI (Vercel)

npx skills add encoredev/skills --skill encore-frontend -a claude-code
npx skills add encoredev/skills --skill frontend -a claude-code

2Вручную: положить файлы

~/.claude/skills/frontend/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/frontend/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора10

encore-api Помогает агенту писать эндпоинты Encore.ts через api(...): типы запроса и ответа, параметры пути, валидация, ошибки. CX Codex +1 828установок encore-code-review Скилл проверяет код на Encore.ts перед мержем: инфраструктура внутри функций, require() вместо импортов, сырые Error вместо APIError. CX Codex +1 819установок encore-testing Помогает писать и запускать автотесты для Encore.ts через encore test и vitest или jest. Пригодится, когда нужно покрыть эндпоинт или сервис и не возиться с изолированными базами вручную. CX Codex +1 791установок encore-go-code-review Скилл проверяет Go-код на Encore: инфраструктура внутри функций, забытый context, SQL-инъекции и другие анти-паттерны перед мержем. CX Codex +1 553установок encore-bucket Учит агента работать с объектным хранилищем Encore.ts: загрузка, скачивание, список и удаление файлов через Bucket. CX Codex +1 419установок encore-webhook Скилл учит агента принимать входящие вебхуки от Stripe, GitHub, Slack и других сервисов через api.raw() и проверять подписи. CX Codex +1 418установок encore-go-secret Скилл учит агента объявлять API-ключи и пароли в Encore Go через структуру secrets и задавать значения по окружениям. CX Codex +1 307установок encore-go-bucket Скилл подсказывает агенту, как объявлять бакеты и работать с файлами в Encore Go: загрузка, выгрузка, подписанные ссылки. CX Codex +1 307установок

Похожие

frontend-patterns affaan-m Скилл подсказывает паттерны для React и Next.js: компоненты, состояние, загрузка данных и производительность. Нужен при разработке и ревью интерфейса. CX Codex +1 5 900установок senior-frontend Alireza Rezvani Скилл помогает создавать React-компоненты, запускать проекты Next.js и проверять размер бандла. Пригодится при разработке интерфейса, аудите кода и настройке доступности. 1 630установок frontend-developer sickn33 Помогает проектировать и писать интерфейсы на React и Next.js с адаптивностью, состоянием и доступностью. Нужен при разработке компонентов и страниц. CX Codex +1 1 300установок frontend-a11y affaan-m Скилл подсказывает доступные паттерны для React и Next.js: формы, ARIA, клавиатурная навигация и фокус. Пригодится для разработки и ревью. CX Codex +1 4 800установок design-taste-frontend-v1 nexu-io Оригинальная первая версия скилла с жёсткими правилами вёрстки для React и Next.js. Пригодится проектам, которым нужна точная обратная совместимость со старым поведением генератора. CX Codex +1 1 700установок frontend-enhancer ailabs-393 Скилл для Next.js: готовые компоненты, палитры, анимации и шаблоны секций. Пригодится, когда интерфейс выглядит сыро и нужен план правок. CX Codex +1 968установок

Рядом в теме «Фронтенд и UI»

Всё по теме «Фронтенд и UI» →

Вопросы о encore-frontend

Как установить encore-frontend в Claude?

Выполните npx skills add encoredev/skills --skill encore-frontend -a claude-code. Скилл встанет в ~/.claude/skills/frontend/SKILL.md.

Что делает encore-frontend?

Помогает агенту подключить фронтенд на React, Next.js, Vue, Svelte, SvelteKit, Remix или Astro к бэкенду Encore.ts: генерация клиента, CORS, авторизация.

Нужен ли сгенерированный клиент для работы с Encore?

Нет. В скилле есть раздел про обычный fetch с проверкой response.ok, если генерировать клиент не хочется.

Исходный текст

SKILL.md · Apache-2.0
---
name: encore-frontend
description: Connect a frontend application (React, Next.js, Vue, Svelte, etc.) to an Encore.ts backend.
when_to_use: >-
  User wants to generate a TypeScript API client for the browser (`encore gen client`), call Encore endpoints from React/Next.js/Vue/Svelte/SvelteKit/Remix/Astro, configure CORS in `encore.app`, or wire authentication tokens through a generated client. Trigger phrases: "TypeScript client", "API client", "Next.js frontend", "React frontend", "encore gen client", "CORS", "browser fetch", "SPA", "frontend can call this backend".
---

# Frontend Integration with Encore

## Instructions

Encore provides tools to connect your frontend applications to your backend APIs.

### Generate a TypeScript Client

```bash
# Generate client for local development
encore gen client --output=./frontend/src/client.ts --env=local

# Generate client for a deployed environment
encore gen client --output=./frontend/src/client.ts --env=staging
```

This generates a fully typed client based on your API definitions.

### Using the Generated Client

```typescript
// frontend/src/client.ts is auto-generated
import Client from "./client";

const client = new Client("http://localhost:4000");

// Fully typed API calls
const user = await client.user.getUser({ id: "123" });
console.log(user.email);

const newUser = await client.user.createUser({
  email: "[email protected]",
  name: "New User",
});
```

### React Example

```tsx
// frontend/src/components/UserProfile.tsx
import { useState, useEffect } from "react";
import Client from "../client";

const client = new Client(import.meta.env.VITE_API_URL);

export function UserProfile({ userId }: { userId: string }) {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    client.user.getUser({ id: userId })
      .then(setUser)
      .catch(setError)
      .finally(() => setLoading(false));
  }, [userId]);

  if (loading) return <div>Loading...</div>;
  if (error) return <div>Error: {error.message}</div>;
  
  return (
    <div>
      <h1>{user.name}</h1>
      <p>{user.email}</p>
    </div>
  );
}
```

### React with TanStack Query

```tsx
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import Client from "../client";

const client = new Client(import.meta.env.VITE_API_URL);

export function UserProfile({ userId }: { userId: string }) {
  const { data: user, isLoading, error } = useQuery({
    queryKey: ["user", userId],
    queryFn: () => client.user.getUser({ id: userId }),
  });

  if (isLoading) return <div>Loading...</div>;
  if (error) return <div>Error: {error.message}</div>;
  
  return <div>{user.name}</div>;
}

export function CreateUserForm() {
  const queryClient = useQueryClient();
  
  const mutation = useMutation({
    mutationFn: (data: { email: string; name: string }) => 
      client.user.createUser(data),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ["users"] });
    },
  });

  const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    const formData = new FormData(e.currentTarget);
    mutation.mutate({
      email: formData.get("email") as string,
      name: formData.get("name") as string,
    });
  };

  return (
    <form onSubmit={handleSubmit}>
      <input name="email" type="email" required />
      <input name="name" required />
      <button type="submit" disabled={mutation.isPending}>
        {mutation.isPending ? "Creating..." : "Create User"}
      </button>
    </form>
  );
}
```

### Next.js Server Components

```tsx
// app/users/[id]/page.tsx
import Client from "@/lib/client";

const client = new Client(process.env.API_URL);

export default async function UserPage({ params }: { params: { id: string } }) {
  const user = await client.user.getUser({ id: params.id });
  
  return (
    <div>
      <h1>{user.name}</h1>
      <p>{user.email}</p>
    </div>
  );
}
```

### CORS Configuration

Configure CORS in your `encore.app` file:

```json
{
    "id": "my-app",
    "global_cors": {
        "allow_origins_with_credentials": [
            "http://localhost:3000",
            "https://myapp.com",
            "https://*.myapp.com"
        ]
    }
}
```

### CORS Options

| Option | Description |
|--------|-------------|
| `allow_origins_without_credentials` | Origins allowed for non-credentialed requests (default: `["*"]`) |
| `allow_origins_with_credentials` | Origins allowed for credentialed requests (cookies, auth headers) |
| `allow_headers` | Additional request headers to allow |
| `expose_headers` | Additional response headers to expose |
| `debug` | Enable CORS debug logging |

### Authentication from Frontend

For authenticated requests, pass the Authorization header:

```typescript
// Using fetch
const response = await fetch("http://localhost:4000/profile", {
  headers: {
    "Authorization": `Bearer ${token}`,
  },
});

// Or include credentials for cookie-based auth
const response = await fetch("http://localhost:4000/profile", {
  credentials: "include",
});
```

With TanStack Query, configure a default fetcher:

```typescript
const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      queryFn: async ({ queryKey }) => {
        const response = await fetch(queryKey[0] as string, {
          headers: { Authorization: `Bearer ${getToken()}` },
        });
        if (!response.ok) throw new Error("Request failed");
        return response.json();
      },
    },
  },
});
```

### Using Plain Fetch

If you prefer not to use the generated client:

```typescript
async function getUser(id: string) {
  const response = await fetch(`http://localhost:4000/users/${id}`);
  if (!response.ok) {
    throw new Error(`HTTP error: ${response.status}`);
  }
  return response.json();
}

async function createUser(email: string, name: string) {
  const response = await fetch("http://localhost:4000/users", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ email, name }),
  });
  if (!response.ok) {
    throw new Error(`HTTP error: ${response.status}`);
  }
  return response.json();
}
```

### Environment Variables

```bash
# .env.local (Next.js)
NEXT_PUBLIC_API_URL=http://localhost:4000

# .env (Vite)
VITE_API_URL=http://localhost:4000
```

### Guidelines

- Use `encore gen client` to generate typed API clients
- Regenerate the client when your API changes
- Configure CORS in `encore.app` for production domains
- Use `allow_origins_with_credentials` for authenticated requests
- Include `Authorization` header for token-based auth
- Use `credentials: "include"` for cookie-based auth
- Use environment variables for API URLs (different per environment)
- The generated client handles errors and types automatically

© encoredev · Apache-2.0 · encoredev/skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой