惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
C
Cybersecurity and Infrastructure Security Agency CISA
美团技术团队
J
Java Code Geeks
博客园 - 聂微东
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 叶小钗
雷峰网
雷峰网
爱范儿
爱范儿
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
Google DeepMind News
Google DeepMind News
The Cloudflare Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
IT之家
IT之家
Last Week in AI
Last Week in AI
Recent Announcements
Recent Announcements
The Register - Security
The Register - Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
The Exploit Database - CXSecurity.com
I
Intezer
V
Vulnerabilities – Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
NISL@THU
NISL@THU
S
Security @ Cisco Blogs
T
Tenable Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Project Zero
Project Zero
H
Hacker News: Front Page
SecWiki News
SecWiki News
L
LINUX DO - 最新话题
Hacker News: Ask HN
Hacker News: Ask HN
Forbes - Security
Forbes - Security
C
CERT Recently Published Vulnerability Notes
T
Threatpost
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
V2EX - 技术
V2EX - 技术

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 我对CSS vertical-align的一些理解与认识(一) « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活 翻译 – CSS Sprites:实用技术还是生厌之物? « 张鑫旭-鑫空间-鑫生活 纯CSS实现易拉罐3D滚动效果 « 张鑫旭-鑫空间-鑫生活 纯CSS实现侧边栏/分栏高度自动相等 « 张鑫旭-鑫空间-鑫生活 CSS+JavaScript实现页面不同布局的切换 « 张鑫旭-鑫空间-鑫生活 JavaScript实现最简单的拖拽效果 « 张鑫旭-鑫空间-鑫生活 自己写的无图片版jQuery zxxbox弹出框插件 « 张鑫旭-鑫空间-鑫生活 中国古代道家思想与网页重构的思考 « 张鑫旭-鑫空间-鑫生活 让所有浏览器支持HTML5 video视频标签 « 张鑫旭-鑫空间-鑫生活 纯CSS实现各类气球泡泡对话框效果 « 张鑫旭-鑫空间-鑫生活 JS HEX十六进制与RGB, HSL颜色的相互转换 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变、高光等文字效果 « 张鑫旭-鑫空间-鑫生活 去除冗余 – 精简您的CSS样式代码 « 张鑫旭-鑫空间-鑫生活 对overflow与zoom”清除浮动”的一些认识 « 张鑫旭-鑫空间-鑫生活 jQuery Pagination Ajax分页插件中文详解 « 张鑫旭-鑫空间-鑫生活 absolute绝对定位的非绝对定位用法 « 张鑫旭-鑫空间-鑫生活 网页布局思想浅议-淘宝新版首页为实例 « 张鑫旭-鑫空间-鑫生活 回流与重绘:CSS性能让JavaScript变慢? « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(二) « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(一) « 张鑫旭-鑫空间-鑫生活 60个极富创造性的震撼的电影海报设计 « 张鑫旭-鑫空间-鑫生活 jQuery Lightbox(balupton版)图片展示插件讲解 « 张鑫旭-鑫空间-鑫生活 博客内嵌flash音乐播放器代码、下载与使用 « 张鑫旭-鑫空间-鑫生活 CSS3 animate实现图片墙3D翻转效果 « 张鑫旭-鑫空间-鑫生活 图片旋转效果的一些研究、jQuery插件及实例 « 张鑫旭-鑫空间-鑫生活 CSS3 border-image详解、应用及jQuery插件 « 张鑫旭-鑫空间-鑫生活 jQuery-两款不同原理的圆角插件讲解 « 张鑫旭-鑫空间-鑫生活 页面可用性之outline轮廓外框的一些研究 « 张鑫旭-鑫空间-鑫生活 CSS3 transition实现超酷图片墙动画效果 « 张鑫旭-鑫空间-鑫生活 HTML CSS列表元素ul,ol,dl的研究与应用 « 张鑫旭-鑫空间-鑫生活 jQuery图片文本滚动切换插件jCarousel中文翻译与详解 « 张鑫旭-鑫空间-鑫生活 酷酷的jQuery鼠标悬停图片放大切换显示效果 « 张鑫旭-鑫空间-鑫生活 IE6下z-index犯癫不起作用bug的初步研究 « 张鑫旭-鑫空间-鑫生活 checkbox复选框的一些深入研究与理解 « 张鑫旭-鑫空间-鑫生活 jQuery之使用slideToggle实现垂直下拉菜单 « 张鑫旭-鑫空间-鑫生活 jQuery-innerfade内部列表自动淡入淡出插件 « 张鑫旭-鑫空间-鑫生活 jQuery-火焰灯效果导航菜单 « 张鑫旭-鑫空间-鑫生活 IE下css bug集合-翻译自haslayout.net « 张鑫旭-鑫空间-鑫生活 翻译-IE7/8@font-face嵌入字体与文字平滑 « 张鑫旭-鑫空间-鑫生活 jQuery-马化腾产品设计与用户体验的一些技术实现 « 张鑫旭-鑫空间-鑫生活 像素的世界及其在web开发制作中的应用 « 张鑫旭-鑫空间-鑫生活 css行高line-height的一些深入理解及应用 « 张鑫旭-鑫空间-鑫生活 CSS实现圆角六色渐变自适应按钮详解 « 张鑫旭-鑫空间-鑫生活 我熟知的三种三栏网页宽度自适应布局方法 « 张鑫旭-鑫空间-鑫生活 jQuery照片图像剪裁插件Jcrop中文翻译详解 « 张鑫旭-鑫空间-鑫生活 Ajax Upload多文件上传插件翻译及中文演示 « 张鑫旭-鑫空间-鑫生活 告别图片—使用字符实现兼容性的圆角尖角效果beta版 « 张鑫旭-鑫空间-鑫生活 大小不固定的图片、多行文字的水平垂直居中 « 张鑫旭-鑫空间-鑫生活 jQuery boxy弹出层对话框插件中文演示及讲解 « 张鑫旭-鑫空间-鑫生活 JavaScript实现新浪微博文字放大显示动画效果 « 张鑫旭-鑫空间-鑫生活 翻译:让网络更快一些——最小化浏览器中的回流(reflow) « 张鑫旭-鑫空间-鑫生活 jQuery之addClasas与removeClass使用实例 « 张鑫旭-鑫空间-鑫生活 关于Google圆角高光高宽自适应按钮及其拓展 « 张鑫旭-鑫空间-鑫生活 JavaScript实现图片幻灯片滚动播放动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery-鼠标经过显示大图并跟随鼠标效果插件 « 张鑫旭-鑫空间-鑫生活 关于gif图片(或png8)杂边锯齿的问题 « 张鑫旭-鑫空间-鑫生活 对html与body的一些研究与理解 « 张鑫旭-鑫空间-鑫生活 鲜为人知的一个解决兼容性问题的利器——小数 « 张鑫旭-鑫空间-鑫生活 搜狐白社会似iphone短信对话框效果的优化 « 张鑫旭-鑫空间-鑫生活 关于文字内容溢出用点点点(…)省略号表示 « 张鑫旭-鑫空间-鑫生活 jquery之append与insertBefore使用实例 « 张鑫旭-鑫空间-鑫生活 jQuery之图片关联伸缩效果 « 张鑫旭-鑫空间-鑫生活 jquery之图片左右切换动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery之replace字符串替换实现不同尺寸图片切换 « 张鑫旭-鑫空间-鑫生活 jQuery-实现图片的放大镜显示效果 « 张鑫旭-鑫空间-鑫生活 jQuery-单击文字或图片内容放大显示效果插件 « 张鑫旭-鑫空间-鑫生活 reflection.js-实现图片投影倒影效果js插件 « 张鑫旭-鑫空间-鑫生活 jQuery-很酷的弹出层效果js插件 « 张鑫旭-鑫空间-鑫生活 复选框单选框与文字对齐问题的研究与解决 « 张鑫旭-鑫空间-鑫生活 css margin的相关属性,问题及应用 « 张鑫旭-鑫空间-鑫生活 IE6下png背景不透明问题的综合拓展 « 张鑫旭-鑫空间-鑫生活
浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活
2026-03-17 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=12112
本文可全文转载,但需要保留原作者、出处以及文中链接,AI抓取保留原文地址,任何网站均可摘要聚合,商用请联系授权。

