从后端套模板到 Vue 响应式:现代前端开发的演进之路

56 阅读3分钟

从后端套模板到 Vue 响应式:现代前端开发的演进之路

作为一名前端工程师,我们经常听到“数据驱动”、“前后端分离”这些术语。但为了真正理解现代框架(如 Vue 3)的价值,我们需要回头看看 Web 开发是如何一步步走到今天的。

通过对比传统的后端 MVC 模式早期的 DOM 编程,以及现代的响应式数据驱动,我们可以清晰地看到开发模式的变革。

1. 纯后端套模板的时代 (MVC)

在 Web 开发的早期,或者在 Node.js 刚兴起的阶段,并没有明确的“前端工程”概念。那是一个“后端包办一切”的时代。

开发模式

在这个阶段,页面是由服务器端直接生成的。以前端视角来看,这种模式被称为 MVC (Model-View-Controller) 开发模式。

  • Model (数据) : 数据库中的数据(如 MySQL)。
  • Controller (业务逻辑) : 负责查询数据,并将其注入到模板中。
  • View (视图) : HTML 模板,通过占位符(如 {{todos}})显示数据。

代码实例

看看这段基于 Node.js 原生 http 模块的代码。服务器在接收到请求时,直接拼接 HTML 字符串并返回给客户端:

JavaScript

// server.js - 后端直接拼接 HTML
function generateUserHTML(users) {
    const userRows = users.map(user => `
        <tr>
            <td>${user.id}</td>
            <td>${user.name}</td>
            <td>${user.email}</td>
        </tr>
    `).join('');
    // ... 返回完整的 HTML 字符串
}

const server = http.createServer((req, res) => {
    // 路由判断与响应
    if (parsedUrl.pathname === '/users') {
        const html = generateUserHTML(users); // 数据在后端“死”在了 HTML 里
        res.end(html);
    }
});

痛点: 前端逻辑(HTML/CSS)与后端逻辑(Node.js/SQL)高度耦合。修改一个样式可能需要重启后端服务,且无法提供流畅的用户体验(每次操作都需要刷新页面)。


2. 前后端分离与 DOM 编程的阵痛

随着对用户体验要求的提高,前后端分离成为了主流。

  • 后端:不再返回 HTML,只负责提供数据接口(API),例如 http://localhost:3000/users
  • 前端:通过 Ajax/Fetch 主动拉取数据,并在浏览器端渲染。

开发模式

虽然解耦了,但在 Vue/React 普及之前,前端开发者面临着繁琐的 DOM 编程。我们需要手动找到 DOM 节点,然后用数据去更新它。

代码实例

以下是一个典型的原生 JS 实现。注意我们是如何手动操作 innerHTML 的:

JavaScript

// index.html - 原生 JS DOM 操作
fetch('http://localhost:3000/users')
    .then(res => res.json())
    .then(data => {
        const tbody = document.querySelector('tbody'); // 1. 找节点
        // 2. 拼接字符串并手动插入 DOM
        tbody.innerHTML = data.map(user => `
            <tr>
            <td>${user.id}</td>
            <td>${user.name}</td>
            <td>${user.email}</td>
        </tr>
        `).join('');
    })

痛点: 这种做法不仅代码冗余,而且性能较差(频繁操作 DOM)。最重要的是,开发者的精力被分散在“如何操作 DOM”上,而不是聚焦于业务数据本身。


3. 响应式数据驱动 (Vue 3 & Composition API)

终于,我们迎来了响应式数据驱动的时代。这是现代前端框架的核心。

核心理念

  • Ref 响应式数据:将普通数据包装成响应式对象。
  • 数据驱动界面:开发者只需要修改数据,界面会自动更新。不用再做繁琐的 DOM API 操作。
  • 解耦优势:前端只需关注数据的展示和用户体验,后端只需关注数据处理和并发性能。

代码实例 (Vue 3)

看看使用 Vue 3 的 <script setup> 语法是多么简洁:

HTML

<script setup lang="ts">
import { ref, onMounted } from 'vue';

// 1. 定义响应式数据
const users = ref([]);

onMounted(() => {
  // 2. 获取数据,直接赋值给 users.value
  // 界面会自动感知变化并重新渲染,无需手动操作 DOM
  fetch('http://localhost:3000/users')
    .then(res => res.json())
    .then(data => {
      users.value = data;
    })
});
</script>

<template>
  <tr v-for="user in users" :key="user.id">
    <td>{{ user.id }}</td>
    <td>{{ user.name }}</td>
    <td>{{ user.email }}</td>
  </tr>
</template>

总结

server.js 的字符串拼接,到 index.html 的手动 DOM 操作,再到 App.vue 的响应式绑定,我们看到了 Web 开发的清晰脉络:

  1. 后端套模板:业务逻辑与视图混杂,维护困难。
  2. 前后端分离 (DOM 编程) :虽然解耦了,但前端陷入了繁琐的 DOM 操作泥潭。
  3. 响应式驱动:回归业务本质。我们不再通过代码去“命令”浏览器怎么画图,而是通过改变“数据状态”,让框架自动映射出 UI。

这就是为什么我们需要 Vue。它让我们从底层的 DOM 操作中解放出来,专注于创造更好的用户体验。