欢迎使用 Inertia 头部组件

发布时间:作者:

Say Hello to the Inertia Head Component image

随着最新的 Inertia.js 版本发布,一个名为“Inertia head”的新组件出现了。这个新组件允许你在 HTML 的 <head> 标签中更新 <title><meta> 标签。在该组件出现之前,尝试更改页面的 <title> 虽然并非不可能,但并不容易。不仅可以在页面组件中轻松完成此操作,还可以利用传递给页面的任何 props

想象一下能够动态设置你的 Open Graph 标签,或者在用户阅读文章时更新页面的标题,甚至更改网站图标;所有这一切都是可能的。

为了演示这个新功能,让我们开始使用我最喜欢的 Laravel 启动套件 Laravel Breeze.

首先创建一个新的 Laravel 应用程序。

laravel new inertia-head-demo

运行完成后,进入你的新项目并运行

composer require laravel/breeze --dev

接着运行

PHP artisan breeze:install vue

运行完成后,你应该看到 package.jsondevDependencies 已经更新,看起来像这样。

"devDependencies": {
"@inertiajs/inertia": "^0.8.4",
"@inertiajs/inertia-vue3": "^0.3.5",
"@inertiajs/progress": "^0.2.4",
"@tailwindcss/forms": "^0.2.1",
"@vue/compiler-sfc": "^3.0.5",
"autoprefixer": "^10.2.4",
"axios": "^0.21",
"laravel-mix": "^6.0.6",
"lodash": "^4.17.19",
"postcss": "^8.2.13",
"postcss-import": "^14.0.1",
"tailwindcss": "^2.1.2",
"vue": "^3.0.5",
"vue-loader": "^16.1.2"
}

为了利用这个 <inertia-head>,我们需要将 @inertiajs/inertia@inertiajs/inertia-vue3 的版本提升。同时,我们也可以将 @inertiajs/progress 更新到最新版本,但这不是必需的。

"devDependencies": {
"@inertiajs/inertia": "^0.9.1",
"@inertiajs/inertia-vue3": "^0.4.2",
"@inertiajs/progress": "^0.2.5", // optional
...
}

接下来,让我们安装 JavaScript 依赖项,并构建我们的资源并监视更改。

npm install && npm run watch

接下来,我们想要编辑我们的应用程序布局,并添加 <inertia-head> 标签。我们在此处设置的内容将是可以在页面级别覆盖的“默认值”。

在 Breeze 中,有两个布局组件,Guest.vue 位于 resources/js/Layouts/Guest.vueAuthenticated.vue 位于 resources/js/Layouts/Authenticated.vueGuest.vue 布局被所有身份验证视图使用,Authenticated.vue 在用户经过身份验证后查看其仪表盘时使用。在本例中,我们将重点关注身份验证屏幕和 Guest.vue 布局;在 Guest.vue 布局的 <template> 标签内的任何位置添加以下内容。

<inertia-head title="Inertia Head Demo" />

我本地使用的是 Laravel Valet,所以如果我去访问 http://inertia-head-demo.test/login,我应该期望看到该页面的标题为“Inertia Head Demo”,但访问 /login 检查时,标题将显示“Laravel”或你 .env 设置中 APP_NAME 的值。这样做的原因是页面上应该只有一个 <title> 标签,如果有多个,则页面上出现的第一个标签将具有优先权。如果你检查 app.blade.php 文件,你会在第 8 行看到以下内容

<title>{{ config('app.name', 'Laravel') }}</title>

如果你删除上述代码并刷新页面,我们应该会看到在布局中设置的标题。

不错吧?好,让我们继续下一步。打开 Login.vue,添加 <inertia-head> 标签来覆盖我们在 Guest.vue 中设置的默认值。

<inertia-head title="Inertia Head Demo - Login" />

现在,当你访问 /login 时,你会在浏览器标签中看到 Inertia Head Demo - Login 作为标题。

Open Graph 元标签

