本文提及的后端渲染主要指 Rails 后端渲染。这里说的前后端分离不意味着使用了 React/Vue 这样的前端库就是前后分离。在后端渲染的应用中也可以集成 React/Vue。
最近这两年由于前端技术圈一直都很热门,有不少产品都做成了前后端分离的单页应用(SPA)。
关于前后端分离究竟是好还是不好,社区里之前曾有过一次比较激烈的探讨 https://ruby-china.org/topics/34846 。大家都各有各的看法,不过从这个话题的回答中我个人感觉社区中很多人其实是不太支持前后端分离的,毕竟 Rails 这样的全栈框架已经可以很好地适用于大多数应用,Rails 自带的 ujs 和 form 已经足够处理很多前端开发中的常见问题。
昨天看到有同学也在纠结是 Rails 项目是做成单页应用还是前后端分离 https://ruby-china.org/topics/36894 。我在最近的一个 Rails 项目里也有过这样的纠结和尝试,所以做了一段回答。我把之前问题的回答做了份整理,想说给大家听听。
我们在项目技术选型时想到有些界面的交互比较复杂,再加上我们想用 ant-design 的 UI,而实现了 ant-design 的 UI 库只有用 React/Vue/Angular 实现的。而 Vue 是一个相对轻量级的库,集成进 Rails 很容易。所以经过考虑,我们决定引入 Vue。但是不做成单页应用,就用后端渲染,想最大程度地利用 Rails 带给我们的便捷。(之前我也看到过很多批判前后分离的,所以在这里我主观上也是不希望做成单页应用的)
但是到了真正开发的时候,由于我们引入了基于 Vue 的第三方 UI 库,对于 Vue 的依赖其实比较重。而我们又是传统的后端渲染方式,所以碰到了这样几个问题:
window.location
这样类似的方式进行 redirect。这个行为既不符合 Rails 也不符合单页应用的规范。(单页应用中通常使用前端 Router 去跳转)我们在最初的开发中就一直想着的就是避免做成单页应用,但是随着开发的进展和我们遇到的问题,我们发现我们的代码既不像一个后端渲染应用,也不像单页应用。究其根本,在我们决定使用基于 Vue 的 ant-design UI 库的时候,我们就应当想到重度依赖这些组件的界面,就应当做成单页应用。这样就可以减少很多不必要的麻烦。
为什么我们在最初会坚持使用后端渲染而不是前后端分离呢?在这时我又重新思考了下项目开始时考虑到的单页应用的缺点:
这三个主要痛点中,最后一点是我们无法去改变去优化的。Rails 这个全栈框架带给前端开发的各种优点,我们都将无法从中获益。但是换一个角度思考,在我自己的例子中,我因为不忍心放弃 Rails 在前端开发中的优势,在一些并不太适合用后端渲染的界面中使用 Rails 去渲染,反而束缚了自己,让 Rails 的这些优点成为了“阻碍”。
这个问题没有标准答案,一切都需要根据我们的场景和环境所决定。针对于我们的场景,既然我们选择了基于 Vue 的 UI 库,也就意味着我们在前端方面会强依赖于 Vue,这时候如果为了使用后端渲染而选择后端渲染,则显得很不合时宜。事实也证明,强行后端渲染让我们花费了更多的精力去调试很多意外的问题,最后得到的还是一份不规范的代码。 究竟该如何选择,我想给出点简单的建议:
无论是后端渲染还是前后端分离,我们的目的都是为了解决问题。二者并没有优劣之分,都是针对 Web 开发的解决方案。无论我们采用其中哪种方式,使用怎样的框架和库,都是为了提升开发效率和质量,都是了给我们自己带来便利。而不是让我们自己去硬生生地去为了使用后端渲染或者前后端分离强行去适应,反而制造出很多本来没有的问题。
你不必因为这几年前端的“热”就去盲目追随这个潮流,所有场景不加思索就直接前后端分离,放弃后端渲染。同时,你也不必像我一样,在过于依赖前端框架、使用前后端分离会更合适的场景硬要上后端渲染。看清楚当前的业务场景,找到适合自己和团队的方式,高效高质量地开发才是我们最终的目标。