kernel-js-lite
v2.38.0
Published
Embedded JavaScript kernel — pure Node.js JS runtime for safe execution of untrusted code. Tokenizer, parser, interpreter with scopes, closures, built-in objects, host API bindings, and resource limits. (中文 / English / 日本語 / 한국어)
Maintainers
Readme
kernel-js-lite
嵌入式 JavaScript 内核 — 纯 Node.js 实现的 JavaScript 运行时,用于安全执行不可信代码。
类似 QuickJS 但用纯 Node 实现:词法分析 → 语法分析 → AST → 树遍历解释器。零依赖。
npm install kernel-js-lite快速开始
const { run, Kernel } = require('kernel-js-lite')
// 一步执行
run('1 + 2 * 3') // 7
// 使用 Kernel 实例(支持宿主函数绑定)
const k = new Kernel()
k.hostFunction('double', (x) => x * 2)
k.run('double(21)') // 42功能特性
| 特性 | 状态 |
|------|------|
| 词法分析器 | ✓ |
| 递归下降语法分析器 | ✓ |
| 算术运算 (+ - * / %) | ✓ |
| 比较运算 (=== !== < > <= >=) | ✓ |
| 逻辑运算 (&& \|\| !) | ✓ |
| 变量声明 (var let const) | ✓ |
| 赋值 | ✓ |
| 条件语句 (if/else) | ✓ |
| 循环 (while for) | ✓ |
| 函数声明与调用 | ✓ |
| 递归 | ✓ |
| 闭包(词法作用域) | ✓ |
| 数组 ([1,2,3]) | ✓ |
| 对象 ({a:1}) | ✓ |
| 内置对象 (Array, Object, String, Number, Boolean) | ✓ |
| Array — push pop join indexOf includes slice splice forEach map filter reduce reverse | ✓ |
| String — length charAt indexOf includes slice split toUpperCase toLowerCase trim replace | ✓ |
| Object — keys values entries assign | ✓ |
| Math — abs ceil floor round max min pow sqrt random PI E | ✓ |
| console.log/warn/error | ✓ |
| 宿主函数绑定 | ✓ |
| 资源限制(CPU 指令数、调用深度、内存) | ✓ |
| 注释 (// /* */) | ✓ |
资源限制
const result = run(code, {
maxInstructions: 10000, // 最大 AST 节点数(默认 100000)
maxDepth: 500, // 最大调用栈深度(默认 1000)
maxMemory: 4194304, // 最大内存字节数(默认 8MB)
})超出限制时抛出 Error('Script execution timeout: ...')。
Kernel API
run(code, options?)
一步完成解析和执行,返回最后一个表达式的值。
new Kernel(options?)
创建一个可复用的内核实例。
kernel.hostFunction(name, fn)
注册一个宿主(Node.js)函数,沙箱内代码可直接调用。
const k = new Kernel()
k.hostFunction('fetchUser', (id) => ({ id, name: 'Alice' }))
k.run('fetchUser(1).name') // 'Alice'kernel.compile(code)
将代码编译为 AST,用于重复执行。
kernel.execute(ast, options?)
执行预编译的 AST。
支持的语法
// 变量
var x = 1
let y = 2
const z = 3
// 算术
1 + 2 * (3 - 4) / 5
// 比较
a === b, a !== b, a < b, a > b, a <= b, a >= b
// 逻辑
true && false, true || false, !true
// 条件
if (x > 0) { ... } else { ... }
// 循环
while (i < 10) { i = i + 1 }
for (var i = 0; i < 10; i = i + 1) { ... }
// 函数
function add(a, b) { return a + b }
add(1, 2)
// 闭包
function makeCounter() {
var count = 0
return function() { count = count + 1; return count }
}
// 数组
var arr = [1, 2, 3]
arr.push(4)
arr.map(function(x) { return x * 2 })
// 对象
var obj = { a: 1, b: 2 }
obj.a
Object.keys(obj)许可证
MIT
