本周项目:WebTorrent
本周我们采访了 @feross 和 @dcposch,聊了聊 WebTorrent,这款由 Web 驱动的种子客户端,它能连接用户,形成一个分布式、去中心化的浏览器到浏览器的网络。
什么是 WebTorrent?
WebTorrent 是第一个在浏览器中工作的种子客户端。它完全用 JavaScript 编写,并能使用 WebRTC 进行点对点传输。无需浏览器插件、扩展或安装。
WebTorrent 使用开放的 Web 标准,将网站用户连接起来,形成一个分布式、去中心化的浏览器到浏览器网络,用于高效的文件传输。
您可以在此处观看 WebTorrent 的演示:webtorrent.io。

这有什么酷的?
想象一下一个像 YouTube 这样的视频网站,但访客会帮助托管网站的内容。使用 WebTorrent 驱动的网站的人越多,它就变得越快、越有弹性。
浏览器到浏览器的通信消除了中间商,让人们可以按自己的方式进行通信。不再是客户端/服务器——只有一个由所有相等的点组成的对等网络。WebTorrent 是重新去中心化 Web 之旅的第一步。
Electron 在其中扮演什么角色?
大约一年前,我们决定构建 WebTorrent Desktop,这是 WebTorrent 的一个桌面应用程序版本。
我们构建 WebTorrent Desktop 有三个原因:
- 我们想要一个干净、轻量级、无广告、开源的 torrent 应用程序。
- 我们想要一个支持良好流媒体的 torrent 应用程序。
- 我们需要一个“混合客户端”,它连接 BitTorrent 和 WebTorrent 网络。
既然我已经可以在我的网页浏览器中下载种子了,为什么还需要桌面应用程序呢?
首先,简单介绍一下 WebTorrent 的设计背景。

早期,BitTorrent 使用 TCP 作为其传输协议。后来,uTP 问世,承诺比 TCP 具有更好的性能和额外的优势。每一个主流的种子客户端最终都采用了 uTP,如今你可以通过任一协议使用 BitTorrent。WebRTC 协议是下一步的逻辑发展。它带来了与网页浏览器互操作性的承诺——一个由所有桌面 BitTorrent 客户端和数百万个网页浏览器组成的庞大的 P2P 网络。
“Web peers”(在网页浏览器中运行的种子 peers)通过增加数百万个新 peer 来增强 BitTorrent 网络,并将 BitTorrent 扩展到数十种新的用例。WebTorrent 尽可能遵循 BitTorrent 规范,以便现有 BitTorrent 客户端能够轻松添加对 WebTorrent 的支持。
像 Vuze 这样的某些种子应用程序已经支持 Web peers,但我们不想坐等其他应用程序添加支持。所以,基本上,WebTorrent Desktop 是我们加速 WebTorrent 协议采用的方式。 通过创建一个人们真正想要使用的出色种子应用程序,我们增加了网络中可以与 Web peers(即网站上的用户)共享种子的 peer 数量。
除了人们已知的用途,种子还有哪些有趣的应用场景?
WebTorrent 最令人兴奋的用途之一是点对点辅助交付。像 维基百科 和 互联网档案馆 这样的非营利项目可以通过让访问者贡献带宽来减少带宽和托管成本。流行内容可以快速廉价地通过浏览器到浏览器进行分发。稀少访问的内容可以通过 HTTP 从源服务器可靠地分发。
互联网档案馆实际上已经更新了他们的种子文件,使其与 WebTorrent 配合得很好。所以,如果你想在你自己的网站上嵌入互联网档案馆的内容,你可以以一种减少互联网档案馆托管成本的方式来实现,让他们可以将更多资金用于实际存档网络!
从 CDN 到 P2P 应用交付,还有令人兴奋的商业用例。
你最喜欢的 WebTorrent 项目有哪些?
毫无疑问,用 WebTorrent 构建的最酷的项目可能是 Gaia 3D 星图。这是一个对银河系的流畅的 3D 交互式模拟。数据直接在你的浏览器中从种子加载。当你穿越星系,认识到人类与宇宙的浩瀚相比是多么渺小时,这种感觉令人敬畏。
你可以在 Torrenting The Galaxy 中阅读关于它是如何制作的,这是一篇博文,作者 Charlie Hoey 在其中解释了他如何使用 WebGL 和 WebTorrent 构建星图。

我们也是 Brave 的忠实粉丝。Brave 是一款自动阻止广告和跟踪器的浏览器,让网络更快速、更安全。Brave 最近增加了种子支持,因此你可以在 不使用独立应用程序的情况下查看传统种子。这项功能由 WebTorrent 提供支持。
因此,就像大多数浏览器可以渲染 PDF 文件一样,Brave 也可以渲染 magnet 链接和 torrent 文件。它们只是浏览器原生支持的另一种内容类型。
Brave 的联合创始人之一 Brendan Eich 是 JavaScript 的创建者,而 JavaScript 正是我们编写 WebTorrent 的语言,所以我们认为 Brave 选择集成 WebTorrent 是非常酷的事情。
你为什么选择在 Electron 上构建 WebTorrent Desktop?

