@cs-au-dk/jelly

中文文档
0.13.0发布于 2026/05/11BSD-3-Clause近 30 天下载 3530

Jelly - 为 JavaScript 调用图表和库使用分析器

中文使用文档
文档目录9 节
  1. 安装
  2. 使用量
  3. 如何建设
  4. 夹克
  5. 服务器模式
  6. 近似解释
  7. 间接界限
  8. 动态调用图构建
  9. 对于开发者

果冻

License npm version

Jelly是一个静态分析器 表演

  • 调用图表构建, (中文(简体) ),
  • 库使用模式匹配,以及
  • 脆弱性暴露分析

用于使用节点.js平台的JavaScript(和TypeScript)程序.

分析器设计基于JAM [1],TAPIR [2]和ACG [3] 的构思,支持近似解释 [4] 和间接界限[5]. 其核心是一流不敏感控制流和点对点分析,以及追踪图书馆使用情况的接入路径. 它模拟了ECMAScript语言和标准库的主要部分(意为不完全健全!), 并(目前)将Node.js标准库视为未知代码.

[1] 本杰明·巴斯列夫·尼尔森,马丁·特克拉姆·托普,安德斯·默勒: 用于安全扫描Node.js应用程序的模块调用图构造。 。 。 . ISTA 2021: 29-41号

[2] Anders Møller, Benjamin Barslev Nielsen, 马丁·特克拉姆·托尔普: 检测 JavaScript 程序中因中断库更改而受影响的位置。 。 。 . Proc. ACM Programm. Lang. 4 (OPSLA): 187:1-187: 25 (2020) (英语)

[3] Asger Feldthaus, Max Schäfer, Manu Sridharan, 朱利安·多尔比, 弗兰克·提普: JavaScript IDE 服务的近似调用图的高效构建。 。 。 . Proc. ICSE 2013: 752-761 (英语)

[4] 马西亚斯·鲁德·劳尔森(Mathias Rud Laursen), 徐文ny, 安德斯·默勒: 减少静态分析与近似解释不一致。 。 。 . Proc. ACM计划. Lang. 8(PLDI):194: 1–194:24 (2024) (英语)

[5] 马杜里马·查克拉博蒂,阿卡什·格纳纳库马尔,马努·斯里德哈兰,安德斯·默勒: 间接调用图分析 Proc. ECOOP 2024: 27:1-27:27 (英语)

安装

npm install -g @cs-au-dk/jelly

其他备选方案如下: 如何建设。 。 。 .

使用量

见全用:

jelly --help

在运行Jelly静态分析器时,会给出一个或多个条目文件作为输入. Directories 被扩展( 使用heuristics 来跳过某些文件和目录, 见 文件.ts) (中文(简体) ). 从条目文件中可以到达的所有文件都被分析,除了 如果选项 --ignore-dependencies ,在这种情况下只分析条目文件, 并仅使用基准目录中的文件(自动检测或使用选项指定) --basedir 或者说 -b页:1.

例如,生成一个用于 winston 软件包及其所有依赖性,包括JSON格式和HTML可视化:

jelly -j cg.json -m cg.html node_modules/winston

查看 cg.html 在浏览器中 :

call graph visualization

要设置堆积限制, 前缀命令如下:

NODE_OPTIONS=--max-old-space-size=8192

关于Linux vm.max_map_count 系统设置还影响到可以使用多少内存。 如果改变 --max-old-space-size 在Node.js选项没有帮助, 尝试运行 sysctl vm.max_map_count 以查看当前设置。 例如,在64GB RAM的机器上,您可以用 sudo sysctl -w vm.max_map_count=524288。 。 。 .

注意分析所有依赖性(即不使用) --ignore-dependencies)可以花很长时间. 二. 备选方案 --max-indirections 或者说 --timeout 可用于提前终止分析,以提供部分(不正确)结果.
特定软件包也可以使用 --include-packages 或者说 --exclude-packages。 。 。 .

如何建设

安装依赖性 :

npm install

编译类型脚本代码 :

npm run build

编译后,Jelly可以这样运行:

node lib/main.js

构建二进制可执行文件( 可选), 放置在 dist/数字 :

sudo npm install -g pkg
npm run pkg

注意 二进制可执行文件不支持动态调用图构建 .

夹克

构建 Docker 图像(包括支持动态调用图构建) :

npm run build-docker

在 Docker 中运行 Jelly, 将目录指定为当前工作目录的第一个参数 :

./bin/jelly-docker . tests/helloworld/app.js --callgraph-html cg.html

服务器模式

Jelly可以作为命令行界面的替代程序在服务器-模式中运行:

jelly-server

或者说

node lib/server.js

并参见上面关于如何构建二进制可执行文件的说明.

