SableJS:一个更安全、更快速的ECMA5.1 JavaScript解释器
1. 项目介绍
SableJS 是一个使用 JavaScript 编写的 ECMA5.1 解释器。它旨在提供一种更安全、更高效的方式来执行 JavaScript 代码。SableJS 可以用于沙盒环境(如 Figma 插件沙盒),也可以通过 AOT(Ahead-Of-Time)编译将 JavaScript 源代码转换为操作码,从而保护 JavaScript 源代码。
SableJS 已经覆盖了大约 95% 的 test262 es5 测试用例,可以在生产环境中安全使用。
2. 项目快速启动
安装
首先,需要全局安装 SableJS:
npm i sablejs -g
编译代码
假设我们有以下 JavaScript 代码在 fib.js
文件中:
function fib(n) {
return n < 2 ? n : fib(n - 1) + fib(n - 2);
}
var start = Date.now();
console.log("[INFO] fib: " + fib(30));
console.log("[INFO] time consuming: " + (Date.now() - start) + "ms");
使用 SableJS CLI 工具编译该文件:
sablejs -i fib.js -o output
这会生成一个包含编译后代码的输出文件。
运行编译后的代码
在 Node.js 环境中,运行以下命令来执行编译后的代码:
const VM = require('sablejs/runtime');
const fs = require('fs');
// 导入 console.log 函数到 VM 调用
const vm = new VM();
const vGlobal = vm.getGlobal();
const vConsole = vm.createObject();
const vLog = vm.createFunction('log', function() {
const temp = [];
for (let i = 0; i < arguments.length; i++) {
temp.push(vm.asString(arguments[i]));
}
console.log(...temp);
return vm.createUndefined();
});
vm.setProperty(vConsole, 'log', vLog);
vm.setProperty(vGlobal, 'console', vConsole);
// 请先运行:sablejs -i fib.js -o output
vm.run(fs.readFileSync('./output').toString());
vm.destroy();
在浏览器环境中,可以直接在 HTML 文件中引入编译后的代码:
<script src="https://cdn.jsdelivr.net/npm/sablejs@1.0.8/runtime.js"></script>
然后创建一个 VM 实例并运行编译后的代码:
const VM = SableJS.VM;
const vm = new VM();
const vGlobal = vm.getGlobal();
const vConsole = vm.createObject();
const vLog = vm.createFunction('log', function() {
const temp = [];
for (let i = 0; i < arguments.length; i++) {
temp.push(vm.asString(arguments[i]));
}
console.log(...temp);
return vm.createUndefined();
});
vm.setProperty(vConsole, 'log', vLog);
vm.setProperty(vGlobal, 'console', vConsole);
(async () => {
const resp = await fetch('output url'); // 替换为 output 文件的 URL
const data = await resp.text();
vm.run(data);
vm.destroy();
})();
3. 应用案例和最佳实践
沙盒环境
SableJS 可以用于创建沙盒环境,例如在 Figma 插件中执行不受信任的代码。
源代码保护
通过将 JavaScript 源代码编译为操作码,可以保护源代码不被轻易反编译。
4. 典型生态项目
目前尚无特定的生态项目列出,但 SableJS 可以与任何需要安全执行或保护 JavaScript 代码的项目配合使用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考