上一篇文章,我们讲到了前端开发起点——静态网页时代。本篇文章中,我们继续顺着历史的脉络,从 1990s 的“静态网页” 往前走,进入 2000s 的“动态交互时代” 。这一时期的关键词就是:
用户要互动 → 网页要更灵活 → 技术堆栈不断补丁式进化。
初步认识
历史背景:从“只读网页”到“可交互应用”
到 1990s 后期,互联网的普及速度飞快。人们开始在网上做更多事:
- 填写表单、提交数据(比如注册、登录)。
- 动态显示内容(新闻、股票、天气)。
- 网页要像桌面软件一样“即时响应”,而不是每次都整页刷新。
👉 问题出现了:
- HTML + CSS 是静态的,只能展示。
- JavaScript(早期)功能有限,主要是小脚本(表单校验、弹窗)。
- 想要“动态内容”,几乎只能依赖后端(PHP、ASP、JSP),每次都要刷新整个页面。
这种“整页刷新”的体验非常差:
- 页面闪烁,用户要等待。
- 网络负担大,效率低。
关键突破:Ajax(2005)
1. 遭遇的问题
- 用户希望网页能“局部刷新”,而不是整页重载。
- 例如:你在网页里填写注册表单,如果输错一个用户名,还要整页刷新告诉你“用户名已存在”,体验很差。
2. 解决思路
- Ajax(Asynchronous JavaScript and XML) 的核心思想:
-
- 浏览器里运行的 JS 可以异步请求服务器数据,
- 然后只更新页面的一部分,而不是刷新整页。
3. 使用方式
// 简单的 Ajax 调用
const xhr = new XMLHttpRequest()
xhr.open("GET", "/api/data", true)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
document.getElementById("box").innerHTML = xhr.responseText
}
}
xhr.send()
👉 效果:
- 页面不再闪烁,用户能“无感知”地获取新数据。
- 这直接催生了 Web2.0 应用(比如 Gmail、Google Maps)。
jQuery(2006):JS 的大众化革命
1. 遭遇的问题
- 原生 JS 操作 DOM 很复杂:
-
- 兼容性差(IE vs Firefox)。
- API 冗长(
document.getElementById...)。
- 稍微复杂点的交互代码,就会像“面条”一样缠绕。
2. 出现的技术
- jQuery(2006 John Resig 发布):一句口号就是
“Write less, do more.”
- 它封装了 DOM 操作、事件绑定、Ajax 调用,统一浏览器兼容性。
3. 使用方式
// jQuery 选择器 + Ajax
$("#btn").click(function () {
$("#box").load("/api/data")
})
👉 只用几行代码,就能做复杂的事。
前端动态化的其他补充
1. Flash(1996–2010)
- 出现问题:早期网页动画和多媒体播放几乎不可能。
- 解决方式:Flash 插件,能播放视频、做动画、做小游戏。
- 结果:一度成为网页交互的标配(优酷、4399、小广告)。
- 局限:依赖插件、不安全、耗电,最终被 HTML5 淘汰。
2. 模块化的萌芽
- JS 代码越写越多,组织困难。
- 出现了 模块加载器:
-
- RequireJS (AMD 规范)
- SeaJS (CMD 规范)
- 为后来的 ES6 模块化铺路。
用户体验的飞跃:案例对比
注册表单验证(2000 vs 2006)
-
没有 Ajax(2000 前)
- 用户输入用户名 → 点击提交。
- 页面整页刷新 → 后端验证 → 返回结果。
- 用户等待 3~5 秒,体验割裂。
-
有 Ajax + jQuery(2006 后)
- 用户输入用户名,光标移出输入框。
- JS 立即用 Ajax 异步请求后端。
- 页面不刷新,提示“用户名已存在”。
👉 用户感觉:
- 以前是“报纸式体验”(一页一页翻)。
- 现在是“应用式体验”(即时反馈)。
这一阶段的智慧总结
- 核心问题:网页要从“静态文档”进化为“动态应用”。
- 关键突破:Ajax(异步请求,局部刷新)。
- 大众化工具:jQuery(封装 DOM & Ajax,统一兼容性)。
- 补充角色:Flash(动画/视频)、模块化加载器(组织 JS)。
整体逻辑链
- 1990s:网页只能展示 → 静态。
- 2000s:用户想要交互,不能每次都整页刷新 → 动态交互(Ajax + jQuery + Flash)。
了解完上面的内容后,我们知道了之所以会如此发展,是因为JS不具备动态刷新能力,那么为什么呢?
当时的 JS 为什么不具备动态刷新能力
1. 什么是“动态内容”?
在网页语境下,“动态”就是 内容不是死写在 HTML 文件里,而是根据用户操作、数据库数据、时间等因素临时生成的。
举几个 2000 年左右的例子:
-
静态页面(无动态)
- 比如一个“关于我们.html”文件,里面写死了公司介绍,不管谁访问,看到的都是一样的内容。
-
动态页面(后端生成)
- 用户输入账号密码 → 服务器查询数据库 → 拼接 HTML → 返回带有“欢迎,张三”的页面。
- 新闻网站首页,每次访问展示的新闻可能不同,这是服务器根据最新数据动态生成的。
- 电商网站的“搜索结果”,根据你搜索的关键词生成,而不是一个写死的文件。
所以,动态内容= 随用户、时间、数据不同而生成或变化的内容。
2. 为什么当时 JavaScript 不具备“动态刷新”的能力?
要理解这个,要看 JS 的初衷和浏览器的能力限制:
(1)JS 的设计初衷
1995 年,Brendan Eich 在 Netscape 浏览器里发明了 JavaScript,最初定位只是:
-
小脚本语言
-
用来增强表单验证、触发一些简单交互,比如:
- 表单没填就弹窗
alert("请输入邮箱!") - 点击按钮改变文字颜色
- 表单没填就弹窗
它并不是为“更新页面数据”设计的,而是“辅助 HTML 的小工具”。
(2)浏览器限制:没有数据通信能力
要想“动态刷新”,本质上需要:
- 浏览器向服务器请求数据
- 拿到数据后在页面上更新展示
但是在 1990s ~ 2000s 初期:
- 浏览器里没有专门的 API 来做“异步请求”
- 每次获取数据只能 整页刷新(即重新加载一个新 HTML 页面)
- JS 只能操作已经加载好的 DOM,不能去拉新数据
(3)转折点:AJAX 的出现(2004 年左右)
真正让 JS 拥有“动态刷新”能力的,是微软 IE 的一个“副产品” → XMLHttpRequest 对象。
- 最早是用来在 Outlook Web Access(网页版邮箱)里做“收发邮件无需刷新整个页面”。
- 后来被开发者发现:可以用来在后台偷偷请求数据,再用 JS 更新页面。
Google 在 2004 年用 AJAX 技术做了 Gmail、Google Maps,用户第一次体验到“网页像桌面软件一样丝滑”,这才让 JS 进入真正的“动态交互”时代。
3. 总结对比
| 时代 | 动态的来源 | 浏览器/JS 能力 | 用户体验 |
|---|---|---|---|
| 静态 HTML(1990s) | 无动态,内容写死 | JS 只能改颜色/弹窗 | 刷新=换页面,死板 |
| 动态网页(2000s 初期) | 服务器拼 HTML(PHP/ASP/JSP) | JS 不能拉新数据,只能处理现有 DOM | 每次操作要整页刷新 |
| AJAX(2000s 中后期) | JS 可以请求数据、更新 DOM | JS + XMLHttpRequest | 无刷新体验,真正动态交互 |
所以我们看到的“当时动态内容靠后端”= 因为浏览器不给 JS“拿数据”的能力,JS 只能在现有 HTML 上玩花活。直到 AJAX 出现,JS 才具备“动态刷新”的能力。
2000 年前后(动态交互刚兴起) JS不具备动态刷新能力的情况下,是如何做到动态页面的?
前后端分离在当时是什么情况?
今天我们常说的“前后端分离”(前端写 Vue/React,后端写 API,前端直接调 JSON 数据)是在 2010 年后 AJAX 普及 + 单页应用(SPA) 出现后才逐渐成熟的。
而 2000 年前后:
-
没有真正的前后端分离
- 前端:HTML + CSS + JavaScript(只能做很轻的交互,比如按钮点击、表单校验、弹窗)。
- 后端:PHP、ASP、JSP、Perl、ColdFusion 等,负责“生成 HTML 文件”。
-
用户访问页面时:
- 浏览器发起请求。
- 服务器的后端程序(PHP/ASP/JSP)运行,把数据库的数据拼接进 HTML 模板里。
- 返回一个完整的 HTML 给浏览器。
- 浏览器整个页面刷新,用户才能看到“动态”变化。
👉 所以那时候所谓的“动态页面”,其实是 服务器动态生成的 HTML,而不是浏览器端“即时刷新”的效果。
当时的“动态页面”指的是什么?
“动态”相对于“静态 HTML 文件”来说的。
-
静态页面:
- 直接写死在
.html文件里,所有人访问都一样,没变化。 - 例:
about.html、contact.html。
- 直接写死在
-
动态页面:
-
页面内容不是写死的,而是后端程序根据情况“实时生成”。
-
例:
- 访问
profile.php?id=123→ 后端查询数据库 → 生成用户123的页面。 - 访问
search.jsp?keyword=book→ 后端查数据库 → 把结果写进 HTML 表格里 → 发给浏览器。
- 访问
-
👉 本质上,“动态”= 每次请求,服务器重新算、重新拼 HTML。
为什么当时 JS 没法直接动态刷新?
有两个原因:
-
浏览器限制(安全 & 技术未成熟):
- 1990s 末,JS 的主要用途是 小脚本(校验表单、防止重复提交、弹窗提示)。
- 浏览器根本没给 JS 提供“直接请求服务器数据”的能力。
- 直到 1999 年,IE5 才引入
XMLHttpRequest对象(也就是 AJAX 的前身)。
-
没有 DOM 操作能力(非常弱):
- 早期 JS 甚至对 HTML 元素的修改能力有限(比如不能灵活地插入/删除元素)。
- 页面要改数据,只能靠刷新整张页面,浏览器重新渲染。
👉 所以当时即使想“刷新局部内容”,也做不到,只能:
- 整页刷新(由后端重新生成 HTML)。
- 或者用一些“伪动态”手段,比如
<iframe>嵌套小页面(类似局部刷新,但笨重)。
一次动态页面刷新的完整过程
背景
时间点:大约 1995–2004(PHP/ASP/JSP 兴盛期)
浏览器:IE 4/5/6、Netscape 4/6
特点:
- 前端很弱,只能写 HTML + CSS(非常有限)+ 一点点 JavaScript(表单验证、弹窗)。
- 动态内容主要靠 服务器端模板 技术。
举个例子:你访问一个“新闻网站”,想查看新闻列表,并点击“下一页”。
1. 用户操作
- 用户在浏览器中点击「下一页」按钮(其实就是一个
<a href="news.php?page=2">下一页</a>链接)。 - 浏览器马上发起一个 HTTP 请求,地址带上
?page=2这个参数。
2. 浏览器请求 → 服务器
- 浏览器把请求发到服务器,比如:
GET /news.php?page=2 HTTP/1.1
Host: www.example.com
-
服务器(Apache/IIS/Tomcat)接收到请求后,会把它交给对应的程序语言处理:
- PHP(配合 Apache)
- ASP(配合 IIS)
- JSP/Servlet(配合 Tomcat)
3. 服务器端生成 HTML
- 程序会读取数据库,比如
SELECT * FROM news LIMIT 10 OFFSET 10。 - 把结果嵌入到模板里,比如:
<html>
<body>
<h1>新闻列表</h1>
<ul>
<?php foreach($news as $item): ?>
<li><?php echo $item['title']; ?></li>
<?php endforeach; ?>
</ul>
<a href="news.php?page=1">上一页</a>
<a href="news.php?page=3">下一页</a>
</body>
</html>
- 最终生成一份完整的 HTML 文本。
4. 服务器返回 HTML
- 服务器把生成好的 HTML 文件返回给浏览器:
HTTP/1.1 200 OK
Content-Type: text/html
<html> ... 新的新闻列表 ... </html>
5. 浏览器渲染
- 浏览器清空原本的页面(白屏),重新加载新的 HTML。
- 重新下载里头的 CSS、JS、图片资源(如果没缓存)。
- 重新渲染出新的新闻列表。
总结
-
整页刷新 = 浏览器重新请求 + 服务器重新生成 + 浏览器重新渲染。
-
页面里每一个动态变化(分页、登录、发帖、搜索…)都要走这个完整流程。
-
当时根本没有“前后端分离”的概念,HTML、逻辑、数据库访问全都写在一起:
- PHP 里
echo "<div>$title</div>" - JSP 里
<% out.println(newsTitle); %> - ASP 里
<%= newsTitle %>
- PHP 里
和今天对比
- 当年:点一下 = 整页重新来过
- 今天:点一下 = 前端 JS 通过 AJAX/Fetch 请求 JSON 数据,直接局部更新 DOM,不会白屏
所以我们现在很难想象当时的“笨重”,但在 2000 年初这已经是革命性体验了,因为相比 FTP/Gopher 时代,这种「数据库 + 动态模板 + 浏览器」模式已经能做 BBS、博客、新闻站、网店了。
对上述过程的思考
1. 请求是谁发的?
👉 请求是由浏览器发送的。
- 用户点击网页上的链接(
<a href="...">),或提交表单(<form action="...">),或直接在地址栏输入 URL。 - 浏览器就会向目标服务器发起一个 HTTP 请求。
这时候,浏览器相当于客户端(Client),而网站的程序(比如 PHP/ASP/JSP)运行在服务器(Server)上,走的是 典型的 C/S 架构。
2. 浏览器靠什么发送请求?
浏览器使用 HTTP 协议(超文本传输协议),基于 TCP/IP 传输。
整个过程:
- 浏览器先通过 DNS 查询 把域名(如
www.example.com)解析成 IP 地址。 - 通过 TCP 三次握手连接服务器的 80 端口(当时主要是 HTTP,还没普及 HTTPS 443)。
- 浏览器打包好一个 HTTP 请求报文(比如 GET 请求),发给服务器。
示例(用户点击了一个链接):
GET /profile?id=123 HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
3. 服务器通过什么方式响应?
服务器上跑着 Web Server 软件(比如 Apache、IIS、Nginx)。
-
如果请求的是 静态文件(如
index.html、style.css、image.png),Web Server 直接从磁盘读取文件,打包成 HTTP 响应返回。 -
如果请求的是 动态页面(如
.php、.asp、.jsp),Web Server 会把请求交给后端解释器处理:- Apache + PHP → PHP 解析器读取数据库,生成 HTML
- IIS + ASP → ASP 脚本生成 HTML
- Tomcat + JSP → Java Servlet 生成 HTML
最后,服务器返回一个完整的 HTTP 响应报文:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 4521
<html>
<head><title>User Profile</title></head>
<body>
<h1>欢迎你,张三!</h1>
<p>这是你的资料页面</p>
...
</body>
</html>
4. 响应的对象是谁?
👉 响应的对象就是浏览器。
浏览器收到 HTTP 响应后,开始按 HTML 规则解析,并渲染到屏幕上。
- 浏览器先读到
<html>...</html>结构,构建 DOM 树。 - 如果发现
<link>、<script>、<img>等资源,会再次发起新的 HTTP 请求。 - 最后生成完整的页面显示。
5. 页面是如何刷新的?
在这个过程中,每次用户点击一个链接/提交表单:
- 浏览器丢掉旧页面。
- 向服务器重新发 HTTP 请求。
- 服务器返回一个新的 HTML 页面。
- 浏览器重新渲染整个页面。
所以,这种机制下:
- 每次交互都是整页刷新。
- 页面之间的状态(比如滚动位置、输入框内容)会丢失,除非后端写逻辑保存。
- 用户体验相比现代的 “局部刷新 / SPA” 很笨重。
让我们总结一下:
当时的“动态”就是 浏览器发 HTTP 请求 → 服务器动态生成 HTML → 整页返回 → 浏览器重新渲染。
JavaScript 只能在页面加载后搞点小动作,不能请求新数据。直到 2005 年 AJAX 出现,才真正有了“无刷新更新内容”的能力。
我们了解当时动态的含义,那么深入一些:既然前后端并未分离,是一体化的,那么浏览器访问的地址是整个项目(包含页面代码和服务代码)的地址,这种情况下,服务代码咋返回给浏览器数据?返回的内容具体是什么?如何实现返回数据?
2000 年前后前后端一体化网页是怎么生成和返回内容
前后端一体化的本质
当时的开发模式可以总结为:
-
前端:HTML + CSS + JavaScript(很弱)
-
后端:PHP / ASP / JSP(处理业务逻辑和数据库)
-
一体化:
- 一个 URL 对应一个后端程序文件(比如
profile.php), - 同一个文件里 同时包含 HTML 结构和服务逻辑,甚至数据库操作。
- 一个 URL 对应一个后端程序文件(比如
所以浏览器访问的 URL 并不是“前端文件夹的静态页面”,而是直接访问一个 服务端程序入口。
浏览器访问的地址
例如:
http://www.example.com/profile.php?id=123
- 浏览器看到的是一个 URL,发起 HTTP 请求。
- 服务器根据 URL 找到 profile.php 脚本并执行。
这个文件里可能有:
- 服务逻辑:取数据、判断权限、处理业务
- 模板 HTML:展示页面的结构
- 混合输出:用 echo / print /
<%= ... %>输出 HTML
服务代码如何返回数据
1. PHP 举例
<?php
// profile.php
// 1️⃣ 取数据
$userId = $_GET['id'];
$user = getUserFromDB($userId); // 数据库查询
// 2️⃣ 输出 HTML + 数据
?>
<html>
<head><title>用户资料</title></head>
<body>
<h1>欢迎 <?php echo $user['name']; ?>!</h1>
<p>邮箱:<?php echo $user['email']; ?></p>
</body>
</html>
-
浏览器访问
profile.php?id=123 -
PHP 执行:
- 先从数据库拿到数据
- 拼接到 HTML 里
- 把完整 HTML 输出到 HTTP 响应体
2. ASP / JSP 也是类似
- ASP:
<%
Dim user
Set user = GetUser(Request.QueryString("id"))
%>
<h1>欢迎 <%= user.Name %>!</h1>
- JSP:
<%
User user = UserDao.getUser(request.getParameter("id"));
%>
<h1>欢迎 <%= user.getName() %>!</h1>
特点:
- HTML 模板和服务逻辑混在一起
- 服务器执行后输出 纯 HTML 给浏览器
返回给浏览器的内容是什么?
- 浏览器收到的 HTTP 响应体 是完整 HTML 文本,例如:
<html>
<head><title>用户资料</title></head>
<body>
<h1>欢迎 张三!</h1>
<p>邮箱:zhangsan@example.com</p>
</body>
</html>
- 浏览器 完全不知道数据来源(数据库 / 文件 / API),它只看到 HTML
- 页面渲染就是直接把 HTML 显示出来
总结机制
| 步骤 | 角色/操作 | 输出 |
|---|---|---|
| 用户访问 URL | 浏览器发 HTTP 请求 | 请求报文 |
| 服务器执行脚本 | PHP/ASP/JSP 读取数据库 → 拼 HTML | HTML 文本(HTTP 响应体) |
| 浏览器接收 | 渲染 HTML → 显示页面 | 页面呈现 |
特点:
- 前后端一体化:HTML + 业务逻辑在同一文件
- 浏览器永远只接收 HTML,不直接接触数据库
- 整页刷新:每次操作都走这个完整流程
总结
- 2000 年前后,没有真正的前后端分离,网页是“后端一把梭”:后端生成 HTML → 浏览器整页刷新显示。
- 动态页面 = 后端动态拼装 HTML,比如 PHP 从数据库取数据,再生成页面。
- JavaScript 当时不具备动态刷新能力,因为浏览器没提供 API(AJAX 还没普及),DOM 操作也很弱。
- 真正的“前端动态刷新”(局部更新页面)要等到 AJAX 出现(2005 年 Gmail/Google Maps 爆火) 才成为可能。
服务器在前端发展史上的产生原因和作用
静态页面时代(1990s)有没有服务器?
1. HTML 出现初期(1990–1992)
- HTML 是文本文件,最初是为了在 全球科研机构内部共享文档。
- 当时实验室里的人可以把
.html文件 直接拷贝到别人电脑上,用浏览器打开。 - 没有真正意义上的“服务器”,也没网络服务概念。
2. 浏览器出现以后(1993–1995)
- 浏览器需要通过 网络访问 HTML 文件。
- 此时出现了 HTTP 协议,客户端(浏览器)可以向远端计算机请求文件。
- 这时候服务器才开始出现:
-
- 用来 统一管理、提供 HTML 文件,别人可以通过网络访问。
- 典型的早期服务器软件:CERN httpd(Tim Berners-Lee 发明),NCSA HTTPd。
✅ 所以,严格来说,服务器是在网络访问和共享文档的需求下产生的,而不是 HTML 本身必需的。
服务器为什么会产生?为了解决什么问题?
1. 问题背景
- 实验室或科研人员手里有很多 HTML 文档。
- 如果每次都靠拷贝文件、发邮件或者磁盘共享给别人,效率低、版本混乱。
- 需要一种机制:别人能直接用浏览器访问最新的文档。
2. 服务器的作用
-
统一提供文件
- 浏览器请求 URL → 服务器返回对应 HTML 文件。
-
集中管理
- 所有文档集中存放,更新后所有用户访问到的都是最新版本。
-
网络传输协议支持
- 提供 HTTP 协议接口,让浏览器能请求文件。
-
可扩展(动态页面时代)
- 后来加入后端脚本处理能力(PHP/ASP/JSP) → 服务器不仅提供文件,还能生成动态内容。
静态页面时代 vs 动态页面时代的服务器角色对比
| 时代 | 服务器作用 | 内容来源 | 用户体验 |
|---|---|---|---|
| 静态页面 | 提供 HTML/CSS/图片文件 | 磁盘上的固定文件 | 每次访问都一样,没有交互 |
| 动态页面 | 处理业务逻辑、访问数据库、生成 HTML | 数据库 + 模板文件 | 页面可以根据用户、时间、数据变化 |
小结
- 服务器不是 HTML 的必需品,但 HTML 和网络共享需求催生了服务器。
- 最早的服务器只是文件提供者,类似一个“中央文档柜”。
- 后来服务器增加了处理逻辑能力,才变成“动态内容生成器”,支撑了动态交互时代。
关于Ajax
Ajax 出现的历史背景
- 问题:在 Web1.0 时代,每次要更新一点数据(比如提交一个表单、加载一条评论),浏览器都要向服务器发请求,服务器返回整个新的 HTML 页面,浏览器再整页刷新。体验卡顿且效率低。
- 思考:有没有办法只拿数据,不要整个页面?
- 突破:微软在 IE5 里引入了一个隐藏对象 XMLHttpRequest(XHR) ,允许 JS 在后台发送 HTTP 请求。
- 结果:这就像给浏览器开了一个“后台通道”,不用刷新页面也能拿到数据,再由 JS 把数据塞进页面 → Ajax(Asynchronous JavaScript and XML)诞生。
Ajax 是什么?
Ajax(Asynchronous JavaScript and XML) ,直译是 “异步 JavaScript 和 XML”。
- “异步”:不阻塞浏览器,可以边请求数据边让用户操作页面。
- “JavaScript”:JS 脚本负责发起请求、接收数据、更新页面。
- “XML”:最初常用 XML 作为数据格式(后来逐渐被 JSON 替代)。
⚠️ Ajax 并不是一个新的语言或框架,而是对已有技术的组合:
- JavaScript(写逻辑)。
- XMLHttpRequest (XHR) 对象(核心,发起异步请求)。
- DOM 操作(把请求结果更新到页面)。
Ajax 带来的“异步刷新”
Ajax 出现之前(整页刷新)
场景:2000~2005 年,Ajax 还未普及
- 请求方式
浏览器只能通过<a>跳转、<form>提交 或者window.location修改地址栏来发起 HTTP 请求。 - 刷新效果
每次请求,服务器返回一个完整的 HTML 页面。浏览器会丢弃旧页面,重新解析并渲染整个新页面。
👉 这意味着:
-
- 页面内容完全重新加载
- CSS、JS、图片等资源可能会被缓存,但页面结构还是整体刷新
- 用户体验上:页面会“白屏闪烁”一下
- 开发模式
后端一体化渲染(如 JSP、ASP、PHP),动态内容由后端插入 HTML,再整体返回给浏览器。
Ajax 出现之后(局部刷新)
场景:2005 年后,XHR 对象被应用到网页开发
-
请求方式
JavaScript 代码可以通过XMLHttpRequest(XHR)对象,主动向服务器发起 HTTP 请求,而 无需刷新整个页面。 -
刷新效果
- 请求返回的数据通常是 JSON / XML / 纯文本
- 浏览器不会替换掉整个页面,而是通过 JavaScript 读取数据,再用 DOM 操作修改页面的某个局部区域
👉 结果就是: - 页面不会整体闪烁
- 局部区域内容更新,用户感觉页面是“活的”
- 体验类似桌面应用(如 Gmail、地图等)
-
开发模式
前端逐渐开始承担“数据展示 + 动态交互”的责任。
后端更多是提供接口,返回 JSON 数据。
—— 这也直接推动了 前后端分离 的发展。
Ajax 的基本原理(核心流程)
可以理解为:浏览器的 JS 代码,直接扮演了“小客户端”,和服务器交互,而不是把请求交给整个浏览器页面去处理。
工作步骤:
- 创建请求对象
JS 通过XMLHttpRequest(XHR)对象,准备和服务器通信。
var xhr = new XMLHttpRequest();
- 配置请求
指定请求方式和 URL,例如:
xhr.open("GET", "/getComments", true); // true 表示异步
- 监听状态变化
浏览器和服务器通信是分阶段的,XHR 提供onreadystatechange回调来监听过程。
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText); // 服务器返回的数据
}
};
- 发送请求
xhr.send(null); // GET 请求不用 body
-
处理响应
- 服务器返回的可能是 XML/JSON/纯文本。
- JS 拿到数据后,用 DOM API 把结果插到页面里,比如插入一个
<li>评论。
Ajax 出现前后的关键对比
| 特点 | Ajax 前(整页刷新) | Ajax 后(局部刷新) |
|---|---|---|
| 请求入口 | <a> / <form> / 改 URL | JS 代码(XMLHttpRequest) |
| 返回内容 | 整个 HTML 页面 | 局部数据(JSON/XML) |
| 页面刷新 | 整体刷新(白屏重绘) | 局部更新(无白屏) |
| 用户体验 | 频繁跳转、卡顿感强 | 流畅、像桌面应用 |
| 前后端关系 | 后端主导(拼 HTML) | 前端主导(渲染 DOM) |
| 核心差异 | 浏览器 只能整体替换页面 | 浏览器 允许局部修改 DOM |
👉 根本原因:
Ajax 的核心突破在于 让 JavaScript 拥有了直接与服务器对话的能力,而不必依赖浏览器的整页加载机制。
以前是“浏览器决定刷新页面”,现在变成“前端开发者可以决定刷新哪一部分”。
案例列举
案例一:翻页变化
Ajax 前
用户点击“下一页”:
- 浏览器发请求
/list?page=2 - 服务器返回整个新的 HTML
- 浏览器丢弃旧的,重绘新页面
Ajax 后
用户点击“下一页”:
- JS 调用
xhr.open("GET", "/list?page=2") - 服务器返回 JSON:
{ items: [...] } - JS 把新数据插入到页面的某个
<div> - 页面主体保持不动,只是列表区域换了
案例二:Google Maps (2005)
以前地图要切换区域 → 必须整页刷新。
Ajax 出现后:
- 用户拖动地图时,JS 在后台请求新的地图切片。
- 收到数据后,JS 把小块图片拼接到已有页面上。
- 体验非常顺滑 → Web 应用从“文档”时代进入“应用”时代。
核心机制总结
- 本质:Ajax 并不是新协议,而是 JS 调用浏览器内置的 HTTP 请求能力(XHR) 来和服务器通信。
- 异步的意义:浏览器不会因为等待服务器而卡死,用户还能继续操作。
- 数据驱动视图:服务端返回数据(JSON),前端决定怎么渲染页面。
- 局部刷新:不再依赖整页 HTML,打破了 Web1.0 的限制。
Ajax 带来的影响
- 前端开发地位提升:JS 不再只是“花瓶”,而是页面交互的核心。
- 产生了 Web 2.0 的说法(网页变得像应用)。
- 催生了前端框架(jQuery 最初就是为简化 Ajax 和 DOM 操作)。
- 服务端也开始提供更灵活的数据接口(JSON API 出现)。
总结一下:
Ajax 的核心就是:让浏览器的 JS 能直接和服务器通信,获取数据后动态修改页面,而不必整页刷新。
额外延伸
后来 Ajax 的原理继续演变:
- jQuery 的封装:用
$.ajax()简化 XHR 繁琐的写法。 - JSON 取代 XML:更轻量、更适合 JS。
- Fetch API(HTML5 标准化,替代 XHR)。
- Promise / async/await:解决异步回调地狱。
- WebSocket:进一步突破,只要连接建立,服务器可以主动推送数据(实时通信)。
Web1.0->Web2.0
为什么会出现 “Web2.0” 的说法?
- Web1.0 的特点(1990s ~ 2004)
- 以静态内容为主:页面主要是纯 HTML,内容少量更新靠人工改页面。
- 浏览器交互简单:只能“看”和“点”,几乎没有“写”和“参与”。
- 单向传播:用户被动接受信息(门户网站、个人主页),生产者和消费者分离。
- 技术特征:静态网页 + 动态 CGI/PHP/JSP 生成整页刷新。
- Web2.0 的提出(2004~2005)
2004 年 O’Reilly 公司组织了一场会议,发现当时互联网形态有了很大变化,于是提出了“Web 2.0”的概念,用来区别过去的“Web 1.0”。
核心原因:
- Ajax 出现 → 页面可局部刷新,提升了体验。
- 博客、Wiki、SNS(社交网站)兴起 → 用户能贡献内容。
- 标签(Tag)、RSS、社交分享 → 信息组织更灵活。
- 数据驱动的应用 → Google Maps、Flickr、Facebook 等,用户不仅浏览,还能操作和创造。
一句话:
Web1.0 是“只读的互联网”,Web2.0 是“读写互动的互联网”。
Ajax 带来的质变
在 Web1.0 时代:
- 页面刷新 = 整个 HTML 重新请求。
- 用户体验比较“卡”,和桌面应用差距大。
在 Web2.0 时代(Ajax 之后):
- 页面可以 局部更新,只请求 JSON/XML 数据,不需要整页刷新。
- 体验接近桌面软件(流畅、实时)。
- 用户能参与:评论、发帖、分享、协作 → 形成 UGC(用户生产内容)。
根本原因:
- 浏览器增加了 XMLHTTPRequest 对象,让 JS 可以直接与服务器通信。
- 数据与视图分离:返回的数据可以不是 HTML,而是 JSON → 前端自己决定怎么渲染。
作为前端工程师,需要了解哪些?
-
技术角度
- Ajax 的工作原理(XHR、JSON、局部刷新)。
- Web2.0 带来的前端工程化转型:前端不只是页面样式,还要处理数据和交互逻辑。
- 从 Web2.0 开始,前端工程师不再是“切图仔”,而是 负责交互体验与数据对接的工程角色。
-
产品与用户角度
- Web2.0 代表了“用户参与感”的增强:用户可以评论、贡献、分享。
- 前端的任务是承载和优化这些交互,保证体验自然流畅。
-
历史意义
- Web2.0 是现代前端框架(Vue/React/Angular)出现的土壤。
- 它奠定了“前后端分离”的思路:前端负责交互渲染,后端负责提供数据 API。
总结一下:
Web2.0 出现的原因: 技术升级(Ajax)、产品形态升级(UGC、SNS)、用户角色升级(被动 → 主动)。
前端工程师需要理解:
- Ajax 带来的“数据和视图分离”的思想;
- Web2.0 是前端从“页面制作者”到“应用开发者”的分水岭;
- 它为 SPA(单页应用)、前后端分离奠定了基础。