牙叔教程 简略易懂
用nodejs写脚本, 下面这九步你都要做
第一: vscode安装插件 ESLint
为什么要安装eslint?
由于 eslint 能够帮助你找到代码中的各种bug, 尤其是像autojs这种写脚本的, java和nodejs混合写的代码,
指不定那个类没有写全类名, 只写了类名, 打包以后就会报错, 或许闪退
安装eslint依靠
npm i -D babel-loader @babel/core @babel/preset-env
根目录添加 eslint 装备文件 .eslintrc.json , 看清楚, 文件名最前面有英文句号
{
"env": {
"browser": true,
"commonjs": true,
"es2021": true,
"node": true
},
"extends": "eslint:recommended",
"overrides": [],
"parserOptions": {
"ecmaVersion": "latest"
},
"globals": {
"android": "readonly",
"com": "readonly",
"$autojs": "readonly",
"androidx": "readonly"
}
}
根目录添加 eslint 忽略检查某些文件, 文件名是: .eslintignore
dist/bundle.js
第二: 使用 babel 把es6转成es5
webpack.config.js 添加 babel 装备
module: {
rules: [
{
test: /.js$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: ["@babel/preset-env"],
},
},
},
],
},
根目录添加文件 .babelrc, 看清楚, 前面有点号
{
"presets": ["@babel/preset-env"]
}
第三 能够复制我的 webpack 装备文件
webpack.config.js
const webpack = require("webpack");
const TerserWebpackPlugin = require("terser-webpack-plugin");
module.exports = {
mode: "production",
entry: "./main.js",
output: {
filename: "bundle.js",
},
target: "node",
externals: {
ui: "commonjs ui",
rhino: "commonjs rhino",
lang: "commonjs lang",
toast: "commonjs toast",
datastore: "commonjs datastore",
axios: "commonjs axios",
app: "commonjs app",
color: "commonjs color",
image: "commonjs image",
device: "commonjs device",
clip_manager: "commonjs clip_manager",
},
module: {
rules: [
{
test: /.js$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: ["@babel/preset-env"],
},
},
},
],
},
plugins: [
new webpack.DefinePlugin({
android: "android",
java: "java",
$java: "$java",
$autojs: "$autojs",
}),
],
optimization: {
minimize: true,
minimizer: [
new TerserWebpackPlugin({
extractComments: false,
test: /.js(?.*)?$/i,
terserOptions: {
output: {
preamble: '"nodejs ui";',
},
toplevel: true,
mangle: false,
},
}),
],
},
};
在 optimization 这个字段中, 有一个 mangle 是用来控制紧缩变量的姓名的, 便是把长长的变量名, 改成短短的变量名; 设置为 true 才会有效果;
我设置的是false, 由于设置为 true 的话, 我用 defineClass 界说的控件类就找不到了
await $java.defineClass(NoScrollViewPager, { packageName: "org.yashu" });
假如你没有界说控件类的话, 建议设置为true
还有一个字段是
preamble: '"nodejs ui";',
这个字段的作用是, 在bundle.js的文件头第一行, 添加 nodejs ui;
第四: package.json 添加 build 指令
"scripts": {
"build": "webpack --config webpack.config.js"
},
假如你没装 webpack, 那就先安装 webpack
npm install webpack webpack-cli --save-dev
用webpack打包脚本, 就在指令行履行
npm run build
生成的代码就在
dist/bundle.js
第五: 保存bundle.js到手机
假如只有这一个文件的话, 直接按 F1, 输入autojs, 挑选保存当前文件, 打包的时候就打包单文件;
假如你还有其他依靠, 比如图片, 那么你就要新建一个项目,
把图片和bundle.js都复制一份过去, 然后按 F1, 输入autojs, 挑选保存项目, 打包的时候就打包这个新建的项目.
为什么不打包写代码的那个项目呢?
由于我打包总是失败, 不是这儿错, 便是那里错.
第六: 打包成app测验
假如打包之后, 直接闪退怎么办?
你能够给代码中, 添加更多的日志, 然后保存到文件, 报错了就去查日志;
我是不想写很多日志的, 因而我选用的方法是, 专门打包一个app用来测验, 点击按钮之后, 就运转bundle.js
ui.履行项目nodejs.click(function () {
let filePath = ui.项目入口文件途径nodejs.text().trim();
let workingDirectory = getParentPath(filePath);
console.log("workingDirectory =");
console.log(workingDirectory);
const execution = $engines.execScriptFile(filePath, {
arguments: {
serverEngineId: $engines.myEngine().id,
},
workingDirectory: workingDirectory
});
nodejsExecutions.push(execution);
});
假如你的 bundle.js 有别的依靠的话, 注意打印看看工作途径是否和你预期的共同:
在bundle.js最初添加这行代码, 检查 Node.js 进程的当前工作目录
consle.log(process.cwd());
这样就算bundle.js溃散了, 我打包的那个app是不会溃散的, 还能够正常检查日志.
第七: project.json
按 F5 运转的脚本是由 main 字段决议的, 因而咱们会修正main字段
"main": "main.js",
"main": "dist/bundle.js",
能够添加 type 字段, 那么代码默认用 nodejs 履行
"type": "node"
第八: 三个文件
- .autojs.build.ignore 打包的时候, 不打包它里边匹配的文件
- .autojs.source.ignore 它匹配的文件, 不参加加密过程
- .autojs.sync.ignore 同步的时候, 不给手机传它匹配的文件
第九: 试试autojs的nodejs写的app
用webpack紧缩后的脚本大小是 423 KB,
打包app的时候, 我挑选的 CPU 架构是 arm64-v8a, 也许有的旧手机不能使用, 旧手机 v7 居多.
app下载体验: ChatGPT安卓版
app功用
-
AI 聊天
-
AI 依据文件生成图片
-
AI 修正图片内容
名人名言
思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问 — 牙叔教程
声明
部分内容来自网络 本教程仅用于学习, 制止用于其他用处