如何从第一代API迁移过来
如果你对第一代API已比较熟悉,本文将引导你如何从第一代API迁移到第二代API。如果你想了解两代API的优缺点。参考第二代api和第一代的区别。
启用第二代API与Node.js引擎
为了向前兼容,Pro 9中的代码仍然默认为旧的Rhino引擎/第一代API运行。要使用第二代API需要特别标识,参考用Node.js引擎运行代码。
从全局变量函数改为导入模块
在第二代API中,所有模块都需要导入才能使用。在第一代API中的全局变量,比如app, images模块,在第二代API中都需要导入后使用,比如:
// 第一代API
app.viewFile(...)
// 第二代API
const app = require('app');
app.viewFile(...)
// 也可以这样只导入需要的函数
const { viewFile } = require('app');
viewFile(...)
第一代API中的全局变量、函数大多数也不能直接使用,比如sleep
, log
, toast
:
// 第一代API
sleep(1000)
log(context.getPackageName())
toast('')
// 第二代API
const { delay } = require('lang');
const { showToast } = require('toast')
async function main() {
await delay(1000);
const context = $autojs.androidContext;
console.log(context.getPackageName());
showToast('Hello');
}
main();
模块与函数对照表
在第二代API中,一部分模块的名称和第一代相似,比如app, color;一部分模块的功能则迁移到其他模块;一部分模块则由Node.js自带模块代替,比如files模块由Node.js的fs和path模块代替;一部分模块则由第三方npm模块代替,这些模块往往更加完善,比如WebSocket由ws模块代替。
以下是各个第一代API模块在第二代API中的对照或代替。需要注意即使模块名字一样,API设计也可能有所不同。比如在第一代API中获取屏幕宽度是device.width
,在第二代API中则是device.screenWdith
。
- app模块
在第二代API中使用app模块。
- base64模块
在第二代API中使用Buffer代替,比如字符串转换base64:Buffer.from('autojs', 'utf8').toString('base64')
,base64转换为字符串:Buffer.from('YXV0b2pz', 'base64').toString('utf8')
。
- colors模块
在第二代API中使用color模块。
- canvas
UI界面中的canvas与旧版canvas类似。暂不支持无Ui界面下使用Canvas。
- console模块
对于console.log
等函数直接使用即可,无需迁移。设置日志路径等额外参数参考Console。
另外,print
,log
等函数需要使用console.log
代替,不能简写。比如log('hello')
需要替换为console.log('hello')
。
- crypto模块
在第二代API中使用Node.js模块crypto。
- debug模块
在第二代API中暂无代替。
- device模块
在第二代API中使用device模块。
- dialogs模块
在第二代API中使用dialogs模块。
- engines模块
在第二代API中使用engines模块。
- events模块
第一代API中events模块的事件在第二代API对应如下:
exit
: 用process.on('exit', () => {})
代替
- floaty模块
在第二代API中使用floating_window模块。
- files模块
globals全局函数与变量
sleep
使用lang模块中的delay
函数代替,比如await delay(1000)
toast
,toastLog
在toast模块中,比如showToast('hello', {log: true})
,showToast('hello', {log: true})
exit
使用Node.js函数process.exit()
代替random
使用Math.random
代替,比如:
"nodejs"; function random(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; } console.log(random(10, 30));
http模块
推荐使用内置的axios模块代替,功能比http模块强大得多。
- media
在第二代API中使用media模块。
- plugins
在第二代API中使用plugins模块。
- power_manager
在第二代API中使用power_manager模块。
- sensors
在第二代API中使用sensors模块。
- shell
在第二代API中使用shell模块。
- storages
在第二代API中使用datastore模块。
- settings
在第二代API中使用settings模块。
- threads
参考多线程与异步。
- timers
在第二代API中使用timers模块。实际上setTimeout
, setInterval
等全局函数在第二代API中也可直接使用。
- work_manager
在第二代API中使用work_manager模块。
- ui
在第二代API中使用ui模块。UI模块由于有较大的API差别。参考UI界面代码迁移。
- util
在第二代API中使用Node.js模块util
- WebSocket
使用npm模块ws代替。ws模块比第一代API模块中的WebSocket功能更完整、更强大。
- zip
在第二代API中使用zip模块。
异步与Promise
理解异步与Promise是使用第二代API最关键的一步,也是第二代API比第一代门槛高的原因之一。这里我们将简单介绍它们,你可以结合其他网络资料、教学视频等更深入地理解。
(未完待续)