# Fumadocs (Framework Mode, TanStack Start): Takumi
URL: /zh-TW/docs/tanstack-start/integrations/og/takumi
Source: https://raw.githubusercontent.com/fuma-nama/fumadocs/refs/heads/main/apps/docs/content/docs/(framework)/[framework]/integrations/og/takumi.zh-TW.mdx

整合 Takumi，快速產生中繼資料圖片，且不受框架限制。

## 安裝 [#installation]

```npm
npm install takumi-js
```

## 中繼資料圖片 [#metadata-image]

新增一個回傳頁面圖片 URL 的函式，並在文件頁面的中繼資料中引用該圖片：

```ts tab="src/lib/shared.ts"
import { createGetUrl } from 'fumadocs-core/source';

// [!code ++:7]
const getImageUrl = createGetUrl('/og/docs');

export function getPageImageUrl(page: { slugs: string[]; locale?: string }) {
  const segments = [...page.slugs, 'image.webp'];

  return { segments, url: getImageUrl(segments, page.locale) };
}
```

```tsx tab="src/routes/docs/$.tsx"
// [!code ++]
import { getPageImageUrl } from '@/lib/shared';

export const Route = createFileRoute('/docs/$')({
  // [!code ++:3]
  head: ({ loaderData }) => ({
    meta: loaderData ? [{ property: 'og:image', content: loaderData.imageUrl }] : [],
  }),
});

// 在您的 server function 中的某處
return {
  // [!code ++]
  imageUrl: getPageImageUrl(page).url,
};
```

> `/docs/my-page` 的圖片位於 `/og/docs/my-page/image.webp`，因為 WebP 圖片的檔案比 PNG 小。若要產生 PNG，請改用 `image.png` 與 `format: 'png'`。

接著建立用來產生圖片的路由：

```ts tab="src/routes/og/docs/$.ts"
import { createFileRoute } from '@tanstack/react-router';
import { generateOGImage } from 'fumadocs-ui/og/takumi';
import { source } from '@/lib/source';

export const Route = createFileRoute('/og/docs/$')({
  server: {
    handlers: {
      GET: ({ params }) => {
        const slugs = (params._splat?.split('/') ?? []).filter((v) => v.length > 0).slice(0, -1);
        const page = source.getPage(slugs);
        if (!page) return new Response(undefined, { status: 404 });

        return generateOGImage({
          title: page.data.title,
          description: page.data.description,
          site: 'My App',
          format: 'webp',
        });
      },
    },
  },
});
```

```ts tab="vite.config.ts"
// 僅限 SPA 模式：TanStack Start 會將回應以文字形式預先算繪，導致圖片無法正常顯示
import { defineConfig } from 'vite';
import { nitro } from 'nitro/vite';
// [!code ++:3]
import { glob } from 'node:fs/promises';
import { getSlugs } from 'fumadocs-core/source';
import { getPageImageUrl } from './src/lib/shared';

// [!code ++:4]
const imageRoutes: string[] = [];
for await (const entry of glob('**/*.{md,mdx}', { cwd: 'content/docs' })) {
  imageRoutes.push(getPageImageUrl({ slugs: getSlugs(entry) }).url);
}

export default defineConfig({
  plugins: [
    // 其他外掛...
    nitro({
      // [!code ++]
      prerender: { routes: imageRoutes },
    }),
  ],
});
```

> Takumi 已內建完整字重軸 (100-900) 的 [`Geist`](https://vercel.com/font) 與 `Geist Mono` 字型，無須另外設定字型。

進階用法請參閱 [Takumi 官方文件](https://takumi.kane.tw/docs)。

### 其他範本 [#other-templates]

可用的範本請參閱 [Takumi 範本](https://takumi.kane.tw/docs/templates)。