Bun 开放拉取请求,为 JavaScriptCore 添加共享内存线程支持
摘要
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函数,可用于更新内部存储的VectorJSC::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
- 搜索 WebKit Bugzilla(https://bugs.webkit.org/query.cgi?format=specific&product=WebKit),查看您遇到的 bug 是否有现有报告。
- 如果尚未创建 Bugzilla 帐户(https://bugs.webkit.org/createaccount.cgi),请创建一个以报告 bug(并对其进行评论)。
- 根据我们的指南(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 及其命令行工具,请先安装:
- 安装 Xcode
- 安装 Xcode 命令行工具:在终端中运行命令
xcode-select --install - 安装 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
Bun 1.4 是 JavaScript 开发工具套件的一次重大更新,显著增强了 Node.js 兼容性,新增了超过 1,500 项测试,降低了 CPU 和内存使用率,并引入了用于图像处理、webviews 等的新 API。
Bun 的 Rust 重写已合并
Bun,JavaScript 运行时和包管理器,已合并其核心从 Zig 到 Rust 的重写,可能提升性能和可维护性。
sashimikun_void: prime-bun 更新:已接入 @trevin 的 /ce-prototype 来规划 @jarredsumner 提供的新 Bun 1.4.0 功能的集成路径。
prime-bun 项目已更新,以规划 Bun 1.4.0 功能的集成路径,使用并行 RLM workers 并发实现原型,速度提升显著。
用Rust重写Bun
Bun,这个JavaScript运行时和工具链,正在从Zig重写为Rust,以提高内存安全性和稳定性,解决一系列use-after-free和内存泄漏错误。
Bun 的 Rust 重写已合并
Bun JavaScript 运行时和工具包已用 Rust 重写,标志着从原本的 Zig 实现发生了重大转变。