HTML Server-Sent Events (SSE)
上一课 Web Workers 在后台线程运行 JavaScript,并用 postMessage 与页面通信——本地 CPU,无服务器流。本课离开离线计算,介绍 SSE:服务器通过 HTTP 推送文本更新。范围务实——打开、监听、单向推送——不是 Node 流服务器课。
为何在 HTML 课学 SSE
初学者需要实时分数或日志,又不想自造套接字协议。SSE 是通过 HTTP 推送文本的常见第一套 API。在 Workers 之后,分工不同:服务器拥有流;页面脚本拥有 EventSource 与 DOM。
直接回答
1) new EventSource("/events")。2) onmessage 并读 e.data。3) 在页面更新 DOM。4) onerror。5) 单向。6) 全双工用 WebSockets;稀少用 polling;本地 CPU 用 Workers。
📊 SSE vs WebSocket vs Worker
| Topic | SSE (this lesson) | WebSocket | Web Worker (prev) |
|---|---|---|---|
| Typical role | Server→browser text stream | Full duplex messages | Local off-thread compute |
| Browser entry | EventSource(url) | new WebSocket(url) | new Worker(url or Blob) |
| Direction | One-way (server push) | Two-way | Page ↔ worker (no server required) |
| Transport idea | HTTP text/event-stream | WS protocol | postMessage / onmessage |
| DOM updates | On the page script | On the page script | On the page script only |
| This course depth | Required (browser pattern) | Contrast only | Previous lesson |
| Not this lesson | Full backend stream servers | Chat product design | SharedWorker fleets |
微型 EventSource 监听模式
仅浏览器侧。/events 必须是真实 SSE 端点;无服务器会报错——仍能教会 API 形态。
<pre id="out">Waiting for stream…</pre>
<script>
const out = document.getElementById("out");
const es = new EventSource("/events");
es.onmessage = function (e) {
out.textContent = "Last update: " + e.data;
};
es.onerror = function () {
out.textContent = "SSE error or closed (need a real /events stream)";
};
</script>
阅读监听调用
- EventSource 打开长生命周期 HTTP 流
- message 时 onmessage
- e.data 是文本载荷
- 页面写入 pre
- 与 Workers 不同:不向后台线程 postMessage
- 无服务器时 onerror 属预期
- 保持入门精简
将流行追加到日志
实时 UI 常追加每个事件。本演示在列表中保留最近几行。
<ul id="log"></ul>
<script>
const log = document.getElementById("log");
const es = new EventSource("/events");
es.onmessage = function (e) {
const li = document.createElement("li");
li.textContent = e.data;
log.appendChild(li);
while (log.children.length > 5) {
log.removeChild(log.firstChild);
}
};
es.onerror = function () {
if (!log.dataset.noted) {
log.dataset.noted = "1";
const li = document.createElement("li");
li.textContent = "Stream not available — wire a text/event-stream URL";
log.appendChild(li);
}
};
</script>
阅读日志思路
- 每次 onmessage 创建 li
- 限制列表长度
- 仍是单向
- 不是 Web Worker
- 存在命名事件;默认 message 足够
- 结束后 es.close()
- 下一课:XHTML
选择 SSE、轮询、套接字或 worker
- 经 HTTP 频繁推送状态:适合入门 SSE
- 很少刷新:轮询可能够用
- 双向聊天:考虑 WebSockets
- 沉重本地循环:那是 Workers
- 拖动卡片:那是 DnD
- 构建后端流端点:超出本入门
练习 — 打开、监听、对比
- 阅读监听片段。
- 浏览 text/event-stream。
- 阅读追加日志。
- 一句话:Workers 本地;SSE 来自服务器。
- 一句话:SSE 单向;WebSockets 全双工。
- (可选)真实 URL。
- 预告:XHTML。
易错点
- 期望经 EventSource 浏览器→服务器
- 与 Web Workers 混淆
- 忘记 event-stream 内容类型
- 对极少更新用 SSE
- 忽略 onerror
- 把入门当成完整后端流课
- 混淆 EventSource 与 Worker/WebSocket
小结
- SSE 经 HTTP 流式传输服务器→浏览器文本
- EventSource、onmessage/onerror;在页面画 DOM
- 单向推送;全双工用 WebSockets
- Workers 是本地离线计算;本课是服务器推送
- 真实演示需要 text/event-stream
- 下一课:XHTML
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部