用txiki.js将js宏打包成exe
wils
Lv.4 核心创作者
论坛里曾有这样的需求,就是写了个js宏处理csv,且不需要与表格互动
但每次执行js,都需要先打开表格,再执行宏,就想知道能否将js单独打包出来执行
比如,有个sqlite数据库a.db,里面有一张表test,有id,name两个字段,id是int 主键,name是text。
现在每天会产生一个a.csv,里面是1,张三 2,李四这样的数据,现在需要写个脚本每天以“id不存在就新建,id存在就更新”的方式,用csv更新db
直接告诉灵犀:
a.db里有一张表test,有id,name两个字段,id是int 主键,name是text。以新建或更新的方式,用a.csv更新a.db(在此之前有几轮对话,让灵犀学习tjs:sqlite的写法,且说了db是sqlite数据库等基本情况)
直接得到tjs可用的脚本:
import { Database } from 'tjs:sqlite';
const db = new Database('a.db');
// 读取 a.csv(每行: id,name)
const csv = await tjs.readFile('a.csv');
const text = new TextDecoder().decode(csv);
db.exec('BEGIN');
const upsert = db.prepare(`
INSERT INTO test (id, name) VALUES (?, ?)
ON CONFLICT(id) DO UPDATE SET name = excluded.name
`);
for (const line of text.split('\n')) {
const s = line.trim();
if (!s) continue;
const [id, name] = s.split(',');
upsert.run(Number(id), name);
}
db.exec('COMMIT');
console.log(JSON.stringify(db.prepare('SELECT * FROM test ORDER BY id').all()));
db.close();测试了一下,直接可用
然后执行tjs app init
会创建个app目录
用上面的脚本替换app/src/main.js
再执行tjs app compile
就得到一个5M左右的app.exe
以后只要运行这个exe,就会用每次不同的a.csv更新a.db
这个5M的exe里,自带比js宏更完整的环境,比如fetch,有TextDecoder、FormData等web api
还内置sqlite(感觉这一点就值回票价)、ffi、websocket等等
随便发给朋友,只要把exe放到csv和db同目录,执行就行,非常方便
当然,一定做好测试,上面的代码很粗陋,完全没有容错的步骤,只是做个例子
Lv.2潜力创作者
Lv.4 核心创作者