一、比 WebSocket 更懂低延迟的开发新利器

时间如斯,一转眼,做前端开发已经十五六年了,刚开始那会儿,实时通信还是使用轮询、长轮询,后来就是 WebSocket,然后现在又出来了个WebTransport。

WebSocket虽然可以解决大部分的问题,但是并不完美,例如队头阻塞、只能单一流传输、网络切换就断连,尤其是做实时游戏、直播推流这类对延迟要求极高的场景,总觉得差点意思。

所以就有了 WebTransport API,特别使用用在高并发、低延迟的实时场景。

二、WebTransport和WebSocket的区别

WebTransport 是基于 HTTP/3 + QUIC 协议的新一代实时通信 API,主打一个“低延迟、高吞吐、高灵活”,专门解决 WebSocket 搞不定的那些场景。

我做了个简单的对比表,大家一看就明白:

对比维度 WebSocket WebTransport
协议基础 基于 HTTP/1.1 Upgrade,底层是 TCP 基于 HTTP/3,底层是 QUIC(基于 UDP)
连接建立 TCP 三次握手,延迟较高 QUIC 0-RTT/1-RTT 快速握手,最快100ms内建立
传输模式 单一可靠流,只能双向传输 可靠流 + 不可靠数据报,支持单向/双向、多路复用
队头阻塞 存在,一个包丢失,后续所有包都要等重传 无,单个流阻塞不影响其他流
网络切换 断开连接,需重新握手 支持连接迁移,Wi-Fi 切4G也不中断
适用场景 普通实时聊天、简单消息推送 实时游戏、直播推流、实时协作、高频数据传输

