花瓣–端到端Web堆栈

2021-01-15 20:18:54

(PETAL是Patrick Thompson创造的,描述了他结合使用的一组特定工具并取得了良好的效果。我只是在这里告诉您。)

因此,我们采用Phoenix,这是一个继承自Rails的Web框架,同样专注于开发人员的经验和生产力,却没有我所了解的那种魔术,而这引起了Rails的许多问题和困惑。我必须对此作见证报告,因为我以前曾做过Python和Django。我发现Phoenix也比Django更强大和明确。

然后,我们服用长生不老药。函数式编程学校中的一种开发人员友好的高级语言。由于涉及的人员众多,Elixir具有Ruby的风格传统,但很大程度上是它自己的语言。

(Changelog的平台由Elixir和Elixir的创建者JoséValim共同构建,已经进行了3次播客。)

Elixir建立在非常受人尊敬的运行时,即BEAM上,该运行历来为Erlang提供动力。 BEAM在爱立信专为电信目的而设计,用于分布式系统,这意味着处理并发并保持良好的延迟。对于多核计算机以及集群分布式系统,它的并发性都很好。它是功能强大的虚拟机,旨在提供软实时性能。 Whatsapp与Erlang一起建立并取得了巨大的成功,该团队可以在一个很小的团队中运行一个庞大的系统。有了Elixir,我们看到像Discord这样的公司正在重复取得成功。

Tailwind CSS是一个很好的CSS框架。我没有深入了解Tailwind,所以我无法谈论它的强大功能。但是JS Party播客以最奇怪的方式进行了报道,Thinking Elixir围绕我建议的所有PETAL进行了很好的对话。

Alpine.js是Caleb Porzio的JavaScript框架,他为PHP构建了Livewire(灵感来自Elixir的Phoenix LiveView)。当您需要严格的客户端交互性而这些实时服务器端渲染解决方案将无法使用时,它可以很好地工作。它应该为您提供比原始JavaScript更方便的功能,同时又尽量避免使用。帕特里克·汤普森(Patrick Thompson)在ElixirConf演讲中介绍了许多LiveView + Alpine.js。凤凰城名人堂的克里斯·麦考德(Chris McCord)在DockYard上也做了一些报道。

LiveView。我敢说这是演出的明星。它是Phoenix网络框架中越来越重要但又可选的部分。

它允许极其高效的实时交互性和UI,而无需为大多数用例编写前端JS。这个想法并不是一个全新的概念,但是由于Elixir / Erlang和BEAM建立在参与者模型上,并且具有强大的功能来管理内存中的状态,事件和消息传递……实际的实现是绝对出色的。这是建立交互性的一种非常可喜的且富有成效的方式。

因此,它所做的基本上是服务器端渲染(SSR)并通过WebSocket连接运送更新的零件。克里斯·麦考德(Chris McCord)在ElixirConf EU的主题演讲中对此进行了更好的解释。像Elixir和Phoenix团队建造的大多数东西一样,执行起来要比拥有任何权利更好。

现在,为了对LiveView的概念进行一些外部验证,我想借鉴一个喜欢的Changelog实体。我将调用Basecamp。因为Caleb Porzio不仅因为LiveView而受到启发来创建Livewire。我以为最近从Basecamp发布的Hotwire从Livewire取了它的名字……突然间我们可以追踪到血统。我认为DHH一直在研究这种想法,因此我不确定LiveView是否与它的创建有关,但是对于相同的问题,它们是否是相似的解决方案:对于许多人来说,构建SPA都是一件很该死的工作。用例。

无论您是使用现代JavaScript的牛肉,还是发现工具令人沮丧,或者根本没有发现对您的项目有意义的时间投入……人们寻求这些解决方案的原因很多。随着Hotwire的发行,DHH继续使用Full Stack Radio并进行了详尽的讲话。我认为他做得很好,没有说“我讨厌JS,从不想写它”。相反,他强调自己非常喜欢并喜欢Ruby,并希望专注于并使用该语言。我认为他在与PETAL堆栈非常相似的对话中提出了很多优点。如果您更喜欢Rails,那么Basecamp堆栈可能很棒。

