Livewire 还是 Inertia.js?

发布日期:作者:

Livewire or Inertia.js? image

最近,我经常从 Laravel 开发人员那里听到这样的问题:“我应该学习/使用 Livewire 还是 Inertia.js?”当然,答案因人而异,但让我们尝试比较它们,并为你的决定提供更多背景信息。


背景:Livewire/Inertia 解决什么问题?

在过去几年中,单页应用程序 (SPA) 越来越受欢迎。你只需要加载一次 JavaScript 和资产,然后页面上的所有链接都不会重新加载整个页面,而是只重新加载某些部分。用户体验得到了改善,但问题是创建适当的 SPA 需要花费很多时间。你需要处理两个独立的部分:前端和后端,以及它们之间的链接,包括路由、安全等等。因此,在某个时刻,一些开发人员开始思考如何简化这一过程。这就是 LivewireInertia.js 诞生的背景,它们大约是在同一时间出现的,并且都变得非常受欢迎。

Livewire 和 Inertia 的目标非常相似:简化 SPA 的创建。但是,它们实现的方式不同。Livewire 专注于 Laravel 开发人员,让他们可以只停留在后端,而无需处理任何 JavaScript 代码。Inertia 则适用于希望简化工作流程的 Vue 或 React 开发人员:无需创建单独的 API,无需处理路由、状态管理和其他挑战。

所以,目标相同,但受众不同。你甚至可以比较它们的 URL:

  • laravel-livewire.com(URL 中包含“laravel”)
  • inertiajs.com(URL 中包含“js”)

简易性:Livewire 是后端开发人员的舒适区

如果你是一位后端开发人员,并且需要快速创建一个项目,其中页面上只有少量动态元素,那么 Livewire 可能是你的最佳解决方案。它不会让你离开 Laravel 的舒适区:你基本上可以继续编写 Laravel 后端代码,创建 PHP 类和 Blade 文件。因此,对于 Laravel 开发人员来说,采用 Livewire 通常比 Inertia 更快。

Inertia 有一些先决条件:你需要熟悉前端技术,例如 Vue 或 React。因此,从定义上讲,它比 Livewire 更复杂,需要更多知识。

让我们比较一下操作步骤:

Livewire 设置:

  • 通过 composer 安装 Livewire 包
  • 在主布局中添加 2 个 Blade 指令

Inertia Vue 设置:

  • 通过 composer 安装 Inertia 包
  • 在主布局中添加 2 个 Blade 指令
  • 设置 Inertia 中间件
  • 安装客户端适配器:npm install @inertiajs/inertia @inertiajs/inertia-vue3
  • 使用 createInertiaApp() 方法更新主 resources/js/app.js 文件

如你所见,Inertia 的准备步骤更多,你必须熟悉 Laravel 项目中 Vue 设置的工作方式,包括主布局和 id="app" 等内容。

现在,如何创建 Livewire/Inertia 组件呢?

新的 Livewire 组件:

  • 使用 Artisan 创建 Livewire 组件
  • 用逻辑填充 Livewire 组件类及其 Blade 模板
  • 使用 @livewire<livewire> 调用 Livewire 组件
  • 构建组件之间的导航/路由系统

新的 Inertia 组件:

  • 创建一个带有逻辑和视觉模板的 Vue.js 组件
  • 使用 Inertia::render() 调用 Inertia 组件
  • 构建组件之间的导航/路由系统

看起来工作量差不多,只是 Inertia 没有使用 Artisan 命令创建组件的命令。

但是从心理上来说,对于 Laravel 开发人员来说,留在 Laravel 类/Blade 结构中比创建带有 <template><script> 的新 Vue 文件要容易得多。它更快。

但是,如果开发人员可以称自己为全栈开发人员,并且每天都在使用 Vue.js,那么他们选择 Inertia 方式是理所当然的。


性能

人们经常批评 Livewire 向服务器发送了太多请求,特别是如果开发人员没有仔细使用 wire:model 的额外选项。实际上,它可能会发送很多不必要的请求。

这与人们对 Eloquent 的批评类似:经验不足的开发人员往往会忽略性能问题,因为“它能正常工作”,结果代码中可能存在数百个未优化的 SQL 查询,这些查询在 Eloquent 的幕后执行。

此外,Laravel 请求和结果的有效负载也更大:Livewire 会下载块或组件的完整 HTML,而 Inertia 则使用 JSON 作为结果。

因此,在性能方面,Inertia 的默认行为可能更好。但是,在大多数情况下,你的用户不会察觉到视觉上的差异,尤其是在较小的项目中。此外,使用 Livewire,你可以优化很多内容来提高性能。


SEO:Livewire 更好。理论上。

