2 个版本

0.0.3 2023年2月18日
0.0.2 2023年2月9日

#1226 in 网页编程

14,324 星 & 79 关注者

130KB
3.5K SLoC

Rust 2.5K SLoC // 0.0% comments · Rust 包仓库 JavaScript 408 SLoC · Rust 包仓库 Shell 288 SLoC // 0.1% comments · Rust 包仓库 C++ 250 SLoC · Rust 包仓库

   O    O
    \  /
O —— Cr —— O
    /  \
   O    O

Carbonyl

Carbonyl 是一个基于 Chromium 的浏览器,旨在在终端中运行。 阅读博客文章

它几乎支持所有 Web API,包括 WebGL、WebGPU、音频和视频播放、动画等。

它运行快速,启动时间不到一秒,以 60 FPS 运行,空闲时 CPU 使用率为 0%。它不需要窗口服务器(即在安全模式控制台工作),甚至可以通过 SSH 运行。

Carbonyl 最初始于 html2svg,现在是其背后的运行时。

使用方法

Carbonyl 在 Linux 上(无需 Docker)需要与 Chromium 相同的依赖项。

Docker

$ docker run --rm -ti fathyb/carbonyl https://youtube.com

npm

$ npm install --global carbonyl
$ carbonyl https://github.com

二进制文件

演示

已知问题

  • 尚不支持全屏模式

比较

Lynx

Lynx 是原始的终端网页浏览器,也是目前仍维护的最古老的浏览器。

优点

  • 当 Lynx 理解一个页面时,它有最佳的布局,完全针对终端进行了优化

缺点

有些人可能听起来像优点,但 Browsh 和 Carbonyl 让您可以选择禁用其中大部分

  • 不支持很多现代网页标准
  • 无法运行 JavaScript/WebAssembly
  • 无法查看或播放媒体(音频、视频、DOOM)

Browsh

Browsh 是原始的 "将普通浏览器转换为终端" 项目。它以无头模式启动 Firefox 并通过自动化协议连接到它。

优点

  • 更容易更新底层浏览器:只需更新 Firefox
  • 这使得开发更加容易:只需安装Firefox,然后在几秒钟内编译Go代码。
  • 截至目前,Browsh支持扩展,而Carbonyl不支持,尽管它已在我们的发展路线图上。

缺点

  • 它的运行速度较慢,需要的资源也更多。平均来说,相同的内容需要50倍以上的CPU功率。这是因为Carbonyl不会缩小或复制窗口帧缓冲区,它以终端分辨率原生渲染。
  • 它使用自定义样式表来修复布局,这比Carbonyl对其HTML引擎(Blink)所做的更改更不可靠。

操作系统支持

根据测试,以下操作系统得到了支持

  • Linux(已测试Debian、Ubuntu和Arch)
  • MacOS
  • Windows 11和WSL

贡献

Carbonyl分为两部分:一个是“核心”,它被构建为一个共享库(libcarbonyl),另一个是“运行时”,它动态加载核心(carbonyl可执行文件)。

核心是用Rust编写的,从头开始构建需要几分钟时间。运行时是Chromium无头外壳的修改版本,从头开始构建需要超过一个小时。

如果您只是对Rust代码进行更改,则构建libcarbonyl并将其替换为Carbonyl的发布版本。

核心

$ cargo build

运行时

一些注意事项

  • 构建运行时几乎与构建Chromium相同,只需额外的步骤来修补和捆绑Rust库。scripts/目录中的脚本只是gnninja等工具的简单包装。
  • 在Linux上为arm64构建Chromium需要amd64处理器
  • Carbonyl仅在Linux和MacOS上进行了测试,其他平台可能需要修改Chromium的代码
  • Chromium体积庞大,构建时间较长,会使您的计算机大部分时间无法响应。例如,使用M1 Max或i9 9900k的8核CPU,并通过10 Gbps光纤进行检索和构建大约需要1小时。它需要大约100 GB的磁盘空间。

检索

检索Chromium的代码。

$ ./scripts/gclient.sh sync

应用补丁

对Chromium所做的任何更改都将被撤销,请确保保存您所做的任何更改。

$ ./scripts/patches.sh apply

配置

$ ./scripts/gn.sh args out/Default

Default是目标名称,您可以使用多个名称并选择您喜欢的任何名称,例如。

$ ./scripts/gn.sh args out/release
$ ./scripts/gn.sh args out/debug
# or if you'd like to build a multi-platform image
$ ./scripts/gn.sh args out/arm64
$ ./scripts/gn.sh args out/amd64

当提示时,输入以下参数

import("//carbonyl/src/browser/args.gn")

# uncomment this to build for arm64
# target_cpu = "arm64"

# comment this to disable ccache
cc_wrapper = "env CCACHE_SLOPPINESS=time_macros ccache"

# comment this for a debug build
is_debug = false
symbol_level = 0
is_official_build = true

构建二进制文件

$ ./scripts/build.sh Default

这应该会产生以下输出

  • out/Default/headless_shell:浏览器二进制文件
  • out/Default/icudtl.dat
  • out/Default/libEGL.so
  • out/Default/libGLESv2.so
  • out/Default/v8_context_snapshot.bin

构建Docker镜像

# Build arm64 Docker image using binaries from the Default target
$ ./scripts/docker-build.sh Default arm64
# Build amd64 Docker image using binaries from the Default target
$ ./scripts/docker-build.sh Default amd64

运行

$ ./scripts/run.sh Default https://wikipedia.org

依赖项

~2MB
~27K SLoC