这里需要补充一点:

不是说 WebSocket 不好用了,而是场景不同,选择不同。

如果你的项目只是简单的聊天功能,WebSocket 足够用,没必要强行上 WebTransport;

但如果涉及到高频数据传输(比如游戏里的玩家位置更新)、低延迟要求(比如直播弹幕实时推送),WebTransport 就是最优解。

这就像我们做布局,简单布局用 Flex 就够,复杂布局才需要 Grid,因地制宜最重要。

三、核心知识点:WebTransport 的3个关键特性

WebTransport 的核心优势,都源于它的底层协议,但我们前端不用去深究 QUIC 协议的细节,只要掌握它的3个核心特性,就能应对大部分开发场景。

1. 双重传输模式:可靠流 + 不可靠数据报

这是 WebTransport 最核心的亮点,也是和 WebSocket 最大的区别——它支持两种传输方式,可根据需求灵活选择:

  • 可靠流(Stream):和 WebSocket 类似,保证数据有序、不丢失、不重复,适合传输重要数据(比如聊天消息、协作工具的编辑操作);
  • 不可靠数据报(Datagram):不保证数据的有序性和到达率,但延迟极低,适合传输非关键数据(比如游戏玩家的实时位置、直播的视频帧)。

比方说一个实时多人小游戏,玩家的位置更新不需要100%到达(偶尔丢一个包不影响体验),但聊天消息必须可靠到达。

如果用 WebSocket,只能用一种传输方式,要么牺牲延迟,要么牺牲可靠性。

而用 WebTransport,就能给位置更新用不可靠数据报,聊天消息用可靠流,完美兼顾。

数据传输示意图如下:

WebTransport原理示意图

2. 多路复用:一个连接,多个流并行

WebSocket 是“单一流”传输,也就是说,一个 WebSocket 连接里,所有数据都在一条流里传输,一旦某个数据包丢失,后续所有数据都要等它重传,这就是“队头阻塞”。

而 WebTransport 支持多路复用,一个连接里可以同时创建多个独立的流,每个流互不影响。

比如你做一个直播平台,视频流、音频流、弹幕流可以用不同的流传输,就算视频流出现丢包重传,也不会影响弹幕的实时推送。

这一点,在高并发场景下,体验提升非常明显。

3. 连接迁移:网络切换不中断

这个特性可能很多同学没意识到它的重要性,但做移动端项目的同学一定懂:

用户用手机浏览网页时,经常会在 Wi-Fi 和 4G/5G 之间切换,这时候 WebSocket 连接会直接断开,需要重新握手建立连接,导致数据中断(比如直播卡顿、游戏掉线)。

WebTransport 基于 QUIC 协议,用“连接ID”来标识连接,而不是 IP 地址,所以就算网络切换,连接也能无缝迁移,数据不会中断。

四、WebTransport 核心 API 用法

下面给大家讲解 WebTransport 的核心用法,包括从连接建立,到两种传输模式的使用,每一步都有注释,供大家学习参考。

1. 第一步:建立 WebTransport 连接

建立连接很简单,用 WebTransport 构造函数,传入服务器地址,等待 ready 状态即可。这里要注意,服务器地址必须是 https 开头,并且要指定端口(比如 4433)。

// 建立 WebTransport 连接
async function createWebTransport() {
  // 服务器地址(必须是 HTTPS,端口可自定义)
  const url = 'https://example.com:4433/transport';
  
  try {
    // 创建 WebTransport 实例
    const transport = new WebTransport(url, {
      // 可选:证书指纹,用于验证服务器身份(防止中间人攻击)
      serverCertificateHashes: [
        {
          algorithm: 'sha-256',
          value: new Uint8Array([/* 服务器证书指纹 */])
        }
      ]
    });
    
    // 等待连接就绪(ready 是一个 Promise)
    await transport.ready;
    console.log('WebTransport 连接成功');
    
    // 监听连接关闭事件
    transport.closed.then(() => {
      console.log('WebTransport 连接关闭');
    }).catch((err) => {
      console.error('WebTransport 连接异常关闭:', err);
    });
    
    return transport;
  } catch (err) {
    console.error('WebTransport 连接失败:', err);
    throw err;
  }
}

