tl;dr
Next.js 13的/app
路由器的layout
和page
路由改变了我们向<head>
添加内容的方式。如何向每个页面添加架构脚本?Next.js会自动将任何layout
或page
中的<head>
标签编译成一个<head>
。
目标
就像在任何网站与伟大的搜索引擎优化,我想包括在每个页面的头部模式脚本。
历史
通常情况下,这将像在<head>
中这样编写一样简单:
<!-- index.html -->
<head>
<script type="application/ld+json">
{
"@context": "https://schema.org",
// ... the rest
}
</script>
</head>
然后,使用Next.js /pages
目录,情况略有不同。不得不使用dangerouslySetInnerHTML
属性对我来说总是感觉很奇怪,但至少它工作了。
// index.tsx
import Head from 'next/head'
export default function Page() {
return (
<Head>
<script id="schema" type="application/ld+json" dangerouslySetInnerHTML={{__html: `
{
"@context": "https://schema.org",
// ... the rest
}
`}} />
</Head>
)
}
问题
现在,随着/app
路由器的引入,我们有了很好的、新的、简化的设置元数据的方法,而不必直接通过next/head
导入<head>
。事实上,next/head
组件不应该在/app
路由器中使用。
所以问题就变成了...
如何按页访问<head>
?
我希望Next.js团队已经考虑到这一点,并将schema添加到新的metadata
变量,甚至是它自己的变量,但据我所知,他们似乎没有计划这样做。
我尝试将<head>
添加到page
,不幸的是,它无法正确合并到<head>
中。到目前为止,我唯一能做的就是将模式添加到每个layout
中,但是为每个页面提供单独的布局是多么麻烦。
任何想法都欢迎。
1条答案
按热度按时间hmmo2u0o1#
你可能已经有了答案,但对于我们所有可能正在寻找解决同一问题的方法的人来说:
这里是next.js文档中更多信息的链接!https://nextjs.org/learn/seo/rendering-and-ranking/metadata