Facebook 和 Twitter 都允许你自定义 URL 预览的外观。你可以阅读有关 Facebook 的 OG 标签的更多信息 这里 和 Twitter 卡 这里.

让我们首先更新添加到 Guest.vue 的默认 <inertia-head> 组件,添加以下内容。

<inertia-head>
<title>Inertia Head Demo</title>
<meta type="description" content="Inertia Head Demo." />
<meta name="twitter:title" content="Inertia Head Demo" />
<meta name="twitter:site" content="@ninjaparade" />
<meta name="twitter:creator" content="@ninjaparade" />
<meta name="twitter:description" content="Inertia Head Demo." />
<meta name="twitter:card" content="summary_large_image" />
 
<meta property="og:url" content="http://inertia-head-demo.test" />
<meta property="og:title" content="Inertia Head Demo" />
<meta property="og:description" content="Inertia Head Demo" />
<meta property="og:type" content="website" />
<meta property="og:image" content="https://www.biography.com/.image/t_share/MTQ3NTI2OTA4NzY5MjE2MTI4/drake_photo_by_prince_williams_wireimage_getty_479503454.jpg" />
</inertia-head>

现在访问 /login,你应该会看到这样。

<head>
<title inertia="">Inertia Head Demo </title>
<meta type="description" content="Inertia Head Demo." inertia="" />
<meta property="og:url" content="http://inertia-head-demo.test" inertia="" />
<meta property="og:image" content="https://www.biography.com/.image/t_share/MTQ3NTI2OTA4NzY5MjE2MTI4/drake_photo_by_prince_williams_wireimage_getty_479503454.jpg" inertia="" />
<meta name="twitter:title" content="Inertia Head Demo." inertia="" />
<meta name="twitter:site" content="@ninjaparade" inertia="" />
<meta name="twitter:creator" content="@ninjaparade" inertia="" />
<meta name="twitter:description" content="Inertia Head Demo." inertia="" />
<meta name="twitter:card" content="summary_large_image" inertia="" />
<meta property="og:title" content="Inertia Head Demo." inertia="" />
<meta property="og:description" content="Inertia Head Demo." inertia="" />
<meta property="og:type" content="website" inertia="" />
</head>

你可以看到 OG 元标签,后面跟着标题。这里使用默认值,因为我们在 Login.vue 页面上的 <inertia-head> 中设置了标题,所以我们看到 Inertia 删除了默认标题,并使用了我们页面组件中的标题。

现在让我们尝试在 Login.vue 组件中设置 OG 标签。我将添加以下内容。

<inertia-head>
<title>Inertia Head Demo - Login</title>
<meta type="description" content="Inertia Head Demo - Login page." />
<meta name="twitter:title" content="Inertia Head Demo - Login page." />
<meta name="twitter:site" content="@ninjaparade" />
<meta name="twitter:creator" content="@ninjaparade" />
<meta name="twitter:description" content="Inertia Head Demo - Login page." />
<meta name="twitter:card" content="summary_large_image" />
 
<meta property="og:url" content="http://inertia-head-demo.test/login" />
<meta property="og:title" content="Inertia Head Demo - Login page." />
<meta property="og:description" content="Inertia Head Demo - Login page." />
<meta property="og:type" content="website" />
<meta property="og:image" content="https://www.biography.com/.image/t_share/MTQ3NTI2OTA4NzY5MjE2MTI4/drake_photo_by_prince_williams_wireimage_getty_479503454.jpg" />
</inertia-head>

现在刷新并访问 /login... 发生了什么?!