使用 JSON 格式向服务器发送请求 src/typings/ipc.ts。 。 。 . 与双行标题(包括空行)同步返回响应

Content-Length: <bytes>

与 \r\n 断线.

近似解释

使静态分析能够进行近似解释(见上文参考[4]),使用选项 --approx数字 :

jelly --approx tests/helloworld/app.js

(此示例假设您通过运行首先安装了测试依赖性) npm run tests-install. ) (中文(简体) ) 或者,您可以单独使用选项进行近似解释和静态分析 --approx-only 财务报告和审定财务报表 --approx-load数字 :

jelly --approx-only hints.json tests/helloworld/app.js
jelly --approx-load hints.json tests/helloworld/app.js

间接界限

允许间接界限(见上文参考[5]),使用选项 --max-indirections数字 :

jelly --max-indirections 2 tests/helloworld/app.js

动态调用图构建

Jelly 支持动态调用图形构建通过 节点Prof, (中文(简体) ), 它可用于测量静态分析的回想(或不健全).

安装节点Prof( 另见上文关于多克的信息):

sudo dnf install g++ libstdc++-static
mkdir -p ~/tools; cd ~/tools
git clone --depth 1 --branch 6.0.4 https://github.com/graalvm/mx.git
export PATH=$PATH:$HOME/tools/mx
mx -y fetch-jdk --java-distribution labsjdk-ce-17
export JAVA_HOME=$HOME/.mx/jdks/labsjdk-ce-17-jvmci-22.2-b01
git clone --depth 1 https://github.com/Haiyang-Sun/nodeprof.js.git
cd nodeprof.js
mx sforceimports
mx --dy /compiler build

例如,运行 tests/micro/classes.js 或者说 tests/helloworld/app.js 带有调用图形构造的仪器:

export GRAAL_HOME=$HOME/tools/graal/sdk/latest_graalvm_home

jelly tests/micro/classes.js -d cg.json
jelly tests/helloworld/app.js -d cg.json

JavaScript 程序的附加参数可以在之后添加 --。 。 。 .

也可以运行 npm test 有仪器的:

jelly --npm-test tests/mochatest -d cg.json

另一种办法是添加 $JELLY_HOME/lib/bin/node 改为 PATH 设置 JELLY_OUT例如,直接运行Mocha:

cd tests/mochatest
PATH=$JELLY_HOME/bin:$PATH JELLY_OUT=cg.json node_modules/.bin/mocha

地点 JELLY_HOME 是Jelly的家目录. 这导致文件 cg.json-<PID> 用于执行的每个仪器文件.

调用图(以静态或动态方式生成)可以比较精确和召回:

jelly --compare-callgraphs cg1.json cg2.json

对于开发者

在监视模式下编译类型脚本代码 :

npm run build-watch

作为脚本安装( I)jelly 财务报告和审定财务报表 jelly-server促进发展:

sudo npm link

安装测试的依赖性 :

npm run tests-install

运行所有测试 :

npm test

运行单个测试(由regex指定),例如:

npm test -- -t tests/helloworld

为了实现堆栈痕迹的源地图转换,前缀命令通过:

NODE_OPTIONS=--enable-source-maps

版本与发布记录

@cs-au-dk/jelly 共发布 8 个版本,首次发布于 2023/02/20;过去 12 个月发布了 2 个版本。

版本发布日期距今
0.13.0latest2026/05/116 个月前
0.12.02025/12/0411 个月前
0.11.02025/09/191.1 年前
0.10.02024/07/122 年前
0.9.02024/04/052 年前
0.8.02024/02/062 年前

关于 @cs-au-dk/jelly 的常见问题

@cs-au-dk/jelly 是什么?

Jelly - 为 JavaScript 调用图表和库使用分析器

如何安装 @cs-au-dk/jelly?

在项目目录运行 npm install @cs-au-dk/jelly,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 jelly、jelly-server,可以用 npx jelly 直接运行。

@cs-au-dk/jelly 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/cs-au-dk__jelly 是否存在。

@cs-au-dk/jelly 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@cs-au-dk/jelly 可以商用吗?

@cs-au-dk/jelly 使用 BSD-3-Clause 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。另外不得用原作者名义为衍生产品背书。以上为概括,不构成法律意见,请以许可原文为准。

@cs-au-dk/jelly 的下载量有多少?

根据 npm 官方下载统计,@cs-au-dk/jelly 在 2026/10/11 – 2026/11/09 这 30 天内被下载 3,530 次,日均约 118 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cs-au-dk/jelly 还在维护吗?

最新版本 0.13.0 发布于 2026/05/11(6 个月前);至今共发布 8 个版本,其中过去 12 个月发布了 2 个;首次发布于 2023/02/20。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。