元数据

到目前为止,我们渲染的所有内容都在 HTML 文档的 <body> 内。这是有道理的,毕竟网页上所有可见的内容都位于 <body> 中。

然而,在某些情况下,你可能需要使用与 UI 相同的响应式原语和组件模式来更新文档 <head> 中的内容。

这就是 leptos_meta 包的作用。

元数据组件

leptos_meta 提供了一些特殊组件,可以让你从应用程序的任何组件中向 <head> 注入数据:

<Title/> 允许你从任意组件设置文档的标题。它还支持一个 formatter 函数,用于对其他页面设置的标题应用相同的格式。例如,如果你在 <App/> 组件中放置 <Title formatter=|text| format!("{text} — My Awesome Site")/>,然后在路由中分别放置 <Title text="Page 1"/><Title text="Page 2"/>,你会得到 Page 1 — My Awesome SitePage 2 — My Awesome Site

<Link/><head> 注入一个 <link> 元素。

<Stylesheet/> 创建一个带有指定 href<link rel="stylesheet">

<Style/> 创建一个 <style> 元素,并将你传递的子内容(通常是字符串)放入其中。可以在编译时引入其他文件的自定义 CSS,例如 <Style>{include_str!("my_route.css")}</Style>

<Meta/> 允许你设置 <meta> 标签,如描述或其他元数据。

<Script/><script>

leptos_meta 还提供了一个 <Script/> 组件。这里值得稍作停顿说明。上面提到的所有组件都将 <head> 元素注入 <head> 中,而 <script> 既可以放在 <head> 中,也可以放在 <body> 中。

有一个简单的规则可以帮助你决定是使用 <Script/> 组件还是 <script> 元素:<Script/> 会被渲染到 <head> 中,而 <script> 会根据你在用户界面中放置的位置,直接渲染到 <body> 中。两者加载和运行 JavaScript 的时间不同,因此根据需要选择适合你的方式。

<Body/><Html/>

还有两个元素专为语义化 HTML 和样式设计提供便利:<Body/><Html/>。它们允许你向页面上的 <html><body> 标签添加任意属性。可以通过常规 Leptos 语法结合扩展操作符({..})添加任意数量的属性,这些属性会直接添加到相应的元素中。

<Html
    {..}
    lang="he"
    dir="rtl"
    data-theme="dark"
/>

元数据与服务器端渲染

某些场景下,上述功能是非常有用的,而在搜索引擎优化(SEO)中则尤为重要。确保拥有适当的 <title><meta> 标签是关键。现代搜索引擎爬虫确实能够处理客户端渲染的应用(即通过空的 index.html 加载,然后用 JS/WASM 渲染整个页面)。但搜索引擎更喜欢直接接收到已经渲染成实际 HTML 的页面,并带有 <head> 中的元数据。

这正是 leptos_meta 的作用。事实上,在服务器端渲染时,它会收集整个应用程序中使用这些组件声明的所有 <head> 内容,然后将它们注入实际的 <head> 中。

不过我们稍微超前了一点。我们尚未正式讨论服务器端渲染。下一章将介绍如何与 JavaScript 库集成,然后完成客户端部分的讨论,接着进入服务器端渲染的主题。