Autox.js 的两个 JavaScript 引擎 Rhino vs Node.js 运行时对比
一个 App 里跑两个 JS 引擎
Autox.js v7 最重量级的升级,就是在原有的 Rhino 引擎之外,又引入了一个 Node.js 运行时。两个引擎同时可用、互相桥接。理解它们的关系,是写好 v7 脚本的前提。
两个引擎各自是什么
| Rhino | Node.js | |
|---|---|---|
| 来源 | Mozilla 的 Java 实现 JS 引擎 | Google V8 引擎 |
| 模块系统 | 无(v7 部分支持 CommonJS) | CommonJS + ES Module |
| npm 生态 | 有限 | 完整 |
| Android 集成 | 直接(Java 对象可 new 可调用) | 通过桥接层 |
| 适用场景 | 自动化脚本、UI 界面、Android API 调用 | 网络请求、复杂计算、npm 包复用 |
为什么需要两个
Rhino 擅长的:
- 直接
new Intent()、Toast.makeText()——原生 Java/Android API 零成本调用 - 和无障碍服务、悬浮窗、布局分析器紧密集成
- 轻量、启动快、内存小
- E4X 界面系统就建立在 Rhino 之上
Node.js 擅长的:
require()引入 npm 生态的包- 更完整的 Promise/async-await 支持
http、https、ws(WebSocket)等网络模块开箱即用- 文件系统
fs、路径处理path、加密crypto等标准库
怎么区分用哪个
默认 Rhino
脚本默认在 Rhino 引擎里跑。除非你显式写了 "nodejs"; 声明:
// 默认:Rhino 模式
toast("Rhino");
// 声明使用 Node.js 运行时
"nodejs";
console.log("Node.js 模式");
Node 模式示例
"nodejs";
// 引入 npm 包(需要先在项目里 npm install)
let axios = require("axios");
// 发 HTTP 请求
axios.get("https://api.example.com/data")
.then(res => {
console.log("拿到数据:", res.data);
})
.catch(err => {
console.error("请求失败:", err);
});
混合使用
可以在 Rhino 里启动一个 Node 任务,或者反过来。具体桥接 API 取决于你用的版本——v7.2.4 做了较多改进,但仍然在快速迭代中。
ES6+ 语法支持
Rhino v1.8.0(v7 升级后)对 ES6+ 语法的支持大幅改善:
| 语法 | v7 Rhino | 说明 |
|---|---|---|
let / const | ✅ | 块级作用域 |
| 箭头函数 | ✅ | () => {} |
| 解构 | ✅ | let {a, b} = obj |
| 模板字符串 | ✅ | ` hello ${name} ` |
for...of | ✅ | 遍历可迭代对象 |
class | ✅ | ES6 class |
| Promise | ✅ | 原生支持 |
| async/await | ✅ | v7 增强 |
模块 import/export | 部分 | Rhino 原生不支持 ESM,Node 模式完整支持 |
实际开发中你可以放心用这些现代语法——v7 的 Rhino 引擎已经够用。
TypeScript 支持
v7.2.4 宣布引入 TypeScript 支持。这意味着你可以直接写 .ts 文件,Autox.js 内部会调用 TS 编译器转成 JS 再执行。
// my_script.ts
interface User {
name: string;
age: number;
}
function greet(user: User): string {
return `你好,${user.name}!`;
}
const alice: User = { name: "Alice", age: 25 };
toast(greet(alice));
TypeScript 的类型检查在开发阶段(VSCode 扩展)就能帮你发现错误——比写完脚本跑起来才报错好得多。
实战选择建议
| 场景 | 推荐引擎 | 理由 |
|---|---|---|
| 自动化脚本(选择器、图像识别) | Rhino | 直接调用 Android API,零桥接开销 |
| 带 E4X 界面的工具 | Rhino | UI 系统只支持 Rhino |
| 需要 npm 包 | Node.js | Rhino 的模块生态有限 |
| HTTP/WebSocket 请求 | Node.js | 原生支持更好 |
| 复杂计算、数据处理 | 都行 | Node.js 性能略好 |
常见坑
1. Rhino 模式下的 npm 包
Rhino 模式里 require("axios") 不一定行。要么用 Rhino 兼容的 CommonJS 包,要么切到 Node.js 模式。
2. Node 模式下的 Android API
Node 模式不能直接 new Intent()。需要通过桥接层调用——目前桥接 API 还在完善中,具体看版本。简单的 Android 操作建议还是 Rhino 模式。
3. 两套引擎的文件路径
Rhino 的工作目录和 Node.js 不同,用 process.cwd() vs auto.rootFolder 区分。跨引擎写文件要注意路径。
总结
Autox.js v7 的双引擎设计,本质是在"贴近 Android 原生 API"和"开放 JS 生态"之间找平衡点。Rhino 负责手机端的事情,Node.js 负责通用 JS 的事情——写脚本时按需切换,灵活组合。