在快节奏的 Web 开拓天下中,在最新框架的热潮中,最好的办理方案每每在于大略。 在最近的一篇文章中,我们谈到了利用 Go 和 htmx 进行动态 Web 内容确当地化。 在这篇文章中,我们将进一步磋商 htmx 和 Go 的结合、最佳实践和可掩护性。 采取“Lindy”方法进行 Web 开拓。 林迪效应是一个观点,它断言一个不易糜烂的想法或技能的未来预期寿命与其当前的年事成正比; 它越老,它存在的韶光可能就越长。
回顾一下,htmx 是一个轻量级的 Javascript 库,它许可我们直接从 HTML 访问当代浏览器功能,从而肃清了对繁重的客户端框架,尤其是客户端状态的需求。 IE。 编写 Javascript(htmx 库)以避免编写 Javascript(在您的网站上)。 htmx 的总体理念与 Go 对大略性的关注非常吻合。 只管如此,这种组合彷佛是“当代”网络开拓所构成的一种逆向态度。
htmx 的核心在于对精益代码和敏捷开拓的信念。 专注于创建无状态客户端:

HTML 在线:htmx 通过在线发送 HTML 来实现动态用户界面,简化做事器端开拓和掩护,并最大限度地减少客户端状态。 htmx 遵照 HATEOAS 约束,通过利用 HTML,利用超媒体作为运用程序状态的引擎。
渐进增强:利用 htmx,您可以从基本的 HTML 页面开始,然后根据须要对其进行增强。 这种方法提高了可访问性和可用性,这也意味着如果 Javascript 由于任何缘故原由失落败,您的网站仍旧可以事情。
大略性:htmx 相信尽可能降落繁芜性。 没有构建过程,没有依赖关系,没有分外的做事器端技能,并且须要学习的 API 面积也很小。
互操作性:htmx 旨在与您现有的 HTML 和做事器端代码合营利用。 它不须要您学习新的模板措辞或变动做事器端架构。
规复大略性htmx 和 Go 有着共同的理念,都方向于极简主义和组合而不是继续。 该原则有利于通过组合大略工具而不是利用分层继续构造来创建繁芜工具。 组合许可工具通过合并实现所需功能的其他工具来实现繁芜的行为,从而形成更灵巧和可掩护的代码构造。 htmx 简化了做事器端渲染,通过 AJAX 增强了 HTML,而 Go 则因其编写后端做事的品质而受到讴歌。 它们共同为网站与后端做事的交互供应了全新的视角,统一了连贯开拓体验的原则。
利用 html最基本的是,htmx 许可您只需向 HTML 添加一些属性即可发出 AJAX 要求。 例如,如果您有一个按钮,并且希望在单击该按钮时发出 AJAX 要求,您可以这样做:
<button hx-post="/clicked" hx-target="#message">Click me</button><div id="message"></div>
当您单击按钮时,htmx 会向 /clicked URL 发送 POST 要求。 当做事器利用一些 HTML 进行相应时,该 HTML 会被放置到 #message div 中。 htmx 供应了许多其他属性和选项,用于发出 AJAX 要求、处理事宜、处理相应等。 这些功能使您能够利用最少的 JavaScript 构建繁芜的动态界面。 添加等待添补内容的空 <div> 元素觉得像 jQuery 风格,但让人回忆起 jQuery 和 PHP 时期开拓的敏捷性。 可以说是一种更清洁的方法。 对付事宜类型,做事器发送的事宜可以大略地实现如下:
<div hx-sse="connect:/user/updates swap:userUpdate"> Updates will appear here.</div>
利用 Go 模板,我们从后端数据注入变量:
<a href="/" hx-trigger="click" hx-indicator="#spinner" hx-get="/data/{{$sport.Key}}" hx-target="#data-table">Fetch</a>
htmx Go 模板最佳实践
我们创造了在 Web 运用程序中利用 htmx 时的一些最佳实践:
做事器端状态管理:除了身份验证等必要的cookie之外,所有状态都该当在做事器端进行管理。
HATEOAS with HTML:利用 HTML(而不是 JSON)实现超媒体作为运用程序状态引擎 (HATEOAS)。 在根页面加载时,呈现页面上可以动态的所有元素并为它们供应做事,而无需额外的要求。 这可以通过渲染到 Go 缓冲区中来实现,并在须要时将它们与 template.HTML 一起注入到根模板中。 适当利用缓存。 这符合完备做事器端渲染 (SSR) 上岸页面并增强 SEO。 用户体验非常好,由于所有元素都很活泼,而且彷佛没有任何内容异步加载。 一个附带的好处是,纵然禁用了 Javascript,第一页加载也始终有效,由于 html 完备从做事器呈现。 变动元素时,它们会从各自的端点动态加载。 例如。 登录和注销状态的区域。
动态元素的 ID 可寻址性:所有动态元素都应具有唯一的 ID。 这使得它们可寻址,许可从各个 Go 端点和 hx-target 进行寻址。
动态元素的单独模板和端点:每个动态元素该当有一个相应的 Go 模板和端点。 这导致了模块化且可掩护的代码。
利用 go:embed 进行发布,从磁盘加载进行开拓:利用 Go 的嵌入功能进行生产,同时许可在开拓过程中进行磁盘加载。 这确保了高效的性能和热重载。
跳过开拓中的 API 步骤:明智地选择 ORM,最好是代码天生。 开拓过程中直接从数据库过渡到HTML,省略API层。 这是实行中的乘数。 对付我们在访问做事数据时自然须要的 API,我们利用 Go ent。
为动态端点履行做事器端事宜 (SSE):利用 SSE 处理动态数据。 根据数据的不同,动态部分直接是 SSE 元素,并且该当在加载时订阅自身。 Go 处理程序将在第一次调用时推送初始状态。 或者,第一个调用照常从 GET 要求呈现,然后 GET 要求供应订阅自身的模板。
项目构造有组织的项目构造不仅仅是都雅或偏好的问题; 这是直接影响开拓过程的一个基本方面。 构造良好的项目可以促进团队成员之间的协作,增强可掩护性,并加快新开拓职员的入职速率。 我们遵照一种大略、可能常见的方法,我们内部称之为“golean”。 利用 Go ent 天生模型、文档和 API,布局类似如下。 我们将在往后的文章中谈论这一点。
我们将 Go Web 做事器和其他做事分离到不同的存储库中,以充分利用 Go 的模块系统进行依赖管理和版本掌握。 我们的存储库将遵照范例的构造:
.├── cmd│ └── web // The main application for this project│ ├── handlers.go│ ├── l10n│ │ └── translations.json│ ├── main.go // The entry point for the server application│ ├── session.go│ ├── static // Directory for static files│ │ └── favicon.svg│ └── templates // Directory for HTML/X template files│ ├── base.html│ ├── head.html│ ├── partials│ │ └── welcome.html│ └── root.html├── docs│ └── openapi.json // OpenAPI spec generated by entoas via Go ent├── internal // Internal packages used by the server application│ └── ...├── go.mod├── go.sum└── ... // Optionally Dockerfile, drone.yml, dotenv etc.
这种分离确保了运用程序的不同部分之间的清晰区分,遵照许多 Go 最佳实践。 cmd 目录用于运用程序,它们是程序的入口点。 内部目录用于在此存储库内的多个程序之间共享的包,但不打算在此存储库之外利用。 Web 目录包含由 Web 做事器供应的静态文件和模板。
与做事交互我们的 Go Web 做事器就位后,该做事可能会或可能不会附带数据库。 如果存在,我们希望从其他做事访问它。 htmx 方法自然会跳过构建前端利用的 RESTful JSON API。 然而,我们确实利用 Go ent 并首先编写我们的 Go 模型,利用 entoas 和 ogent 天生一个完备连接的 CRUD API。 我们之前在 Go 中基于模型的天生微做事的文章中谈到了这种注释驱动的方法。
然后我们安装代理 API 并利用中间件保护它,例如 /api 路由前缀,我们可以与我们的做事数据库进行交互,而无需额外的事情。 这许可在可能利用或操作 Web 做事数据的前端和后端做事之间清楚地分离关注点。
结论——林迪效应的浸染林迪效应以纽约市的林迪餐厅命名,百老汇演出的未来受欢迎程度与其当前的演出长度直接干系,其运用范围远远超出了纯挚的演出。 它成为技能领域的一个令民气酸的不雅观察,强调了经由验证的方法的可靠性和持久性。
通过 htmx 和 Go 的结合,这一理念得以表示,回归到 Web 开拓的实质根本。 通过强调做事器端状态管理、在线 HTML 以及让人想起 jQuery 和 PHP 等早期 Web 技能的大略性,htmx 和 Go 不仅拥抱 Lindy 效应中蕴藏的聪慧,而且在经典原则和当代技能之间取得了平衡。 这种新旧结合、经由测试和创新的结合,为当代 Web 运用程序供应了强大的办理方案,并设定了一个立足于历史但面向未来发展的方向,勾引开拓职员走向既创新又植根于经由韶光磨练的实践的未来。