有一个说法是 Electron 应用“臃肿”,因为它们在每个应用中都包含完整的 Chrome 内容模块。在某些情况下,这部分是真的(Electron 应用安装程序通常为 40MB,而特定操作系统的应用安装程序通常为 20MB)。
然而,在 WebTorrent Desktop 的情况下,我们在正常运行过程中几乎使用了所有的 Electron 功能,以及几十个 Chrome 功能。如果我们想为每个平台从头开始实现这些功能,那么构建我们的应用程序将需要额外花费数月甚至数年时间,或者我们只能发布一个平台版本。
为了让你有个概念,我们使用了 Electron 的 Dock 集成(用于显示下载进度),菜单栏集成(用于在后台运行),协议处理程序注册(用于打开磁力链接),电源节省阻止程序(用于在视频播放期间阻止睡眠),以及自动更新程序。至于 Chrome 功能,我们使用了许多:<video>
标签(用于播放多种不同的视频格式),<track>
标签(用于支持字幕),拖放支持,以及 WebRTC(在原生应用程序中使用它并不简单)。
更不用说:我们的 torrent 引擎是用 JavaScript 编写的,并假定存在大量 Node API,但特别是 require('net')
和 require('dgram')
用于 TCP 和 UDP 套接字支持。
基本上,Electron 正是我们需要的东西,并且拥有我们需要的确切功能集,能够以创纪录的时间交付一个稳定、精美的应用程序。
你最喜欢 Electron 的哪些方面?
WebTorrent 库作为一个开源的副项目已经开发了两年。我们在四周内完成了 WebTorrent Desktop 的开发。 Electron 是我们能够如此迅速地构建和发布应用程序的主要原因。
正如 Node.js 使一代使用 jQuery 的前端程序员能够进行服务器编程一样,Electron 使任何熟悉 Web 或 Node.js 开发的人都能进行原生应用程序开发。Electron 极大地赋权。
网站和桌面客户端共享代码吗?
是的,webtorrent
npm 包可以在 Node.js、浏览器和 Electron 中使用。完全相同的代码可以在所有环境中运行——这是 JavaScript 的魅力所在。它是当今的通用运行时。Java Applets 曾承诺“一次编写,随处运行”的应用程序,但由于种种原因,这种愿景从未真正实现。Electron 比任何其他平台都更接近这个理想。
在构建 WebTorrent 时,你遇到过哪些挑战?
在应用程序的早期版本中,我们努力使 UI 具有高性能。我们将种子引擎放在绘制主应用程序窗口的同一个渲染进程中,可想而知,当种子引擎进行激烈的 CPU 活动(例如验证从 peer 收到的种子片段)时,会因此导致缓慢。
我们通过将种子引擎移动到一个第二个、不可见的渲染进程来解决这个问题,该进程通过 IPC 进行通信。这样,即使该进程短暂地占用大量 CPU,UI 线程也不会受到影响。流畅的滚动和动画是如此令人满意。
注意:我们必须将 torrent 引擎放在渲染器进程中,而不是“主”进程中,因为我们需要访问 WebRTC(它仅在渲染器中可用)。
Electron 应该在哪些方面进行改进?
我们希望看到关于如何构建和发布生产级应用程序的更好文档,尤其是在代码签名和自动更新等棘手主题方面。我们不得不通过深入研究源代码和在 Twitter 上询问来学习最佳实践!
WebTorrent Desktop 完成了吗?如果还没,接下来是什么?
我们认为当前版本的 WebTorrent Desktop 非常出色,但总有改进的空间。我们目前正在努力提高打磨度、性能、字幕支持和视频编解码器支持。
如果您有兴趣参与该项目,请查看 我们的 GitHub 页面!
对于其他开发者可能有用的 Electron 开发技巧是什么?
Feross,WebTorrent Desktop 的贡献者之一,最近在阿根廷 NodeConf 上发表了一个题为《真实世界的 Electron:使用 JavaScript 构建跨平台桌面应用程序》的演讲,其中包含发布高质量 Electron 应用程序的有用技巧。如果您正处于拥有基本可用应用程序并希望将其提升到下一个更专业水平的阶段,这次演讲尤其有用。
另一位 WebTorrent 贡献者 DC 撰写了 一份清单,列出了您可以做什么 来让您的应用程序感觉更精美、更原生。它包含代码示例,涵盖了 macOS Dock 集成、拖放、桌面通知以及确保您的应用程序加载速度快等内容。