似乎从我开始学编程起,默认的开发模式就是前后端分离。但是,面对一门心仪的后端框架(如 django,laravel,它往往还带着仿佛上古时期留下来的模板引擎。为什么随着时代的更迭,模板引擎这种明显前后端耦合的东西还会存在呢?面对自己将来的定位(独立开发者),该如何根据情况进行技术选型呢?

开门见山

直接说结论,碰到以下需求的,用前后端分离:

  • 你不是一个人单干,需要一个技术团队。也许这时候你的业务已经初具规模,那么,为了团队更顺畅的沟通,必然选择为团队协作开发而生的前后端分离。
  • 你的应用有多端需求,比如 pc/ios/android 都有页面要做,这样后端只需提供接口,各端负责展示,后端就实现了复用。
  • 你的产品确定了一上线肯定会有很多用户使用,有服务器压力。前后端分离可以方便的进行服务资源扩展。

从历史发展的角度

上古时期,前后端不分离,后端也要负责页面的展示。jsp、php 是最受欢迎的模板语言,因为他们可以很容易地搭建起网站。后来,移动互联网的到来才是改变一切的原因。一方面,移动互联网使得互联网用户井喷式增长,对于服务器的压力承受水平提出更高的要求,服务端渲染的模式在高并发场景下很容易导致宕机,造成损失;另一方面;移动端的原生应用肯定不是用服务器返回的 html 页面来展示的,它们都有各自的底层框架,这样,就必须将前后端解耦,使手机 app 能单纯获取到数据。

近年来,前后端分离的模式也在演进。主要是前端的变化:从 jquery 按页面开发,到 vue/react 框架按组件开发。前端的进化带来了新的问题:首屏加载速度慢和 seo 糟糕。

  • 首屏加载速度慢:前端项目用框架开发好后,打包生成的文件里,除了静态的 css、img、font,只有一个巨大的 js 文件夹和 index.html。如果没有优化,所有的资源文件一次下载完毕后才能正常显示,不过这种情况下,后续的页面跳转会比不用框架快。
  • seo 糟糕:中国的搜索引擎百度还不能解析 js 文件,只能爬取到空的 index.html 页面。

解决方案有很多,可以参考这篇文章(链接)。这里以 Vue 的 SSR 框架 Nuxt.js 举例。在服务端起一个 node 应用,浏览器到来时,先拦截执行部分 js 异步请求,提前将数据填充到 html 页面中返回浏览器。这样爬虫抓取到的页面就是带数据的,有利于 SEO。也就是说,nodejs 作为中间层,模拟了一部分浏览器渲染数据的角色。

总结

如果将来自己独立开发,如果有一个新的 idea,你想快速发布原型,查看市场反应,而且暂时没有手机原生 app 端的需要(手机可以在浏览器上访问,只要兼顾到响应式)。那么就用 laravel 框架的模板语言将产品快速做出来,如果将来业务量增长了,可以先分离前后端,前端用 SSR 框架重写,如果用户增长到一定规模,就招人,用高性能语言,如 java、go。