Decoupled Drupal

Drupal前后端分离的优势与不足

img
Preston So
11/29/2018
Decoupled Drupal

Preston So在新书《Decoupled Drupal in Practice》分析了Drupal前后端分离开发模式的优势与弊端,这篇文章中我们进行了要点摘录。要获得Drupal前后端分离的更多背景知识与见解,可以去亚马逊订购他的新书。

Decoupled Drupal优势

对营销团队、开发人员和企业来说,Drupal前后端分离开发方式最大的优势包括:内容同步发布、架构设计上关注点分离及流水线开发。当您的公司有JavaScript或其他非Drupal前端团队,项目中将Drupal用作Web服务提供商时,这些优势会显得非常重要。

当然,相对于前后端完全分离模式,Drupal渐进式前后端分离还有一些独有的优势,包括维护没有多个故障点的单片架构,及向用户提供不同级别​​的差异化交互体验的能力,本文不再作细分。

内容同步发布

“Write once, publish everywhere”正迅速成为全渠道营销的热门原则,内容提供商和运营商希望将内容发布到尽可能多的媒介中。无论是完整的Drupal站点,还是前后端分离的的Drupal存储库,都能在这些场景中承担内容枢纽的角色。

需要强调的是,Drupal不需要前后端的完全分离,就能保证内容同步成功。许多单片和端到端Drupal站点也会公开数据供其他应用使用。这正是Drupal创始人Dries Buytaert建议使用前后端分离开发的原因:作为面向公众的Drupal网站,它也是消费者应用的中心数据源。这保持了Drupal的端到端连续性,同时在Drupal网站上保留了Drupal的前端优势。

关注点分离

Web开发长期以来一直存在结构化数据与其内容呈现层之间关注点分离的难题。结构化数据及其交付构成了Drupal的结构框架,模板及其逻辑构成了Drupal内容的呈现。即使在单片Drupal中,人们也可以轻松区分构成Drupal关键后端功能的层(如数据库本身、数据库抽象层)及其前端功能的层(如Twig主题层)。

在单片和渐进式前后端分离的Drupal中,这种关注点分离是隐性的并在很大程度上对用户不可见;在完全前后端完全分离的Drupal中,由Drupal处理的结构化数据与由消费者应用处理的外观之间则有着明确的划分。因此,可通过以JSON或XML格式向前端传递数据,外观与样式变成使消费者应用的责任,与默认的Drupal前端分开。

以用户为中心的产品体验

通常人们认为良好的用户体验源于好的设计与开发,而不是来自于架构决策。但我认为Decoupled Drupal架构确实带来了改善用户体验的优势。例如,交互式应用程序需要频繁重新渲染内容,Drupal中处理可能不像在JavaScript框架中那样有效。对移动应用程序用户来说,用户体验却又非常重要。

在渐进式前后端分离的Drupal中,JavaScript框架被用来增强Drupal提供的现有用户体验。无论是尽可能多地替换原有交互体验,还是为单个页面的一部分添加交互性,用户体验都得到了改善。

前端人员工作体验

对许多前端开发人员而言,Drupal的Twig驱动前端很复杂,与他们过去用过的范例截然不同;对JavaScript开发者来说,现代前端开发还必须要用NPM等JavaScript开发工具。此外,业务部门可能想要高度交互式的应用程序,Twig和Drupal的AJAX框架却没办法满足需求。这些情况下,无论是采用完全的还是渐进式的Drupal前后端分离开发模式,都能让开发团队以差异化方式运用自己的专长来研发功能。

鉴于近年来JavaScript语言所取得的巨大进步,及其在客户端交互上的优势,这一点显得特别重要。 当前JavaScript ES6版本的新功能包括扩展的浏览器支持,如箭头功能、非结构化赋值、扩展运算符和类等,为开发人员带来了前所未有的愉快体验。

流水线开发

在流水线开发中,不同技能的团队并行工作,且不会妨碍彼此的工作或损害项目的完整性。Drupal前后端分离开发模式为我们打开了流水线开发的大门,前端团队可以基于虚拟Web服务API构建应用程序,而后端团队可以构建后端来实现API接口与底层流程。

完全分离和渐进式分离的Drupal架构让团队可以按自己的节奏来安排工作。举个例子,Ember开发者虽然精通Handlebars,他们可能无法理解在Drupal中提供Web服务API所用的系统,但Drupal开发人员可以。前后端分离开发后,前端开发者不再受到复杂的Drupal主题层的影响,且可以控制标记和渲染,Drupal开发者则可以专注运用他们在后端的专业知识并创造出强大的RESTful API。

总结

这一节,我们讨论了Drupal前后端分离的开发方式的优势。这些优势包括“Write once, publish everywhere”,通过一次编写将内容发布到全渠道;还有关注点分离,将结构化数据与内容呈现分开;此外,开发人员和用户的体验都能得到改善。当然最大好处还是流水线开发,不同专长的开发人员可以在不同的组建上并行工作。

Drupal前后端分离弊端

虽然Drupal前后端分离优势显著,我们也不能忽视它的缺陷。在您需要Drupal前端功能或依赖于Drupal默认前端的其他关键功能时,仅将Drupal用作Web服务器或内容存储库可能会危及整个架构。下面是我们罗列的其他一些风险。

增加了故障点

通常,单片Drupal托管在LAMP(Linux,Apache,MySQL,PHP)堆栈上,这些堆栈在当今的Web上无处不在。另一方面,前后端完全分离架构中客户端的JavaScript消费者应用必须使用Node.js堆栈,如MERN(MongoDB,Express,React,Node.js)或MEAN(Angular代替React)。对于有着不同需求的本地移动或物联网应用,很可能需要其他解决方案。