现在我喜欢并享受长生不老药。我也碰巧认为它在技术上是优越的。那不是世界上最重要的事情,但这让我感到高兴。我发现它为我提供了比我以前使用过的任何其他堆栈更多的工具。这是一个相当普遍的故事,Ruby商店重建了一个系统,该系统在Ruby中使用Elixir表现不佳,却突然忘记了它的存在,因为它再也不会造成麻烦,并且只需一部分以前的力量即可以相同的速度执行。在有关爬行的演讲中,亚当·莫坎(Adam Mokan)涵盖了其中的一些方面。

我认为PETAL堆栈非常引人注目。为什么?因为它为选择这些图层的常见问题提供了有效的解决方案,但不会使您陷入困境。

Phoenix负责您的核心Web服务器工作以及基本的渲染和表单。 LiveView将您的系统带到客户端,并为80-90%的情况提供实时交互性。剩下的10-20%的高触摸互动性都来自Alpine。 Tailwind CSS为您提供了所需的视觉和样式基线以及工具。这将为您提供Web应用程序UI所需的全部功能,以及将数据持久保存到DB的所有功能。

隐藏在Elixir的“ E”中是一组令人难以置信的功能,大多数语言都没有。您将获得所有的Erlang OTP,这是一个功能强大的标准库。看,随着项目的发展,乐趣真正开始了。因为您可以像在其他地方一样在这个生态系统中成长。要添加第二个主机?您可以选择将它们群集在一起,以允许在节点之间进行透明的消息交换。一个应用程序分布在许多主机上。 Phoenix,Channels,LiveView和朋友已经很酷了。它就是有效的。当然,如果您愿意,也可以运行更典型的共享内容。您需要做背景工作吗?无需将其卸载到另一个进程。您的应用程序已准备好管理无数并行进程。

最好在可以同时执行多项操作的运行时上运行。

由于运行时的考虑,您可以构建某些东西而无需离开应用程序或创建人为的边界。在Python Web应用程序或Node.js后端中,这真的很难争论。您可以跳过许多用例的Celery或Sidekiq工作人员。还有一个非常简洁的库,称为site_encrypt,可自动为您设置LetsEncrypt。它无需certbot或单行cron即可工作。因为可以。

我认为这个堆栈对于新学习者来说很有可能接近,而实际上并没有为未来的增长设置任何限制。您可以从简单的表格开始,仅使用此堆栈,直到使用CRDT并应用混合逻辑时钟,或者执行事件驱动的体系结构并提取大量数据为止。在高级动态语言(例如Python,Node.js或Ruby)中,传统的权衡取舍是牺牲性能,以方便开发人员和快速迭代。 Elixir在相同的高抽象水平上工作,但建立在截然不同的基础上。分布和并发问题是这些语言苦苦挣扎的主要瓶颈。他们通常尝试通过协作式多任务处理来解决该问题,这需要在不延迟屈服时间的情况下穿针工作,以完成什么样的工作,否则您将影响系统的其他部分。您可以以并发非并行方式处理许多请求。您运行更多实例以实现并行性。

使用Elixir和BEAM,您将获得另一个范例,该范例使用抢先式调度(由Functional Programming和Actor模型启用)来并行运行事物。它具有一个调度系统,可以防止繁重的工作拖延生产线,因此可以保护系统延迟,因此您不必全神贯注地瞄准可以产生收益的IO点。默认情况下,它可以跨CPU内核扩展。

与其他高级语言一样,Elixir在数字运算方面的性能也无法击败C ++。但是,它非常适合长时间运行的应用程序,并发,状态管理和分布式计算。这就是我们作为后端Web开发人员所做的。

Erlang已经这样做了很长一段时间。 Elixir使它更易于访问并带来更好的工具。 凤凰城给所有网络带来了便利。 现在,围绕LiveView形成,与返回服务器端渲染的趋势相吻合,我们可以看到对最终部分(一直到CSS以及JS交互的最后一英里)的系统化方法的形式。 Lars Wikman是Changelog的代码库,新闻提要和开发人员社区的重要贡献者。 您可以(并且应该)在underjord.io上从Lars阅读更多内容。