文件標頭 (Document Head) 管理是指管理文件的 head、title、meta、link 和 script 標籤的過程,而 TanStack Router 為使用 Start 的全端應用程式和使用 @tanstack/react-router 的單頁應用程式提供了一個強大的方式來管理文件標頭。它提供以下功能:
對於使用 Start 的全端應用程式,甚至是使用 @tanstack/react-router 的單頁應用程式來說,管理文件標頭是任何應用程式的關鍵部分,原因如下:
要管理文件標頭,您需要渲染 <HeadContent /> 和 <Scripts /> 元件,並使用 routeOptions.head 屬性來管理路由的標頭,該屬性返回一個包含 title、meta、links 和 scripts 屬性的物件。
export const Route = createRootRoute({
head: () => ({
meta: [
{
name: 'description',
content: 'My App is a web application',
},
{
title: 'My App',
},
],
links: [
{
rel: 'icon',
href: '/favicon.ico',
},
],
scripts: [
{
src: 'https://www.google-analytics.com/analytics.js',
},
],
}),
})
export const Route = createRootRoute({
head: () => ({
meta: [
{
name: 'description',
content: 'My App is a web application',
},
{
title: 'My App',
},
],
links: [
{
rel: 'icon',
href: '/favicon.ico',
},
],
scripts: [
{
src: 'https://www.google-analytics.com/analytics.js',
},
],
}),
})
TanStack Router 預設會去除重複的 title 和 meta 標籤,優先使用巢狀路由中找到的每個標籤的最後一個出現。
<HeadContent /> 元件是必需的,用於渲染文件的 head、title、meta、link 和與 head 相關的 script 標籤。
它應該在根佈局的 <head> 標籤中渲染,或者在元件樹中盡可能高的位置渲染,如果您的應用程式無法或不管理 <head> 標籤。
import { HeadContent } from '@tanstack/react-router'
export const Route = createRootRoute({
component: () => (
<html>
<head>
<HeadContent />
</head>
<body>
<Outlet />
</body>
</html>
),
})
import { HeadContent } from '@tanstack/react-router'
export const Route = createRootRoute({
component: () => (
<html>
<head>
<HeadContent />
</head>
<body>
<Outlet />
</body>
</html>
),
})
import { HeadContent } from '@tanstack/react-router'
const rootRoute = createRootRoute({
component: () => (
<>
<HeadContent />
<Outlet />
</>
),
})
import { HeadContent } from '@tanstack/react-router'
const rootRoute = createRootRoute({
component: () => (
<>
<HeadContent />
<Outlet />
</>
),
})
除了可以在 <head> 標籤中渲染的 scripts 外,您還可以使用 routeOptions.scripts 屬性在 <body> 標籤中渲染 scripts。這對於需要 DOM 載入後才能執行的 scripts(甚至是內聯 scripts)非常有用,但這些 scripts 需要在應用程式的主要入口點之前執行(如果您使用 Start 或 TanStack Router 的全端實現,則包括 hydration)。
要做到這一點,您必須:
export const Route = createRootRoute({
scripts: [
{
children: 'console.log("Hello, world!")',
},
],
})
export const Route = createRootRoute({
scripts: [
{
children: 'console.log("Hello, world!")',
},
],
})
<Scripts /> 元件是必需的,用於渲染文件的 body scripts。它應該在根佈局的 <body> 標籤中渲染,或者在元件樹中盡可能高的位置渲染,如果您的應用程式無法或不管理 <body> 標籤。
import { createFileRoute, Scripts } from '@tanstack/react-router'
export const Router = createFileRoute('/')({
component: () => (
<html>
<head />
<body>
<Outlet />
<Scripts />
</body>
</html>
),
})
import { createFileRoute, Scripts } from '@tanstack/react-router'
export const Router = createFileRoute('/')({
component: () => (
<html>
<head />
<body>
<Outlet />
<Scripts />
</body>
</html>
),
})
import { Scripts, createRootRoute } from '@tanstack/react-router'
export const Route = createRootRoute({
component: () => (
<>
<Outlet />
<Scripts />
</>
),
})
import { Scripts, createRootRoute } from '@tanstack/react-router'
export const Route = createRootRoute({
component: () => (
<>
<Outlet />
<Scripts />
</>
),
})
Your weekly dose of JavaScript news. Delivered every Monday to over 100,000 devs, for free.