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

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

早期,BitTorrent 使用 TCP 作为其传输协议。后来,uTP 出现了,承诺更好的性能和比 TCP 更多的优势。所有主流的 torrent 客户端最终都采用了 uTP,现在您可以通过这两种协议中的任何一种使用 BitTorrent。WebRTC 协议是下一步的逻辑发展。它带来了与 Web 浏览器互操作性的希望——一个由所有桌面 BitTorrent 客户端和数百万个 Web 浏览器组成的巨大 P2P 网络。
“Web peers”(在 Web 浏览器中运行的 torrent peers)通过增加数百万个新的 peers,并将 BitTorrent 扩展到数十种新的用例,从而使 BitTorrent 网络更强大。WebTorrent 尽可能遵循 BitTorrent 规范,以便现有 BitTorrent 客户端可以轻松添加对 WebTorrent 的支持。
像 Vuze 这样的某些 torrent 应用程序已经支持 Web peers,但我们不想等待其他人添加支持。所以基本上,WebTorrent Desktop 是我们加快 WebTorrent 协议采用速度的一种方式。通过创建一个人们真正想使用的优秀 torrent 应用程序,我们增加了网络中可以与 Web peers(即网站上的用户)共享 torrent 的 peers 数量。
除了人们已经知道的功能外,torrent 还有哪些有趣的用例?
WebTorrent 最令人兴奋的用途之一是 P2P 辅助分发。像 Wikipedia 和 Internet Archive 这样的非营利项目可以通过让访客贡献带宽来降低带宽和托管成本。热门内容可以快速、廉价地通过浏览器到浏览器进行分发。很少访问的内容可以通过 HTTP 从源服务器可靠地提供。
Internet Archive 实际上已经更新了他们的 torrent 文件,因此它们可以与 WebTorrent 很好地配合使用。因此,如果您想在您的网站上嵌入 Internet Archive 的内容,您可以以一种降低 Archive 托管成本的方式进行,让他们可以将更多的钱用于实际存档 Web!
从 CDN 到 P2P 应用交付,还有令人兴奋的商业用例。
您最喜欢哪些使用 WebTorrent 的项目?
用 WebTorrent 构建的最酷的东西,毫无疑问,可能是 Gaia 3D Star Map。这是一个流畅的、交互式的银河系 3D 模拟。数据直接在浏览器中从 torrent 加载。在我们的星系中飞行,并意识到与宇宙的浩瀚相比,我们人类是多么渺小,这真是令人敬畏。
您可以在 Torrenting The Galaxy 这篇博客文章中阅读有关它的制作过程,作者 Charlie Hoey 在其中解释了他如何使用 WebGL 和 WebTorrent 构建星图。

我们也是 Brave 的忠实粉丝。Brave 是一款自动阻止广告和跟踪器的浏览器,可以使 Web 更快、更安全。Brave 最近添加了 torrent 支持,因此您可以 无需单独的应用程序即可查看传统的 torrent。该功能由 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 集成(显示下载进度)、菜单栏集成(在后台运行)、协议处理程序注册(打开 magnet 链接)、电源节省阻止程序(在视频播放期间防止休眠)以及自动更新程序。至于 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 保持高性能。我们将 torrent 引擎放在绘制主应用程序窗口的同一个渲染器进程中,这不可避免地导致 torrent 引擎(例如验证从 peers 接收到的 torrent 片段)产生密集 CPU 活动时出现缓慢。
我们通过将 torrent 引擎移动到第二个不可见的渲染器进程中来解决此问题,该进程通过 IPC 进行通信。这样,如果该进程短暂使用大量 CPU,UI 线程将不受影响。流畅的滚动和动画非常令人满意。
注意:我们必须将 torrent 引擎放在渲染器进程中,而不是“主”进程中,因为我们需要访问 WebRTC(它仅在渲染器中可用)。
Electron 应该在哪些方面进行改进?
我们希望看到的一点是关于如何构建和发布生产就绪应用程序的更好文档,尤其是在代码签名和自动更新等棘手主题方面。我们不得不通过深入研究源代码并在 Twitter 上提问来学习最佳实践!
WebTorrent Desktop 完成了吗?如果不是,接下来有什么?
我们认为当前版本的 WebTorrent Desktop 非常出色,但总有改进的空间。我们目前正在努力提高打磨度、性能、字幕支持和视频编解码器支持。
如果您有兴趣参与该项目,请查看 我们的 GitHub 页面!
您是否有任何对其他开发者有用的 Electron 开发技巧?
WebTorrent Desktop 的贡献者之一 Feross 最近在阿根廷 NodeConf 上发表了题为“真实世界的 Electron:使用 JavaScript 构建跨平台桌面应用程序”的演讲,其中包含有关发布精美的 Electron 应用程序的有用技巧。如果您正处于有一个基本可用的应用程序并希望将其提升到更高水平的打磨度和专业性的阶段,该演讲尤其有用。
WebTorrent 的另一位贡献者 DC 撰写了 一个清单,列出了您可以执行的操作,以使您的应用程序感觉精美且原生。它附有代码示例,涵盖了 macOS Dock 集成、拖放、桌面通知以及确保应用程序快速加载等内容。