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 | |
|---|---|---|
代码从哪来 | 从上游分出的 quickjs-ng/quickjs | |
怎么发布 | 官网按日期发源码包。页面上最新一版是 2026-06-04。GitHub 仓库没有 Release | 语义化版本。最新 v0.17.0(2026-09-18),Release 里带各平台 |
怎么编译 | 仓库里是 Makefile,没有 | 主构建改成 CMake,Makefile 是包装。Windows 文档把 MSVC 写成一等支持 |
语言标准怎么写 | 介绍页写支持 ES2025,并写 test262 在勾选 ES2025 时接近全部通过 | 写的是跟上最新 ECMAScript;特性页链到 test262.fyi 的 |
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 的 | Bun v1.4.4 的 | |
|---|---|---|
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. 装上和编出来
用预编译文件:打开 v0.17.0 Release,按系统下载
qjs或qjsc。从源码编:
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。
文档还写:
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 包装 |
|
合并编译 |
| 不引入 CMake 时嵌进别的工程 |
测试 |
| 每次改动都跑 |
命令行 |
| 解释、REPL、字节码和独立可执行文件 |
预编译 | GitHub Release | darwin、linux、windows、WASI |
讨论 | GitHub Discussions、Matrix | 没有单独的 |
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。官方写明的入口是这些:
反馈。 用 GitHub Issue。讨论在 Discussions,也可以上 Matrix
#quickjs-ng:matrix.org。开发和验证。 差异说明写,每个 PR 会在 50 多种配置里测试,并跑
test262。本地对应make和make test262。文档站点仍在建设,C API 没有全部写完。提交 PR。 差异页写每个 PR 会在 GitHub 上评审、修改再合并。没有单独写分支名或必须通过的本地命令,这里不补。平台表最后一行是「缺了就开 PR」。使用者名单也靠 PR 加进去。
仓库:quickjs-ng/quickjs。文档:quickjs-ng.github.io/quickjs。和原版的差异说明:Differences with bellard/quickjs。
资料与使用说明
Star、Fork、语言、许可证、创建时间、
open_issues_count、pushed_at来自 2026-10-28 的 GitHub RESTrepos/quickjs-ng/quickjs。最近 commit 的哈希、时间和说明来自 GraphQL 的默认分支 HEAD,不是pushed_at。累计 commit 1,246、开放 Issue 100、已关闭 Issue 417、开放 PR 92、已合并 PR 1,010、已关闭未合并 PR 152、Release 24,来自同日 GraphQL。已关闭未合并是
states: CLOSED的 PR,不含已合并。Contributors 139 来自
GET /repos/quickjs-ng/quickjs/contributors?per_page=100&anon=1的全部分页:135 个 User、1 个 Bot(dependabot)、3 个匿名。这个数包含作者,不等于维护团队人数,也不含只参与 Issue 或未合并 PR 的人。文中贡献数是该 API 的 commit 贡献,不是 PR 数。当天 GitHub Trending 的 C 语言月榜页面里没有
quickjs-ng/quickjs,也没有bellard/quickjs。标题只用总 Star,没有「本月新增」。上游仓库 Star 11,077、Fork 1,176、许可证 SPDX
NOASSERTION、2026-10-26 的提交说明,来自 2026-10-28 的bellard/quickjsREST。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。2026-10-29 用 GitHub 代码搜索:
captureStackTrace在quickjs-ng/quickjs的差异页和tests/test_builtin.js里有,在bellard/quickjs无结果。BigDecimal、qjscalc在 NG 无结果;上游只出现在 Changelog。NG 特性页关于Intl的那句,只代表 NG 文档,不代表上游实测缺失。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 上。Bun 的「Rust + JavaScriptCore」、测试和包管理,来自同日仓库 README 的 “What is Bun?”。Star 96,444 和主语言 Rust 来自同日
oven-sh/bunREST。没有把 JavaScriptCore 说成这份 Rust 代码。差异页仍写「超过 40 位贡献者、超过 400 个 PR」。这和上面的 API 数字不一致,正文活动表以 API 为准,不采用这一句。差异页列出的 ES 特性也不再写成 NG 独占,以上游 Changelog 里已出现的条目为准。
安装、平台、CLI、使用者名单和「站点仍在建设」来自官网对应页面,2026-10-28 查阅。
jsvu2.2.0 只按安装页原文转述,没有另行安装核对。本文没有在本机编译或跑分。作者姓名、地点、公司和简介只取 GitHub 用户公开资料栏。没有从账号名推断履历。

成为第一条评论!
Nobody's responded to this post yet. Add your thoughts and get the conversation going.