放弃传统模板语言,前后端分离架构和传统架构相比到底强在哪?
引言
在当今Web开发中,后端 Spring Boot 和前端Vue 通过前后端分离架构来结合,已经是一个成熟的主流技术栈了。
这种前后端分离的架构方式,目前广泛应用于约90%以上通过Java开发的Web应用中。
但是,对于为何弃用了之前服务端渲染页面的方式,而选择了前后端分离架构,现有大多数开发者和企业都是懵懵懂懂,甚至有些公司还觉得,之前一个人能干的项目,现在变成了两个人干,增加了成本和复杂度,降低了效益。
我们今天就来探讨一下
- 什么是服务端渲染页面?
- 传统服务端渲染页面的缺点。
- 什么是前端后端分离架构?
- 为什么选择前端后端分离架构?
什么是服务端渲染页面
在传统的服务端渲染页面中,通常采用模板引擎技术来渲染 HTML 页面,例如 JSP 和 Thymeleaf 等。它们的工作方式如下:
-
JSP(JavaServer Pages)
- JSP 是 Java 的一种服务器端技术,允许在 HTML 页面中嵌入 Java 代码。
- 当客户端请求 JSP 页面时,Web 容器会编译并执行 JSP 中的 Java 代码,生成动态的 HTML 页面返回给客户端浏览器。
- JSP 页面中的 Java 代码与 HTML 代码高度耦合,难以分离。
- JSP 的编写和调试比较繁琐,代码可维护性较差。
-
Thymeleaf
- Thymeleaf 相较于JSP是一种相对现代的服务端 Java 模板引擎,用于 Web 和独立环境。
- Thymeleaf 通过引入一套属性语言,使开发者在 HTML 文件中可以使用服务端数据。
- Thymeleaf 提供了一组标签,使开发者在模板中可以执行基本的编程操作,如循环、判断等。
- 相比 JSP,Thymeleaf 使用更加简洁、可维护性更强。
虽然两种模板语言不同,但是对于服务端最终输出和前端调用的方式大致相同。
示例代码
model.addAttribute()
是 Spring MVC 提供的用于服务器端模板渲染的数据绑定方法。通过该方法,开发者可以将数据模型注入到模板引擎(如 Thymeleaf、JSP)中,实现动态页面渲染。
后端编写接口(Spring Boot)
@RestController
public class UserController {
@GetMapping("/users")
public String listUsers(Model model) {
// 准备模型数据
List<User> users = Arrays.asList(
new User(1, "Tom", 25),
new User(2, "Jerry", 30),
new User(3, "Spike", 28)
);
model.addAttribute("users", users);
// 返回模板名称
return "userlist";
}
}
Thymeleaf 模板语言调用
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>User List</title>
</head>
<body>
<h1>User List</h1>
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Age</th>
</tr>
<tr th:each="user : ${users}">
<td th:text="${user.id}"></td>
<td th:text="${user.name}"></td>
<td th:text="${user.age}"></td>
</tr>
</table>
</body>
</html>
在这个示例中,后端控制器准备了模型数据 users,并将其传递给 Thymeleaf 模板进行渲染。
Thymeleaf 通过 th:each 循环遍历 users 列表,并使用 th:text 属性将用户信息插入到 HTML 表格中。
可以看出,无论是 Thymeleaf 还是 JSP,它们的工作原理都是将后端准备的模型数据插入到模板中,生成动态 HTML 页面。
不同之处在于,Thymeleaf 使用了自定义属性,而 JSP 使用了标签库和 EL 表达式。
传统服务端渲染页面的缺点
1. 耦合度高,难以分离前后端代码
在服务端渲染页面中,模板语言的代码与后端业务逻辑代码高度耦合在一起。
前端开发人员需要了解后端语言和框架,后端开发人员也需要涉及前端代码知识,导致前后端分工不清晰,相当于两份工一个人干了,虽然整体看人员少,但是实际工时和两人基本无差,项目周期无法缩短,效率方面无法提升。
2. 制约前端技术发展
传统模板语言的功能有限,无法完全利用现代前端框架(Vue/React)的数据驱动视图、组件化等特性,极大的限制了前端技术的发展。
3. 页面渲染效率低下
服务端渲染页面需要经过模板引擎的渲染过程,对于数据频繁变动的场景(如单页面应用),页面的局部更新需要重新渲染整个页面,导致浪费服务器资源,降低了渲染效率。
4. 用户体验不佳
服务端渲染页面为了获取新数据,通常需要进行整页刷新,这会中断用户的操作,形成体感断层,影响用户体验。
5. 缺乏灵活性
在传统模式下,前端使用后端框架的模板语言,技术选型缺乏灵活性。
比如后端使用 Java,那前端就只能使用 JSP 或 Thymeleaf。
6. 可维护性和扩展性较差
由于前后端代码高度耦合,功能的扩展和迭代维护都较为困难。
什么是前端后端分离架构
前端后端分离架构是指前端(客户端)和后端(服务器端)分别独立开发,通过 HTTP/HTTPS 等网络通信协议进行数据交互的一种架构模式。
前端后端分离架构大致包含以下几个部分:
- 前端: 负责构建用户界面,处理用户交互,发送 HTTP 请求获取或提交数据。常用技术栈有 Vue、React、Angular 等。
- 后端: 负责处理业务逻辑,持久化数据,提供 API 接口供前端调用。常用技术栈有 Java(Spring Boot)、Node.js、Python(Django)等。
- API 接口: 前后端通过统一的 RESTful API 接口进行通信和数据交互。
- 数据库: 存储应用程序数据。
示例代码
后端代码
##实体
public class User {
private Long id;
private String name;
private Integer age;
// getter/setter/constructor
}
//controller层
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping
public List<User> listUsers() {
List<User> users = Arrays.asList(
new User(1L, "Tom", 25),
new User(2L, "Jerry", 30),
new User(3L, "Spike", 28)
);
return users;
}
}
在这个示例中,后端提供了一个 /api/users
的 RESTful API 接口,用于返回用户列表数据。
前端 Vue 代码示例
<template>
<div>
<h1>User List</h1>
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Age</th>
</tr>
<tr v-for="user in users" :key="user.id">
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
<td>{{ user.age }}</td>
</tr>
</table>
</div>
</template>
<script>
import axios from 'axios'
export default {
data() {
return {
users: []
}
},
mounted() {
axios.get('/api/users')
.then(response => {
this.users = response.data
})
.catch(error => {
console.log(error)
})
}
}
</script>
在这个示例中,Vue 组件在 mounted
生命周期钩子中使用 axios
库向后端的 /api/users
接口发送 GET 请求,获取用户列表数据,并将其渲染到表格中。
通过这个示例,我们可以看到前后端分离架构的核心思想:
- 后端提供 RESTful API 接口,负责处理业务逻辑和数据操作。
- 前端通过 HTTP 请求调用后端提供的 API 接口,获取所需的数据。
- 前端负责rendering页面,处理用户交互。
为什么选择前端后端分离架构?
相比传统服务端渲染,前端后端分离架构能带来以下好处:
- 开发效率高: 前后端分工明确,专业的工作由相应的人员来完成,两个人分工合作,有利于提高整体项目开发效率,降低周期。
- 用户体验好: 前端可通过 Axios 等技术实现页面无刷新更新数据,提升用户体验。
- 扩展性和维护性强: 代码低耦合,易于扩展和维护。
- 更好的复用性: 前后端分离后,前后端项目都可以方便地移植到其他项目中复用。
- 前后端技术选型灵活: 前后端分离后,前后端可以自由选择合适的技术栈,避免技术的单一束缚。
- 部署方便: 前后端代码分离后,前后端项目可单独部署。
- 适应移动互联网: 前端通过响应式设计或构建移动端应用,适应移动互联网时代。
总的来说,前端后端分离架构有利于提高开发效率,改善用户体验,增强项目的扩展性和可维护性。
总结
前后端分离架构是当下 Web 应用开发的主流架构模式,它将前端和后端的职责分离,使得前端专注于构建用户界面和交互,后端专注于处理业务逻辑和数据操作,前后端团队能够独立开展工作,同时确保最终系统的高效运行与易用性。
在当下大环境,项目利润率降低,周期越来越短,弃用模板语言使用前后端分离架构,不仅能给企业带来更快的项目响应时间,还能给使用的客户带来更好的体感效果,这是以前模板语言所不具备的。