QuickJS-NG:可嵌入的小型 JavaScript 引擎,GitHub 4,033 Star

要把 JavaScript 嵌进自己的 C 程序,又要跟上较新的 ECMAScript,完整的 Node 运行时往往太大。QuickJS-NG 是 Fabrice Bellard、Charlie Gordon 原版 QuickJS 的社区分支,用 C 写成,定位就是小型、可嵌入的引擎。官方 README 写,分叉是因为原项目停更之后要重新把开发跑起来。

截至 2026-10-28,仓库 Star 4,033、Fork 421,主语言 C,许可证 MIT。最新 Release 是 2026-09-18 的 v0.17.0。默认分支最近一次 commit 是 2026-10-24 的 7a23d8e,说明是「Fix leak in JS_ReadBigInt on truncated input」。当天查 GitHub Trending 的 C 语言月榜,没有列出这个仓库。


1. 嵌进自己的程序

官网把用途写成一句:小型、可嵌入,目标是支持最新的 ECMAScript。站点仍在建设,整份 C API 还没有全部写成文档。

嵌入时可以不带 CMake。每个 Release 附带 quickjs-amalgam.zip,把源码收成一个大文件;v0.17.0 这份压缩包是 569,690 字节。要启用 std、os、bjson,编译时加上 -DQJS_BUILD_LIBC。

官方列出的使用者包括 AWS 的轻量运行时 llrt、逆向框架 radare2、Godot 的 GodotJS、构建系统 Qbs,以及能在 SQL 里跑 JavaScript 的 DuckDB QuickJS 扩展。要被写进这份名单,需要自己提 PR。

2. 命令行:qjs 和 qjsc

qjs 是解释器,带一个简单标准库和 REPL。常用开关包括:

  • -e 直接求值,-i 进入交互。

  • --std 把 std、os、bjson 交给脚本。

  • --memory-limit、--stack-size 限制内存和栈。

  • -c 把单个 JS 文件收成独立可执行文件:qjs -c app.js -o app --exe qjs。文档写明,这个文件不能再依赖别的 JS 文件,多文件要先用打包器打成一个。

qjsc 是编译器。它可以输出字节码,也可以生成带 main() 的 C 文件,方便再链进自己的程序。v0.17.0 的 qjsc-darwin-arm64 是 1,144,104 字节。

3. 语言特性和跨平台

项目自己的差异说明写了四件持续在做的事:社区开发、测试、跨平台、ES 特性。每个 PR 会在 50 多种配置里跑,操作系统、构建类型和 sanitizer 都算在内;每次改动也跑 test262。构建改成了 CMake,Windows 用 MSVC 或 Clang,文档把它写成一等支持。

同一页列出的 ES 能力包括 Resizable ArrayBuffer、Float16Array、WeakRef、FinalizationRegistry、Iterator Helpers、Promise.try、Error.isError 和 Set 运算,另外还有 V8 风格的 Error.captureStackTrace。这些名字里,前一类在上游 2025–2026 的更新日志里也能找到,不能当成只有 NG 才有,对照放在下一节。页面写明这是解释器:相对带 JIT 的引擎,性能上限就在这里;已经做的优化是 opcode 合并、多态内联缓存、内存分配和解析速度。NG 的特性页还写,因为体积,不太会去做 Intl。

支持平台表里,Linux 覆盖 glibc 和 musl,macOS 要求 11 及以上,Windows 写的是 Windows 7 起(并注明 Windows 7 已停止支持,只在不妨碍项目进展时保留),Android 要求 NDK 不低于 26.0.10792818。FreeBSD、OpenBSD、NetBSD 和 iOS 标的是测试有限。


4. 和上游 QuickJS 的差别

两边是同一套 C 引擎的两条线,都用来嵌进别的程序,都不是 Node。NG 的差异页写,目标是给已经在用 QuickJS 的人做替代,C API 改动尽量少。

上游 QuickJS

QuickJS-NG

代码从哪来

bellard/quickjs,官网 bellard.org/quickjs

从上游分出的 quickjs-ng/quickjs

