用txiki.js将js宏打包成exe

wils
wils Lv.4 核心创作者

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同目录,执行就行,非常方便

当然,一定做好测试,上面的代码很粗陋,完全没有容错的步骤,只是做个例子

海南省
浏览 92
1
8
分享
8 +1
4
1 +1
全部评论 4
 
懒得批爆
懒得批爆 WPS资深用户WPS产品体验官WPS寻令官Lv.2 潜力创作者

Lv.2潜力创作者

感觉像是系统后台处理数据的过程,一直使用的是系统前端, 现在觉得后台人员好腻害的感觉
   四川省
举报
0
3
wils
wilsLv.4 核心创作者

Lv.4 核心创作者

“知道茴字的四种写法嘛” 大概就是这种区别吧,已经没啥意义了
· 海南省
举报
0
0