Skip to content

兼容的 npm 包 ​

以下包已在 qzjs 运行时中实际下载并运行。每个包由 test/compat_check.py 通过极简 CommonJS loader 加载,并用真实调用进行测试。

运行时已验证 ✅ ​

包版本大小测试结果
lodash4.18.1544KB_.sum([1,2,3,4]) === 10✅ PASS
dequal2.0.3500B深度相等检查✅ PASS¹
clsx2.1.1400BclassName 构建器✅ PASS¹
mitt3.0.1520Bon+emit+off+wildcard+clear✅ PASS
dayjs1.11.217KBdayjs('2024-01-01').year() === 2024✅ PASS
semver7.8.53KBsemver.gt('1.2.3','1.2.0') === true✅ PASS
ms2.1.33KBms('2 days') === 172800000✅ PASS¹
pako3.0.199KBpako.deflate('hello') 返回 Uint8Array✅ PASS¹

¹ 需要 CJS shim:加载前先执行 var module = {exports:{}};,然后 var pkg = module.exports;

CJS 包 ​

很多 npm 包使用 CommonJS(module.exports)。qzjs 没有内建模块系统,CJS 包 需经打包工具(esbuild/rollup)——与 ESM 同一套工具链——产出自包含 IIFE,通过 initial_script 或 new Worker(url) 运行:

bash
# 把 CJS 包打包成 IIFE,暴露为全局
npx esbuild --bundle --format=iife --global-name=mypkg --outfile=mypkg.bundle.js node_modules/mypkg
# 然后运行 bundle
./build/qzjs mypkg.bundle.js

ESM 包 ​

使用 ES 模块语法(import/export)的包不能直接加载。需要用打包工具(esbuild、rollup)将其转换为 IIFE 格式:

bash
echo "import pkg from 'nanoid'; globalThis.nanoid = pkg;" | \
  npx esbuild --bundle --format=iife --global-name=nanoid_bundle > nanoid.bundle.js

然后把 IIFE bundle 作为 initial_script 或 new Worker(url) 脚本运行。

选择标准 ​

  • 纯 JavaScript(无 node-gyp,无 C++ 插件)
  • 无 Node.js 内置模块(fs、path、http、net、process、Buffer)
  • 无浏览器专用 API(document、window、localStorage、WebSocket)
  • ES2023 语法(支持 ??=、#private、BigInt、optional chaining)

不兼容 ​

以下常用包在 qzjs 中无法工作:

包原因
express、koa、fastify需要 Node.js http 模块
react、vue、angular需要 DOM/浏览器环境
mongoose、pg、mysql2、redis需要原生 C++ 模块或 TCP
ws、socket.io需要 TCP 或 WebSocket
fs-extra、glob、chokidar需要 fs 模块
axios使用 XMLHttpRequest 或 http 模块
node-fetch内部使用 Node.js http 模块
puppeteer、playwright浏览器自动化

如何验证 ​

test/compat_check.py 结合静态源码扫描与 qzjs 真实加载:

  1. 静态扫描:标记源码中的 Node 内置模块与缺失全局,包括加载时不会走到 的分支里的潜在问题。
  2. 运行时加载:把包注入 qzjs 运行时,通过极简 CommonJS loader 真实加载 主入口。
bash
python3 test/compat_check.py lodash
python3 test/compat_check.py express uuid      # 多个包
python3 test/compat_check.py lodash --json    # 机器可读

运行时判定是决定性的:CJS 包能加载并返回导出 → 兼容;require 了 Node 内置 或外部 npm 依赖的包 → 在 require 处失败;ESM-only 包("type": "module") → 报告需用 esbuild 转成 IIFE(qzjs 没有 ESM loader)。静态扫描补充加载测试 看不到的潜在风险警告。

运行时加载失败时退出码为 1,可用作 CI 门控。

MIT 许可证