2. 第二步:使用可靠流(Stream)传输数据

可靠流分为“双向流”和“单向流”,双向流是客户端和服务器可以互相发送数据,单向流是只能一方发送、另一方接收。实际开发中,双向流用得最多(比如聊天)。

// 双向可靠流示例(客户端 ↔ 服务器)
async function useBidirectionalStream(transport) {
  // 创建双向流
  const stream = await transport.createBidirectionalStream();
  
  // 发送流(客户端 → 服务器)
  const writable = stream.writable;
  const writer = writable.getWriter();
  // 发送文本数据(需要先编码为 Uint8Array)
  const encoder = new TextEncoder();
  await writer.write(encoder.encode('Hello WebTransport!'));
  // 发送完成后关闭写入流
  await writer.close();
  
  // 接收流(服务器 → 客户端)
  const readable = stream.readable;
  const reader = readable.getReader();
  const decoder = new TextDecoder();
  
  while (true) {
    const { value, done } = await reader.read();
    if (done) break; // 接收完成
    console.log('收到服务器消息:', decoder.decode(value));
  }
}

3. 第三步:使用不可靠数据报(Datagram)传输数据

不可靠数据报的用法更简单,不需要创建流,直接通过 datagrams 属性发送和接收数据,适合高频、非关键数据的传输。

// 不可靠数据报示例(适合高频数据)
async function useDatagram(transport) {
  // 发送数据报(客户端 → 服务器)
  const writer = transport.datagrams.writable.getWriter();
  const encoder = new TextEncoder();
  // 模拟高频发送(比如游戏玩家位置)
  setInterval(async () => {
    const position = { x: Math.random() * 100, y: Math.random() * 100 };
    await writer.write(encoder.encode(JSON.stringify(position)));
  }, 33); // 30 FPS,和游戏帧率同步
  
  // 接收数据报(服务器 → 客户端)
  const reader = transport.datagrams.readable.getReader();
  const decoder = new TextDecoder();
  
  while (true) {
    const { value, done } = await reader.read();
    if (done) break;
    const data = JSON.parse(decoder.decode(value));
    console.log('收到位置数据:', data);
  }
}

这里提醒大家一句:不可靠数据报不保证数据到达,所以不要用它传输重要数据(比如支付信息),否则会出现数据丢失的问题。

4. 完整实战代码(整合连接、流、数据报)

// 完整实战代码
async function webTransportDemo() {
  try {
    // 1. 建立连接
    const transport = await createWebTransport();
    
    // 2. 同时使用双向流和数据报
    useBidirectionalStream(transport);
    useDatagram(transport);
    
    // 3. 关闭连接(按需调用)
    // setTimeout(() => {
    //   transport.close();
    //   console.log('主动关闭连接');
    // }, 10000);
  } catch (err) {
    console.error('WebTransport 实战失败:', err);
  }
}

// 执行 demo
webTransportDemo();

五、总结:WebTransport 该用在什么场景?

最后,再给大家做个总结,帮大家理清 WebTransport 的适用场景,避免盲目使用。

如果你遇到以下场景,强烈建议用 WebTransport:

  • 实时游戏:需要低延迟、高频数据传输,允许少量数据丢失;
  • 直播推流/拉流:视频帧、音频帧用不可靠数据报,控制信令用可靠流;
  • 实时协作工具:多人同时编辑,需要低延迟、可靠的数据传输;
  • 移动端实时应用:需要支持网络切换不中断,提升用户体验。

如果只是简单的实时聊天、消息推送,WebSocket 已经足够用,没必要强行上 WebTransport——技术选型的核心是“合适”,而不是“最新”。

另外,WebTransport 必须在 HTTPS 环境下使用(本地开发可以用 localhost),目前主流浏览器(Chrome 97+、Firefox 114+、Safari 26.4+)都已支持,不过离在正式环境使用还需要一两年的缓冲时间,除非你的项目不需要管Safari浏览器。

WebTransport兼容性

前端技术更新很快,我们不用追求掌握所有新特性,但对于那些能解决实际痛点、提升开发效率的技术,多花点时间吃透,总能在项目中发挥作用。

希望这篇文章能帮大家快速上手 WebTransport,少踩坑、多提效。

对了,提一嘴:本文的原理示意图和代码按钮都是AI生成的,仅供参考!

😉😊😇
🥰😍😘

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=12112

(本篇完)