怎么发布

官网按日期发源码包。页面上最新一版是 2026-06-04。GitHub 仓库没有 Release

语义化版本。最新 v0.17.0(2026-09-18),Release 里带各平台 qjs、qjsc 和 WASI

怎么编译

仓库里是 Makefile,没有 CMakeLists.txt

主构建改成 CMake,Makefile 是包装。Windows 文档把 MSVC 写成一等支持

语言标准怎么写

介绍页写支持 ES2025,并写 test262 在勾选 ES2025 时接近全部通过

写的是跟上最新 ECMAScript;特性页链到 test262.fyi 的 qjs_ng

2026-10-28 的仓库

Star 11,077,最近 commit 2026-10-26

Star 4,033,最近 commit 2026-10-24

分叉之后真正拉开的是发布和工程,不是「一个停更、一个还活着」。

  • 发布渠道不同。 上游的正式包在官网,文件名带日期,例如 quickjs-2026-06-04.tar.xz,另外有 Cosmopolitan 二进制,一份 zip 覆盖 Linux、Mac、Windows 和几种 BSD 的 ARM64 与 x86_64。GitHub 上的 bellard/quickjs 能看到提交,但 Releases 数量是 0。NG 的包在 GitHub Release,按系统拆开。

  • 构建系统不同。 这是 NG 差异页自己写的改动:为了 Windows 等平台,构建换成 CMake,并加上 MSVC。上游仓库仍是 Makefile。嵌入时 NG 另外提供 quickjs-amalgam.zip,不强制宿主使用 CMake。

  • 语言特性有重叠,不能按差异页的清单当成 NG 独占。 上游更新日志里,2025-04-26 加入 WeakRef、FinalizationRegistry,并删掉 bignum 扩展和 qjscalc;2025-09-13 加入 Float16Array、Promise.try、Error.isError;2026-06-04 加入可调整大小的 ArrayBuffer、Iterator、Set 方法。NG 差异页也列出了其中好几项。2026-10-29 在两个仓库里搜 BigDecimal、qjscalc,当前代码都没有,只在上游 Changelog 里留着旧记录。

  • NG 写明、上游仓库里搜不到的是 V8 栈接口。 Error.captureStackTrace、Error.prepareStackTrace、Error.stackTraceLimit。NG 的测试里有调用;同一天在 bellard/quickjs 搜 captureStackTrace 没有结果。

  • 性能数字各说各的,不能横比。 上游 2026-06-04 相对自己上一版,bench-v8 分数高 42%:自定义小块分配大约 11%,其余微优化大约 30%。介绍页还写,单核跑 test262 大约 2 分钟,运行时从创建到销毁不到 300 微秒,简单 hello world 的 x86 代码 367 KiB。NG 只列出 opcode 合并、多态内联缓存、内存分配和解析速度,没有给出相对上游的倍数。

  • 谁在改。 NG 的 PR 在 GitHub 上评审,差异页写每次改动跑 test262,并在 50 多种系统、构建和 sanitizer 配置里测。上游的公开记录是官网更新日志和 GitHub 提交。NG 的 README 仍把分叉原因写成上游停更;官网 2026-06-04 还有版本,仓库 2026-10-26 还有提交「fixed arbitrary module namespace names」。

要跟官网源码包和 Bellard 的提交,用上游。要 GitHub Release、CMake、MSVC,以及文档里的 V8 栈接口,用 NG。

和 Bun 的差别

Bun 不是这条引擎的另一个分支。它的 README 把自己写成单个可执行文件里的 JavaScript / TypeScript 工具包,用来替代 Node.js:外壳是 Rust,JavaScript 引擎是 JavaScriptCore,里面还有测试、脚本运行和包管理。

QuickJS-NG v0.17.0 的 qjs

Bun v1.4.4 的 bun

macOS Apple 芯片

1.3 MB(1,320,208 字节)

84.6 MB

Linux x64

2.4 MB(2,562,504 字节)

102.3 MB

