文档头部管理是指管理文档的 head、title、meta、link 和 script 标签的过程。TanStack Router 为使用 Start 的全栈应用和使用 @tanstack/solid-router 的单页应用提供了强大的文档头部管理能力,具体包括:
对于使用 Start 的全栈应用,甚至是使用 @tanstack/solid-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/solid-router'
export const Route = createRootRoute({
component: () => (
<html>
<head>
<HeadContent />
</head>
<body>
<Outlet />
</body>
</html>
),
})
import { HeadContent } from '@tanstack/solid-router'
export const Route = createRootRoute({
component: () => (
<html>
<head>
<HeadContent />
</head>
<body>
<Outlet />
</body>
</html>
),
})
import { HeadContent } from '@tanstack/solid-router'
const rootRoute = createRootRoute({
component: () => (
<>
<HeadContent />
<Outlet />
</>
),
})
import { HeadContent } from '@tanstack/solid-router'
const rootRoute = createRootRoute({
component: () => (
<>
<HeadContent />
<Outlet />
</>
),
})
除了可以在 <head> 标签中渲染的脚本外,你还可以使用 routeOptions.scripts 属性在 <body> 标签中渲染脚本。这对于需要在 DOM 加载后但在应用主入口点(包括使用 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 脚本。它应该渲染在根布局的 <body> 标签中,或者尽可能靠近组件树的顶部(如果你的应用无法管理 <body> 标签)。
import { createFileRoute, Scripts } from '@tanstack/solid-router'
export const Router = createFileRoute('/')({
component: () => (
<html>
<head />
<body>
<Outlet />
<Scripts />
</body>
</html>
),
})
import { createFileRoute, Scripts } from '@tanstack/solid-router'
export const Router = createFileRoute('/')({
component: () => (
<html>
<head />
<body>
<Outlet />
<Scripts />
</body>
</html>
),
})
import { Scripts, createRootRoute } from '@tanstack/solid-router'
export const Route = createRootRoute({
component: () => (
<>
<Outlet />
<Scripts />
</>
),
})
import { Scripts, createRootRoute } from '@tanstack/solid-router'
export const Route = createRootRoute({
component: () => (
<>
<Outlet />
<Scripts />
</>
),
})
Your weekly dose of JavaScript news. Delivered every Monday to over 100,000 devs, for free.