在编写自动化脚本时,随着业务逻辑日趋复杂,将不同功能封装到独立的JS脚本中、实现模块化编程,已成为提升代码可维护性和复用性的关键手段。冰狐智能辅助平台为开发者提供了三种原生API来实现脚本之间的导入与调用,分别是import静态导入、callScript同步调用和runTask异步执行。本文将深入剖析这三种方法的使用方式、适用场景及注意事项。
一、import:静态导入,实现脚本的模块化复用
import是冰狐JS中实现静态脚本导入的核心语句,用于在当前脚本中引入其他脚本的全部逻辑与方法。被导入的脚本会在当前脚本执行前完成加载,适用于基础工具脚本的复用,如通用的时间格式化、设备判断、操作封装等场景。
1.1 语法与使用方式
冰狐JS的import语句语法非常简洁,无需复杂的模块导出机制,直接通过脚本路径或脚本名引入即可:
import '脚本路径/脚本名';
被导入的脚本中,所有通过var声明的变量和自定义函数,均可在当前脚本中直接使用。需要注意的是,若被导入的脚本包含main函数,该函数不会自动执行,需要手动调用,这一设计避免了导入时的逻辑冲突。
1.2 三种导入源
冰狐JS的import语句支持三种导入源,覆盖了线上、本地和APK资源三大场景:
(1)导入在线脚本
在线脚本指存储在冰狐智能辅助云端的脚本,只需通过脚本名即可导入,无需关注物理路径。这是团队协作中最常用的方式:
import 'test.js';
(2)导入APK资源中的脚本
在打包APK时,可以将多个JS文件添加到APK资源中,后续通过asset:前缀进行导入:
import 'asset:test.js';
(3)导入手机本地存储中的脚本
支持导入手机本地文件系统中的JS文件,使用绝对路径或相对路径均可:
import '/sdcard/test.js';
1.3 使用示例
假设有一个工具脚本test.js,其中定义了通用函数:
// test.js文件 function fun1() { console.log('func1'); }在主脚本中通过import导入后,即可直接调用fun1函数:
import 'test.js'; function main() { console.log('main'); fun1(); // 直接调用test.js中的函数 }二、callScript:动态同步调用,轻量级脚本执行
callScript是冰狐平台提供的动态调用函数,用于在当前脚本中执行其他JS脚本的main函数,其返回值为目标脚本的返回值。
2.1 核心特性
callScript不会创建独立的线程,直接在调用者的当前线程中同步执行。这一特性决定了它的适用场景:不能在UI代码中使用,否则可能导致界面无响应。在UI中执行耗时任务应使用runTask。
2.2 支持的脚本源
与import一样,callScript同样支持三种脚本源:
function main() { // 在线脚本 callScript('test.js'); // APK资源中的脚本 callScript('asset:test.js'); // 手机本地存储中的脚本 callScript('/sdcard/test.js'); }2.3 参数传递与返回值
callScript支持向目标脚本传递任意数量的参数,这些参数会直接透传给目标脚本的main函数:
// 调用脚本并传递参数 callScript('asset:test.js', 12, 'abc');目标脚本通过main函数的参数接收:
// test.js文件 function main(id, name) { console.log('id:' + id + ' name:' + name); // 输出:id:12 name:abc }callScript的返回值即为目标脚本main函数的返回值,这使得开发者可以在调用后获取执行结果,用于后续的逻辑判断。
2.4 典型应用场景
callScript适合轻量级的同步调用场景,例如在脚本中调用另一个脚本完成某个独立的子任务,并获取其返回结果。在实际项目中,可以将不同手机品牌的适配逻辑封装为独立脚本,通过callScript动态调用:
callScript(getManufacturer() + '_install_app');
这样在小米手机上会自动执行Xiaomi_install_app脚本,在华为手机上执行Huawei_install_app脚本,实现优雅的设备适配。
三、runTask:异步执行,UI场景的专用方案
runTask是冰狐平台专门用于在UI代码中执行脚本的函数,调用时会另外开启一个独立线程来执行目标脚本。
3.1 与callScript的核心区别
runTask与callScript最大的区别在于线程模型:
callScript:在当前线程中同步执行,会阻塞调用者runTask:开启新线程异步执行,不阻塞调用者
因此,若在非UI代码中调用脚本,应使用callScript;在UI代码中执行可能耗时的脚本任务,必须使用runTask以避免界面卡顿。
3.2 使用方式
runTask的语法与callScript完全一致,同样支持三种脚本源和参数传递:
// 在线脚本 runTask('test'); // 手机本地绝对路径 runTask('/sdcard/test.js'); // 手机本地相对路径 runTask('test.js'); // APK资源中的脚本,带参数 runTask('asset:test.js', 12, 'abc');目标脚本的写法与callScript相同,通过main函数接收参数。
3.3 适用场景
runTask多用于自定义UI任务中执行后台脚本。当用户在UI界面点击一个按钮触发自动化任务时,应当使用runTask在新线程中执行,确保UI界面保持流畅响应。若直接在UI线程中使用callScript执行耗时操作,手机系统可能会频频提示"无响应"。
四、实践建议与总结
在实际开发中,合理选择脚本调用方式至关重要。以下是几点实践建议:
1. 模块化优先使用import。对于通用的工具函数库、常量定义等基础模块,使用import静态导入是最佳选择。它在一开始就完成加载,调用时无需额外开销,代码结构清晰,便于维护。
2. 动态调用首选callScript。当需要在运行时根据条件决定调用哪个脚本、或者需要获取被调用脚本的返回值时,使用callScript。但切记不要在UI代码中使用。
3. UI场景必须用runTask。凡是涉及用户界面交互、且需要执行脚本的场景,一律使用runTask开启新线程执行,避免UI阻塞。
4. 注意脚本命名与路径规范。在线脚本直接使用脚本名;APK资源中的脚本使用asset:前缀;本地文件使用绝对路径或相对路径。
5. 理解main函数的入口角色。所有冰狐JS脚本均以main函数为默认入口,外部调用脚本时本质是执行目标脚本的main函数。main函数的返回值即为脚本的执行返回值,且支持为main函数设置参数。
冰狐智能辅助平台通过import、callScript和runTask三种原生API,为开发者提供了从静态导入到动态调用、从同步执行到异步执行的完整脚本复用方案。掌握这三种方法的特性与适用场景,是编写高质量、可维护的自动化脚本的基础。