Bun 开放拉取请求,为 JavaScriptCore 添加共享内存线程支持

Hacker News Top 工具

摘要

Bun 有一个开放的拉取请求,为 JavaScriptCore(WebKit 底层的 JavaScript 引擎)添加共享内存线程支持。这一增强可能提高 Bun 中多线程 JavaScript 工作负载的性能。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/06/20 20:17

oven-sh/WebKit 源代码:https://github.com/oven-sh/WebKit # 带有补丁的 WebKit

这是 WebKit 的一个构建版本,包含 bun(https://bun.sh)使用的一些额外补丁。

对 WebKit 的修改如下:

  • bmalloc::api::availableMemory() 考虑了 cgroups 1 和 2 的内存限制
  • JSC::ErrorInstance 新增了 captureStackTrace 函数,可用于更新内部存储的 Vector
  • JSC::JSGlobalObject 新增了 double overridenDateNow 字段,允许覆盖 Date.now() 和 new Date() 使用的时间戳
  • JSC::VM 新增了 onComputeErrorInfo 回调,允许嵌入者自定义 Error.prototype.stack 字符串的格式(Bun 使用此特性使其与 V8 行为一致,以实现 Node.js 兼容性)
  • 导出了更多内容
  • 类型化数组(Typed Arrays)可通过 DOMJIT 传递
  • ExternalStringImpl 增加了一个额外的指针字段
  • OptionsList::showPrivateScriptsInStackTraces() 启用后,ImplementationVisibilty::Private 函数会出现在堆栈跟踪中
  • 移除了 C API 中的许多锁。锁定由打包器内部处理
  • JSString 迭代器,可将每个嵌套 JSRopeString 底层缓冲区的指针暴露给回调,而无需扁平化或分配新字符串。这对于从 JavaScript 向其他地方传递字符串的原生代码,或在 WTF::String 外部手动分配字符串非常有用。例如 console.log 或服务器端渲染(不使用流时)
  • ExternalStringImpl 现在支持静态字符串。这算是一种 hack;更好的解决方案是使用 NeverDestroyed 在编译时生成所有静态字符串的脚本,但需要找到一种从 Zig 实现的好方法
  • OptionsList::useV8DateParser 启用 V8 的日期解析器
  • ReferenceError(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError)消息已更改为与 V8 一致(ReferenceError: Can't find variable: → ReferenceError: is undefined)。仍需解决远程检查器的工作问题。

注意:如果你修改此仓库,请确保更新 Bun 中 cmake/tools/SetupWebKit.cmake 的提交哈希。


WebKit

WebKit 是一个跨平台网页浏览器引擎。在 iOS 和 macOS 上,它为 Safari、邮件、Apple Books 及许多其他应用提供支持。有关 WebKit 的更多信息,请参见 WebKit 项目网站(https://webkit.org/)。

尝试最新版本

在 macOS 上,下载 Safari 技术预览版(https://webkit.org/downloads/)以测试最新版本的 WebKit。在 Linux 上,下载 Epiphany 技术预览版(https://webkitgtk.org/epiphany-tech-preview)。在 Windows 上,则需要自行构建。

报告 Bug

  1. 搜索 WebKit Bugzilla(https://bugs.webkit.org/query.cgi?format=specific&product=WebKit),查看您遇到的 bug 是否有现有报告。
  2. 如果尚未创建 Bugzilla 帐户(https://bugs.webkit.org/createaccount.cgi),请创建一个以报告 bug(并对其进行评论)。
  3. 根据我们的指南(https://webkit.org/bug-report-guidelines/)提交 bug。提交后,您将在 bug 生命周期的每个阶段(https://webkit.org/bug-life-cycle)收到更新邮件。当 bug 被视为修复后,您可能会被要求下载最新的夜间版本(https://webkit.org/nightly)并确认修复对您有效。

获取代码

运行以下命令克隆 WebKit 的 Git 仓库:

git clone https://github.com/WebKit/WebKit.git WebKit

您可以通过 git config core.fsmonitor true 启用 git fsmonitor(https://git-scm.com/docs/git-config#Documentation/git-config.txt-corefsmonitor)来加快许多 git 命令(如 git status)的速度。

构建 WebKit

针对 Apple 平台构建

如果您尚未安装 Xcode 及其命令行工具,请先安装:

  1. 安装 Xcode
  2. 安装 Xcode 命令行工具:在终端中运行命令 xcode-select --install
  3. 安装 Metal 工具链:在终端中运行命令 xcodebuild -downloadComponent MetalToolchain

运行以下命令构建包含调试符号和断言的 macOS 调试版本:

Tools/Scripts/build-webkit --debug

对于性能测试及其他用途,请使用 --release 参数。如果还需要调试符号(dSYMs),请运行:

Tools/Scripts/build-webkit --release DEBUG_INFORMATION_FORMAT=dwarf-with-dsym

嵌入式构建

要为 iOS、tvOS 或 watchOS 等嵌入式平台构建,请向 build-webkit 传递平台参数。例如,为嵌入式模拟器构建包含调试符号和断言的调试版本:

Tools/Scripts/build-webkit --debug ---simulator

或为嵌入式设备构建:

Tools/Scripts/build-webkit --debug ---device

其中 platform 是 ios、tvos 或 watchos。

使用 Xcode

您可以打开 WebKit.xcworkspace 在 Xcode 中构建和调试 WebKit。选择 “Everything up to WebKit + Tools” 方案以构建整个项目。如果您在 Xcode 偏好设置中未使用自定义构建位置,则需要更新工作区设置以使用 WebKitBuild 目录。在菜单栏中,选择 File > Workspace Settings,然后单击 Advanced 按钮,选择 “Custom”、“Relative to Workspace”,并在 Products 和 Intermediates 中都输入 WebKitBuild。

构建 GTK 端口

对于生产版本:

cmake -DPORT=GTK -DCMAKE_BUILD_TYPE=RelWithDebInfo -GNinja
ninja
sudo ninja install

对于开发版本:

Tools/gtk/install-dependencies
Tools/Scripts/update-webkitgtk-libs
Tools/Scripts/build-webkit --gtk --debug

有关构建 WebKitGTK 的更多信息,请参见 wiki 页面(https://trac.webkit.org/wiki/BuildingGtk)。

构建 WPE 端口

对于生产版本:

cmake -DPORT=WPE -DCMAKE_BUILD_TYPE=RelWithDebInfo -GNinja
ninja
sudo ninja install

对于开发版本:

Tools/wpe/install-dependencies
Tools/Scripts/update-webkitwpe-libs
Tools/Scripts/build-webkit --wpe --debug

构建 Windows 端口

有关在 Windows 上构建 WebKit 的信息,请参见 WebKit on Windows 页面(https://docs.webkit.org/Ports/WindowsPort.html)。

运行 WebKit

配合 Safari 及其他 macOS 应用程序

运行以下命令启动 Safari 并使用您的本地 WebKit 构建:

Tools/Scripts/run-safari --debug

run-safari 脚本将 DYLD_FRAMEWORK_PATH 环境变量设置为指向您的构建产品,然后启动 /Applications/Safari.app。DYLD_FRAMEWORK_PATH 告诉系统加载器优先使用您的构建产品,而不是安装在 /System/Library/Frameworks 中的框架。

要使用您的本地 WebKit 构建运行其他应用程序,请运行以下命令:

Tools/Scripts/run-webkit-app

iOS 模拟器

运行以下命令启动 iOS 模拟器并使用您的本地 WebKit 构建:

run-safari --debug --ios-simulator

在上述两种情况下,如果您构建的是发布版本,请使用 --release 代替 --debug。

要使用您的本地 WebKit 构建运行其他应用程序(例如 MobileMiniBrowser),请运行以下命令:

Tools/Scripts/run-webkit-app --debug --iphone-simulator

使用 Xcode

打开 WebKit.xcworkspace,选择预期方案(如 MobileMiniBrowser)和 iOS 模拟器作为目标,然后单击运行。

Linux 端口

如果您有开发版本,可以使用 run-minibrowser 脚本,例如:

run-minibrowser --debug --wpe

传递 --gtk、--jsc-only 或 --wpe 之一以指示要使用的端口。

贡献代码

恭喜!您已经成功运行。现在您可以开始在 WebKit 中编码,并将您的修复和新功能贡献给项目。有关如何向项目提交代码的详细信息,请阅读贡献代码(https://webkit.org/contributing-code/)。

相似文章

Bun 1.4

Lobsters Hottest

Bun 1.4 是 JavaScript 开发工具套件的一次重大更新,显著增强了 Node.js 兼容性,新增了超过 1,500 项测试,降低了 CPU 和内存使用率,并引入了用于图像处理、webviews 等的新 API。

Bun 的 Rust 重写已合并

Lobsters Hottest

Bun,JavaScript 运行时和包管理器,已合并其核心从 Zig 到 Rust 的重写,可能提升性能和可维护性。

用Rust重写Bun

Hacker News Top

Bun,这个JavaScript运行时和工具链,正在从Zig重写为Rust,以提高内存安全性和稳定性,解决一系列use-after-free和内存泄漏错误。

Bun 的 Rust 重写已合并

Hacker News Top

Bun JavaScript 运行时和工具包已用 Rust 重写,标志着从原本的 Zig 实现发生了重大转变。