Mac 上大约 67 倍,Linux 上大约 42 倍。367 KiB 是上游介绍页上「引擎链进 hello world」的代码量,不是这张表里的 qjs,也不是 Bun。没有 QuickJS-NG 和 Bun 在同一台机器、同一套用例上的对照,这里不写快几倍。嵌进别的程序、由宿主决定能不能碰文件和网络,用 QuickJS 或 QuickJS-NG。要跑现成项目、顺手测试和装包,用 Bun。


5. 装上和编出来

  1. 用预编译文件:打开 v0.17.0 Release,按系统下载 qjs 或 qjsc。

  2. 从源码编:

git clone https://github.com/quickjs-ng/quickjs.git
cd quickjs
make
make install

默认装到 /usr/local。Windows 文档要求改用手写 CMake 命令。大端目标要先 make codegen,再 make。调试构建是 make debug,跑测试套件是 make test262。

  1. 文档还写:jsvu 从 2.2.0 起,请求 quickjs 引擎时会装上 QuickJS-NG。安装命令是 npm install jsvu -g。


6. 维护者

README 把作者写成 @null(https://github.com/bnoordhuis)、[@saghul](https://github.com/saghul) 以及其余贡献者。

  • bnoordhuis 的资料名是 Ben Noordhuis,地点 The Netherlands。简介、公司、博客都空着。贡献数 395。

  • saghul 的资料名是 Saúl Ibarra Corretgé,公司栏 @jitsi / @8x8,地点 Amsterdam,简介「Fellow Jitster」,博客 bettercallsaghul.com。贡献数 441。他自己的 txiki.js 也在官方使用者名单里。

LICENSE 的版权行同时有 Fabrice Bellard(2017–2026)、Charlie Gordon(2017–2024)、Ben Noordhuis(2023–2026)、Saúl Ibarra Corretgé(2023–2026)。GitHub 账号 chqrlie 的资料名是 Charlie Gordon,贡献数 53。这些数字是提交贡献,不是 PR 数。

7. 技术栈

部分

是什么

用途

语言

C

解析器、解释器、标准库

构建

CMake,另有 Makefile 包装

make 编出 qjs、qjsc;Windows 用手写 CMake

合并编译

quickjs-amalgam.zip

不引入 CMake 时嵌进别的工程

测试

test262,make test262

每次改动都跑

命令行

qjs、qjsc

解释、REPL、字节码和独立可执行文件

预编译

GitHub Release

darwin、linux、windows、WASI

讨论

GitHub Discussions、Matrix #quickjs-ng:matrix.org

没有单独的 CONTRIBUTING.md

8. 项目活跃度

查询日期 2026-10-28。Star、Fork 来自仓库 REST。commit、Issue、PR、Release 来自 GraphQL。Contributors 来自贡献者 API 全部分页。

指标

数值

Star

4,033

Fork

421

Contributors

139

累计 commit

1,246

最近 commit 日期

2026-10-24

开放 Issue

100

开放 PR

92

已合并 PR

1,010

已关闭未合并 PR

152

Release

24(最新 v0.17.0,2026-09-18)

仓库创建于 2023-11-01。REST 的 open_issues_count 是 192,等于 100 个开放 Issue 加 92 个开放 PR。pushed_at 是 2026-10-27,晚于上面的 commit 时间,不把它当成最近代码提交时间。

9. 如何贡献

仓库根目录没有 CONTRIBUTING.md。官方写明的入口是这些:

  1. 反馈。 用 GitHub Issue。讨论在 Discussions,也可以上 Matrix #quickjs-ng:matrix.org。

  2. 开发和验证。 差异说明写,每个 PR 会在 50 多种配置里测试,并跑 test262。本地对应 make 和 make test262。文档站点仍在建设,C API 没有全部写完。

  3. 提交 PR。 差异页写每个 PR 会在 GitHub 上评审、修改再合并。没有单独写分支名或必须通过的本地命令,这里不补。平台表最后一行是「缺了就开 PR」。使用者名单也靠 PR 加进去。


仓库:quickjs-ng/quickjs。文档:quickjs-ng.github.io/quickjs。和原版的差异说明:Differences with bellard/quickjs。

资料与使用说明

  1. Star、Fork、语言、许可证、创建时间、open_issues_count、pushed_at 来自 2026-10-28 的 GitHub REST repos/quickjs-ng/quickjs。最近 commit 的哈希、时间和说明来自 GraphQL 的默认分支 HEAD,不是 pushed_at。

  2. 累计 commit 1,246、开放 Issue 100、已关闭 Issue 417、开放 PR 92、已合并 PR 1,010、已关闭未合并 PR 152、Release 24,来自同日 GraphQL。已关闭未合并是 states: CLOSED 的 PR,不含已合并。

  3. Contributors 139 来自 GET /repos/quickjs-ng/quickjs/contributors?per_page=100&anon=1 的全部分页:135 个 User、1 个 Bot(dependabot)、3 个匿名。这个数包含作者,不等于维护团队人数,也不含只参与 Issue 或未合并 PR 的人。文中贡献数是该 API 的 commit 贡献,不是 PR 数。

  4. 当天 GitHub Trending 的 C 语言月榜页面里没有 quickjs-ng/quickjs,也没有 bellard/quickjs。标题只用总 Star,没有「本月新增」。

  5. 上游仓库 Star 11,077、Fork 1,176、许可证 SPDX NOASSERTION、2026-10-26 的提交说明,来自 2026-10-28 的 bellard/quickjs REST。NG README 里的「went dormant」是分叉时的说法,不写成上游现在已经停更。官网 bellard.org/quickjs 与 Changelog 于 2026-10-29 查阅:最新源码包日期 2026-06-04,bench-v8 相对上一版快 42%(小块分配约 11%,微优化约 30%),ES2025、test262 约 2 分钟、生命周期不到 300 微秒、hello world 的 x86 代码 367 KiB,以及 2025-04-26 删除 bignum 和 qjscalc、2025-09-13 与 2026-06-04 新增的语言特性,都来自这两页。GitHub Releases 数量 0、没有 CMakeLists.txt、有 Makefile,来自 2026-10-29 的仓库 API。

  6. 2026-10-29 用 GitHub 代码搜索:captureStackTrace 在 quickjs-ng/quickjs 的差异页和 tests/test_builtin.js 里有,在 bellard/quickjs 无结果。BigDecimal、qjscalc 在 NG 无结果;上游只出现在 Changelog。NG 特性页关于 Intl 的那句,只代表 NG 文档,不代表上游实测缺失。

  7. qjs、qjsc 和 quickjs-amalgam.zip 的字节数来自 v0.17.0 Release 资源的 size 字段。Bun 的 84.6 MB、102.3 MB 是 2026-10-28 从 bun-v1.4.4 的 bun-darwin-aarch64.zip、bun-linux-x64.zip 中央目录读出的未压缩 bun,不是 zip 体积,也不是内存。67 倍、42 倍是这两份未压缩大小除以对应的 qjs 字节。上游 367 KiB 不套到 NG 的 qjs 或 Bun 上。

  8. Bun 的「Rust + JavaScriptCore」、测试和包管理,来自同日仓库 README 的 “What is Bun?”。Star 96,444 和主语言 Rust 来自同日 oven-sh/bun REST。没有把 JavaScriptCore 说成这份 Rust 代码。

  9. 差异页仍写「超过 40 位贡献者、超过 400 个 PR」。这和上面的 API 数字不一致,正文活动表以 API 为准,不采用这一句。差异页列出的 ES 特性也不再写成 NG 独占,以上游 Changelog 里已出现的条目为准。

  10. 安装、平台、CLI、使用者名单和「站点仍在建设」来自官网对应页面,2026-10-28 查阅。jsvu 2.2.0 只按安装页原文转述,没有另行安装核对。本文没有在本机编译或跑分。

  11. 作者姓名、地点、公司和简介只取 GitHub 用户公开资料栏。没有从账号名推断履历。

排序方式 :

成为第一条评论!

Nobody's responded to this post yet. Add your thoughts and get the conversation going.