<head>
...
<meta type="description" content="Inertia Head Demo." inertia="" />
<meta property="og:url" content="http://inertia-head-demo.test" inertia="" />
<meta property="og:image" content="https://www.biography.com/.image/t_share/MTQ3NTI2OTA4NzY5MjE2MTI4/drake_photo_by_prince_williams_wireimage_getty_479503454.jpg" inertia="" />
<meta name="twitter:title" content="Inertia Head Demo." inertia="" />
<meta name="twitter:site" content="@ninjaparade" inertia="" />
<meta name="twitter:creator" content="@ninjaparade" inertia="" />
<meta name="twitter:description" content="Inertia Head Demo." inertia="" />
<meta name="twitter:card" content="summary_large_image" inertia="" />
<meta type="description" content="Inertia Head Demo - Login page." inertia="" />
<meta name="twitter:title" content="Inertia Head Demo - Login page." inertia="" />
<meta name="twitter:site" content="@ninjaparade" inertia="" />
<meta name="twitter:creator" content="@ninjaparade" inertia="" />
<meta name="twitter:description" content="Inertia Head Demo - Login page." inertia="" />
<meta name="twitter:card" content="summary_large_image" inertia="" />
<meta property="og:url" content="http://inertia-head-demo.test" inertia="" />
<meta property="og:title" content="Inertia Head Demo - Login page." inertia="" />
<meta property="og:description" content="Inertia Head Demo - Login page." inertia="" />
<meta property="og:type" content="website" inertia="" />
<meta property="og:image" content="https://www.biography.com/.image/t_share/MTQ3NTI2OTA4NzY5MjE2MTI4/drake_photo_by_prince_williams_wireimage_getty_479503454.jpg" inertia="" />
<title inertia="">Inertia Head Demo - Login</title>
</head>

我们的 <head> 标签现在包含了我们的元标签的副本;这是为什么?<inertia-head> 组件将始终确保只有一个 <title> 标签。当涉及到 <meta> 标签时,<inertia-head> 只是将默认值和 Login.vue 组件中的 <meta> 标签叠加起来,这就是你看到它们重复的原因。幸运的是,解决这个问题非常简单。我们可以告诉 <inertia-head> 如何处理重复项,方法是添加 head-key 属性,确保标签只渲染一次。

因此,将 Guest.vue 中的 Inertia 头部更改为以下内容。

<inertia-head>
<title>Inertia Head Demo</title>
<meta head-key="description" type="description" content="Inertia Head Demo." />
<meta head-key="twitter:title" name="twitter:title" content="Inertia Head Demo." />
<meta head-key="twitter:site" name="twitter:site" content="@ninjaparade" />
<meta head-key="twitter:creator" name="twitter:creator" content="@ninjaparade" />
<meta head-key="twitter:description" name="twitter:description" content="Inertia Head Demo." />
<meta head-key="twitter:card" name="twitter:card" content="summary_large_image" />
 
<meta head-key="og:url" property="og:url" content="http://inertia-head-demo.test" />
<meta head-key="og:title" property="og:title" content="Inertia Head Demo." />
<meta head-key="og:description" property="og:description" content="Inertia Head Demo." />
<meta head-key="og:type" property="og:type" content="website" />
<meta head-key="og:image" property="og:image" content="https://www.biography.com/.image/t_share/MTQ3NTI2OTA4NzY5MjE2MTI4/drake_photo_by_prince_williams_wireimage_getty_479503454.jpg" />
</inertia-head>

并将 Login.vue 中的 <inertia-head> 组件更改为以下内容

<inertia-head>
<title>Inertia Head Demo - Login</title>
<meta head-key="description" type="description" content="Inertia Head Demo - Login page." />
<meta head-key="twitter:title" name="twitter:title" content="Inertia Head Demo - Login page." />
<meta head-key="twitter:site" name="twitter:site" content="@ninjaparade" />
<meta head-key="twitter:creator" name="twitter:creator" content="@ninjaparade" />
<meta head-key="twitter:description" name="twitter:description" content="Inertia Head Demo - Login page." />
<meta head-key="twitter:card" name="twitter:card" content="summary_large_image" />
 
