autojs的nodejs打包成品app經(jīng)驗分享
用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轉(zhuǎn)成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"] }
第三 可以復(fù)制我的 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 是用來控制壓縮變量的名字的, 就是把長長的變量名, 改成短短的變量名; 設(shè)置為 true 才會有效果;
我設(shè)置的是false, 因為設(shè)置為 true 的話, 我用 defineClass 定義的控件類就找不到了
await $java.defineClass(NoScrollViewPager, { packageName: "org.yashu" });
如果你沒有定義控件類的話, 建議設(shè)置為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打包腳本, 就在命令行執(zhí)行
npm run build
生成的代碼就在
dist/bundle.js
第五: 保存bundle.js到手機
如果只有這一個文件的話, 直接按 F1, 輸入autojs, 選擇保存當(dāng)前文件, 打包的時候就打包單文件;
如果你還有其他依賴, 比如圖片, 那么你就要新建一個項目,
把圖片和bundle.js都復(fù)制一份過去, 然后按 F1, 輸入autojs, 選擇保存項目, 打包的時候就打包這個新建的項目.
為什么不打包寫代碼的那個項目呢?
因為我打包總是失敗, 不是這里錯, 就是那里錯.
第六: 打包成app測試
如果打包之后, 直接閃退怎么辦?
你可以給代碼中, 添加更多的日志, 然后保存到文件, 報錯了就去查日志;
我是不想寫很多日志的, 因此我采用的方法是, 專門打包一個app用來測試, 點擊按鈕之后, 就運行bundle.js
ui.執(zhí)行項目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 有別的依賴的話, 注意打印看看工作路徑是否和你預(yù)期的一致:
在bundle.js開頭添加這行代碼, 查看 Node.js 進(jìn)程的當(dāng)前工作目錄
consle.log(process.cwd());
這樣就算bundle.js崩潰了, 我打包的那個app是不會崩潰的, 還可以正常查看日志.
第七: project.json
按 F5 運行的腳本是由 main 字段決定的, 因此我們會修改main字段
"main": "main.js", "main": "dist/bundle.js",
可以增加 type 字段, 那么代碼默認(rèn)用 nodejs 執(zhí)行
"type": "node"
第八: 三個文件
- .autojs.build.ignore 打包的時候, 不打包它里面匹配的文件
- .autojs.source.ignore 它匹配的文件, 不參與加密過程
- .autojs.sync.ignore 同步的時候, 不給手機傳它匹配的文件
第九: 試試autojs的nodejs寫的app
用webpack壓縮后的腳本大小是 423 KB,
打包app的時候, 我選擇的 CPU 架構(gòu)是 arm64-v8a, 也許有的舊手機不能使用, 舊手機 v7 居多.
app下載體驗: ChatGPT安卓版
app功能
- AI 聊天
- AI 根據(jù)文件生成圖片
- AI 修改圖片內(nèi)容
名人名言
思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文檔, autojs文檔, 最后才是群里問問 ---
以上就是autojs的nodejs打包成品app經(jīng)驗分享的詳細(xì)內(nèi)容,更多關(guān)于autojs nodejs打包成app的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
NPM配置私服構(gòu)建內(nèi)網(wǎng)中央倉庫過程詳解
這篇文章主要為大家介紹了NPM配置私服構(gòu)建內(nèi)網(wǎng)中央倉庫過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Node.js net模塊功能及事件監(jiān)聽用法分析
這篇文章主要介紹了Node.js net模塊功能及事件監(jiān)聽用法,結(jié)合實例形式分析了net模塊功能及事件監(jiān)聽相關(guān)操作技巧,需要的朋友可以參考下2019-01-01Node.js用readline模塊實現(xiàn)輸入輸出
在學(xué)C++的時候,有cout和cin,Java也有println和Scanner控件,Node.js也有如同C++和Java的標(biāo)準(zhǔn)輸入,當(dāng)然,是用JavaScript實現(xiàn)的,它就是Readline模塊。下面這篇文章就給大家詳細(xì)介紹一下readline模塊,來實現(xiàn)Node.js的控制臺輸入輸出。有需要的可以參考借鑒。2016-12-12簡單聊一聊Node.js參數(shù)max-old-space-size
簡單的說Node.js就是運行在服務(wù)端的JavaScript,下面這篇文章主要給大家介紹了關(guān)于Node.js參數(shù)max-old-space-size的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01