坦白地说,我不认为你应该依赖单页应用程序的 SEO。如果你的页面非常动态,并且包含很多可移动的部分,那么它更像是一个应用程序,而不是一个网站。事实上,它们甚至被称为“单页应用程序”。根据我的经验,SPA 主要用于管理数据,通常受身份验证机制保护,因此用户点击页面是为了执行操作,而不是为了获取可抓取的网站。

也就是说,可能存在一个项目需要同时实现动态行为和 SEO 效果。为此,最好使用服务器端渲染,这样搜索引擎更容易抓取。

Livewire 默认情况下使用服务器端渲染,并下载完整的 HTML,这些 HTML 可供 Google 和其他抓取工具读取。因此,我在性能方面提到的缺点在 SEO 方面变成了优势。

Inertia 默认情况下使用客户端渲染:因此每次服务器调用都会返回 JSON,这些 JSON 会在浏览器中“神奇地”解析。因此,搜索引擎难以正确读取该页面内容。也就是说,在 2022 年 1 月,Inertia 推出了服务器端渲染功能。但是,设置它可能需要额外的努力:它将请求传递给一个单独的 Node.js 服务,以便它可以渲染页面并在完成渲染后将渲染后的 HTML 返回到浏览器。

所有关于 SEO 的想法几乎都是理论上的。你无法提前知道特定的搜索引擎会如何抓取和读取你的网站内容。有人说 Google 已经越来越擅长读取 JavaScript 驱动的动态网站,但每个情况都很特殊。


职业机会:每个人都需要全栈开发人员

看起来,如果你是一位具有少量前端经验的 Laravel 开发人员,你可以直接开始使用 Livewire 并创建出色的项目。这是真的,但这会限制你未来的工作机会。

如果你尝试在求职网站或自由职业平台上搜索与 Livewire 相关的职位,你会发现几乎没有。主要是因为 Livewire 被认为是 Laravel 之上的一个小工具,其用例非常有限。

然而,Inertia 基于像 Vue 或 React 这样的流行 JavaScript 框架。你也不会发现很多职位特别提及 Inertia,但你将被迫跳出 Laravel 的舒适区进入一个全栈的世界,这反过来会为你打开一片机会之海:如今,每家公司都想要雇佣全栈开发者。

因此,从这个角度来看,Livewire 非常适合你是独行侠自由职业者,对自己的技术决策负全部责任,以及你通常构建的只有少量动态行为的小型项目。但是,如果你在一个需要在某个技术栈上押注的大公司工作,他们很可能选择 React/Vue 作为前端代码的基础。


Taylor 和社区:为什么不两者兼得呢?

最后,让我们看看其他人的看法。

作为“公正专家”的观点,让我们谈谈与 Laravel 8 一起发布的 Laravel Jetstream 启动套件。Taylor Otwell 希望为现代网络提供一种新的基于身份验证的样板,对于动态元素,他必须在 Livewire 和 Inertia 之间做出选择。

让我们听听 Taylor 对选择的说法:“我喜欢 Livewire 和 Inertia。在构建 Jetstream 的过程中,我非常纠结选择哪个,所以就决定将两者都包含进来。这感觉风险很大,因为我不得不维护两套前端,但我认为这两个项目都非常棒,由 Laravel 社区成员开发。”

而且,即使我在 我的推特上进行了一个投票,有 1,854 人投票,Livewire 和 Inertia 赢得了相同的受众:各占 39%,21% 选择了“两者,取决于项目”。

因此,对于“Livewire 还是 Inertia”这个问题,最终的答案是你的个人选择。主要取决于你对 Vue/React 的经验。如果你没有或只有很少的经验,那么 Livewire 就是你的朋友。

PovilasKorop photo

Laravel Daily 的课程和教程创建者 Laravel Daily

Cube

Laravel 新闻稿

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

Laravel Forge logo

Laravel Forge

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

Laravel Forge
Tinkerwell logo

Tinkerwell

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

Tinkerwell
No Compromises logo

无妥协

Joel 和 Aaron,两位来自无妥协播客的经验丰富的开发者,现在可以为您的 Laravel 项目雇用。⬧ 固定费用 7,500 美元/月。⬧ 无漫长的销售流程。⬧ 无合同。⬧ 100% 退款保证。

无妥协
Kirschbaum logo

Kirschbaum

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

Kirschbaum
Shift logo

Shift

运行旧版 Laravel?立即自动执行 Laravel 升级和代码现代化,使您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

使用经验丰富的 Laravel 开发人员(拥有 4-6 年的经验)为您的项目注入活力,每月仅需 2,500 美元。获得 160 小时的专业知识和无风险的 15 天试用期。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即获得 Lucky - 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

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
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 提示构建 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 应用程序

阅读文章