<meta head-key="og:url" property="og:url" content="http://inertia-head-demo.test/login" />
<meta head-key="og:title" property="og:title" content="Inertia Head Demo - Login page." />
<meta head-key="og:description" property="og:description" content="Inertia Head Demo - Login page." />
<meta head-key="og:type" property="og:type" content="website" />
<meta head-key="og:image" property="og:image" content="https://www.biography.com/.image/t_share/MTQ3NTI2OTA4NzY5MjE2MTI4/drake_photo_by_prince_williams_wireimage_getty_479503454.jpg" />
</inertia-head>

更新后,重新编译你的资源,刷新,你应该会看到这样

<head>
...
<title inertia="">Inertia Head Demo - Login</title>
<meta type="description" content="Inertia Head Demo - Login page." inertia="description" />
<meta property="og:url" content="http://inertia-head-demo.test" inertia="og:url" />
<meta property="og:image" content="https://www.biography.com/.image/t_share/MTQ3NTI2OTA4NzY5MjE2MTI4/drake_photo_by_prince_williams_wireimage_getty_479503454.jpg" inertia="og:image" />
<meta name="twitter:title" content="Inertia Head Demo - Login page." inertia="twitter:title" />
<meta name="twitter:site" content="@ninjaparade" inertia="twitter:site" />
<meta name="twitter:creator" content="@ninjaparade" inertia="twitter:creator" />
<meta name="twitter:description" content="Inertia Head Demo - Login page." inertia="twitter:description" />
<meta name="twitter:card" content="summary_large_image" inertia="twitter:card" />
<meta property="og:title" content="Inertia Head Demo - Login page." inertia="og:title" />
<meta property="og:description" content="Inertia Head Demo - Login page." inertia="og:description" />
<meta property="og:type" content="website" inertia="og:type" />
</head>

就是这样!关于 <inertia-head> 还有更多需要讨论的地方,以及它与即将推出的为 Inertia 提供 服务器端 渲染功能的结合点。Inertia 的 SSR 已准备就绪,目前为 Inertia.js 网站提供支持,但有关如何在 Laravel ForgeHeroku 上实现此功能的 文档 目前仅对 Inertia 赞助商 可用。

感谢阅读,如果你有任何问题,请随时在 Twitter 上联系我。

Yaz Jallad photo

Yaz 是一位全栈开发人员,对 Laravel、Vue.js、Tailwind CSS 和 Inertia.js 充满热情。

Cube

Laravel 新闻稿

加入 40,000 多名其他开发人员,绝不错过新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理你的服务器,并在几秒钟内部署你的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动补全和本地和生产环境的即时反馈进行 Tinker。

Tinkerwell
No Compromises logo

没有妥协

来自 No Compromises 播客的两名经验丰富的开发人员 Joel 和 Aaron 现在可以为你的 Laravel 项目提供雇佣服务。 ⬧ 固定费用 7500 美元/月。 ⬧ 没有冗长的销售流程。 ⬧ 没有合同。 ⬧ 100% 退款保证。

没有妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保你的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?即时、自动的 Laravel 升级和代码现代化,使你的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

让你的项目充满活力,只需每月 2500 美元,就可以拥有一名拥有 4-6 年经验的经验丰富的 Laravel 开发人员。获得 160 小时的专业技能和 15 天的无风险试用。立即预约电话!

Bacancy
Lucky Media logo

Lucky Media

现在就获得好运 - Laravel 开发的理想选择,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的强大功能带入 Laravel。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方的 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,它包含运行现代 SaaS 所需的所有功能。支付、漂亮的结账流程、管理面板、用户仪表盘、身份验证、现成的组件、统计信息、博客、文档等等。

SaaSykit: Laravel SaaS 启动套件
Rector logo

Rector

你无缝升级 Laravel、降低成本和加速创新以实现公司成功的合作伙伴

Rector
MongoDB logo

MongoDB

使用 MongoDB 和 Laravel 的强大集成来增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。 在使用熟悉的 Eloquent API 的同时,支持事务、搜索、分析和移动用例。 探索灵活、现代的 MongoDB 数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在您的 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包向您的 Laravel 应用程序添加评论

阅读文章