回答
你可以采用“配置层 - 工具层 - 业务逻辑层 - 入口/UI层”的架构来实现脚本的分层设计。这种结构能有效解耦代码,提升可维护性、复用性和调试效率。以下是具体实现方案:
1. 目录结构规划
将脚本拆分为多个独立文件,放在同一目录下:
my-script/
├── config.js // 配置层:常量、参数、开关
├── utils.js // 工具层:通用函数(日志、等待、控件操作封装等)
├── logic.js // 业务逻辑层:核心自动化流程
└── main.js // 入口层:UI绑定或脚本启动入口
2. 各层职责与代码示例
注意:Hamibot 使用 Rhino 1.7.15 引擎,需避免箭头函数和默认参数。以下代码均符合该引擎规范。
配置层 (config.js)
// 文档地址 https://docs.hamibot.com/
var Config = {
APP_PACKAGE: 'com.example.app',
MAX_RETRY: 3,
DELAY_MS: 1000,
DEBUG_MODE: true
};
module.exports = Config;
工具层 (utils.js)
// 文档地址 https://docs.hamibot.com/
var Config = require('./config.js');
var Utils = {
log: function(msg) {
if (Config.DEBUG_MODE) {
console.log('[DEBUG] ' + msg);
}
},
safeClick: function(selector, timeout) {
var waitTime = timeout || 2000;
var target = selector.findOne(waitTime);
if (target) {
target.click();
return true;
}
return false;
},
sleep: function(ms) {
java.lang.Thread.sleep(ms);
}
};
module.exports = Utils;
业务逻辑层 (logic.js)
// 文档地址 https://docs.hamibot.com/
var Config = require('./config.js');
var Utils = require('./utils.js');
var Logic = {
runTask: function() {
Utils.log('开始执行任务');
launchApp(Config.APP_PACKAGE);
Utils.sleep(Config.DELAY_MS);
var success = Utils.safeClick(text('确认'));
if (!success) {
Utils.log('未找到确认按钮');
}
Utils.log('任务执行完毕');
}
};
module.exports = Logic;
入口/UI层 (main.js)
// 文档地址 https://docs.hamibot.com/
'ui';
var Logic = require('./logic.js');
ui.layout(
<vertical padding="16">
<button id="startBtn" text="开始运行" />
<button id="stopBtn" text="停止脚本" />
</vertical>
);
ui.startBtn.on('click', function() {
threads.start(function() {
Logic.runTask();
});
});
ui.stopBtn.on('click', function() {
engines.stopAll();
toast('已停止');
});
3. 分层设计最佳实践
- 严格单向依赖:入口层调用业务层,业务层调用工具层/配置层。禁止反向依赖或循环依赖,避免模块加载失败。
- UI 与逻辑彻底解耦:UI 仅负责参数收集、按钮事件绑定和状态展示。所有耗时操作和自动化流程必须放在业务层,并通过
threads.start()在子线程执行,防止阻塞 UI 线程导致界面无响应。 - 模块化加载规范:Hamibot 支持 CommonJS 规范的
require()和module.exports。确保所有脚本文件位于同一项目目录,使用相对路径(如./config.js)引入。 - 异常隔离与重试:在业务层的关键步骤使用
try...catch捕获异常,结合配置层的重试参数实现容错,避免单点故障导致整个脚本崩溃。 - 配置外置:将易变参数(如应用包名、延迟时间、阈值)统一抽离到配置层。后续可直接对接 Hamibot 的脚本配置面板,无需修改核心代码。
按照此结构编写脚本,你在后续迭代、多设备适配或上传至 Hamibot 云端运行时,都能保持代码清晰且稳定。如需了解 threads 多线程调度或 Hamibot 配置面板的对接方法,可以继续提问。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实
分层模块化后的脚本需要通过 ZIP 压缩包的形式上传至 Hamibot。云端运行环境会自动解压并按 require() 依赖关系加载模块。具体操作与规范如下:
1. 打包规范
- 扁平化目录:将所有
.js文件放在同一层级。压缩时直接选中所有文件右键压缩,不要包含外层文件夹,确保 ZIP 根目录直接是脚本文件。 - 入口文件:必须保留一个明确的启动文件(通常命名为
main.js)。若使用 UI 模式,该文件首行必须保留'ui';。 - 引用路径:模块间调用必须使用相对路径且携带
.js后缀,例如require('./config.js')。禁止使用绝对路径或省略后缀。 - 清理冗余:ZIP 内仅保留
.js文件,移除.git、.md、图片、日志、node_modules等无关内容,避免体积超限或解析异常。
2. 上传步骤
- 在本地将整理好的脚本文件压缩为
.zip格式。 - 登录 Hamibot 控制台,进入“我的脚本”页面。
- 点击“上传脚本”,选择生成的 ZIP 文件。
- 上传完成后,在脚本详情页的“运行配置”中,确认“入口文件”已正确指向
main.js(系统通常会自动识别,若未识别可手动填写)。 - 保存配置,即可在设备列表中分配机器人进行云端部署或手动运行。
3. 关键注意事项
- 本地完整验证:上传前务必在本地 Hamibot App 中运行一次入口文件。可通过
engines.execScriptFile('./main.js')模拟云端加载流程,确保所有模块路径解析正常、无循环依赖。 - Rhino 引擎兼容:所有模块文件均需遵循 Rhino 1.7.15 语法规范。禁止使用箭头函数、函数默认参数等未完全兼容的 ES6+ 特性,建议统一使用
var声明变量,否则云端执行会直接抛出语法错误。 - 工作目录机制:云端解压后,脚本的工作目录即为 ZIP 根目录。
engines.myEngine().cwd()返回的路径与本地测试一致,相对路径引用可无缝迁移。 - 配置面板联动:若需通过 Hamibot 控制台动态下发参数,可在入口层或配置层使用
hamibot.env读取变量,并在控制台的“脚本配置”中定义对应字段,实现配置外置与云端管控。
按照上述规范打包上传,你的分层脚本即可在 Hamibot 云端稳定运行。如遇模块加载失败或路径报错,优先检查 ZIP 内部层级是否与 require() 路径完全匹配。需要进一步了解控制台配置面板的字段定义或云端日志排查方法,可随时告诉我。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实