结果就是,不仅在您的基础架构上引入额外的托管堆栈,还在您的架构中引入了另一个故障点。例如,作为Web服务提供者的Drupal站点没有正确地缓存,应用程序传达给用户的数据就可能已过时或无法访问。同样地,消费者应用的停工,将导致用户无法访问您的内容,除非您的Drupal站点也可公开访问。

安全性与输入验证

绝大多数现代JavaScript和应用程序框架都有对抗跨站点脚本攻击的方法,包括输入验证等方法,Decoupled Drupal强制要求您仔细审查架构的安全隐患。尽管Drupal为所有表单字段提供了开箱即用的表单验证和文本清理功能,但它们仅存在于单片架构。

如果您选择使用定制框架或Vanilla JS ,用户输入的安全性将成为潜在的巨大风险,需要特别注意。其实您不必让Drupal进行繁重的工作,而是需要进行充分的研究,以评估您是否采取了令人满意的措施来确保用户数据、消费者应用程序以及整个架构的安全性。

上下文编辑与管理

Drupal 8最受好评的功能包括就地编辑和配置上下文链接。在单片架构中的内容预览期间,这些界面允许网站构建者与内容编辑调整内容,同时实时查看结果,或从预览页面直接切换到管理页面。

然而,这些上下文化工具在前后端完全分离的Drupal架构中不再可用,除非您在消费者应用程序上重建,但这将导致功能重复。渐进式前后端分离方法在某种程度上减轻了这一点,但它有“黑匣子”问题,即页面decoupled区域中的内容无法自由编辑或管理。

布局和外观管理

Drupal 8的布局和外观管理功能模块,带来了一系列提供可变内容显示(Display Suite)和构建由内容窗格(Panels)组成的布局的选项。因为它们需要对Drupal的标记进行大量控制,这些模块需与Drupal的表示层紧密耦合。

从编辑公式中删除Panels和Display Suite等模块,意味着布局管理成为开发人员的任务,而非编辑者。对于没有程序员支持的营销团队而言,这会成为相当大的挑战。为了允许编辑继续掌控布局而不仅是内容,您将需要使用Drupal的表示层,将布局管理重建为消费者应用中的一项功能,或者通过RESTful Panels等模块以可摄取数据形式公开布局配置。

可预览的内容工作流

靠谱CMS基本功能之一是能在编辑内容工作流中,方便地进行新建、预览草稿和提交审查等操作。对于习惯了传统CMS的编辑团队来说,如果用其他前端替换掉的Drupal内容预览和内容工作流,将会造成不小的麻烦。当然,迂回替代方案是存在的,例如配置额外的测试环境以部署不同的内容,或扩展web服务通过辅助认证或唯一查询参数暴露使差异化内容可公开访问。

系统通知

Drupal的另一优点是其强大的通知系统,它会展示Drupal系统过程中出现的任何问题,特别是需要立即引起注意的严重系统错误。虽然Drupal有REST资源用于获取监视程序日志,但这些资源仅提示管理员应该仔细检查部分问题。另外,在前后端完全分离的Drupal环境中,无法经常在渲染页面顶部突出显示Drupal系统消息。

为了保持对Drupal中可能出现问题的掌控,尤其是那些会影响数据传输到消费者应用的问题,仔细监控Drupal后端界面中的系统消息非常重要。因为没有实质性的自定义代码,这些消息将是难以获得。在渐进式解耦分离设置中,提供这些消息不是一个问题,因为Drupal确实处理了一些渲染,并且只需要一个可以看到这些系统消息的区域。

单片性能优势

Drupal 8最引人注目的功能之一是缓存标记,也称为缓存元数据,它允许开发人员定义Drupal管理的数据的依赖关系,并允许依赖粒度内容的项目的缓存失效。例如,BigPipe贡献模块通过渐进式页面加载来缩短首次有效渲染的时间。

这些功能令Drupal能在页面加载期间实现显著性能提升。BigPipe类似JavaScript应用的页面加载性能,减轻了开发人员对单片Drupal性能的担忧。这种依赖缓存元数据的渐进式加载对前后端完全分离的开发人员是不可用的,但某些情况下渐进式前后端分离项目依旧可以使用该功能。当然,对那些不是已有Drupal站点或者不太熟悉Drupal功能集的人来说,这个缺点不影响大局。

可访问性与用户体验

最后也是最重要,Drupal在可访问性和用户体验方面具有突出优势,包括最大限度地考虑标记及如何呈现给残疾人和辅助技术用户。举一个例子,Drupal使用ARIA角色等技术确保所有内容都可供屏幕阅读器用户使用。此外,使用Drupal的Form API的任何人都肯会受益于一系列标准化且经过实战考验的最佳实践。

在完全分离和渐进式分离的设置中,Drupal不再提供现成前端代码或核心接口组件和交互列表,涉及到JavaScript应用、标记和用户体验需要更多的思考。这样一来,前端开发人员需要在没有Drupal支持的情况下创建合适的用户体验和强大的可访问性。幸运的是,JavaScript框架近年来在可访问标记方面取得了重大进展

总结

虽然Drupal前后端分离好处多多,但还需要进行权衡,特别是在仅将Drupal用于独立内容服务时。如果选择前后端分离架构,要保证开发团队需要同时具备Drupal与前端专业技术。