数据存储
脚本数据的存放位置与保留时长。
每个项目有三个目录,脚本可以用 fs 和 node:sqlite 读写。它们的区别在于数据保留多久:
| 目录 | 路径 | 保留时长 | 同步 |
|---|---|---|---|
| 持久化数据 | os.homedir()(process.env.HOME) | 一直保留,删除项目时一并删除 | 跟随项目:开启 iCloud 同步时保存在 iCloud 云盘 |
| 临时目录 | os.tmpdir()(process.env.TMPDIR) | 跨运行保留,存储空间不足时可能被系统清理,删除项目时一并删除 | 只在本机 |
| 构建目录 | process.cwd() | 每次运行前清空 | — |
相对路径以 process.cwd() 为基准,因此用相对路径写入的文件在下次运行时就没有了。
持久化数据
用 fs 写入 os.homedir() 下的文件、在其中用 node:sqlite 创建的数据库会跨运行保留,App、小组件和 Action 访问的是同一份数据。
import { DatabaseSync } from 'node:sqlite';
import os from 'node:os';
import { join } from 'node:path';
const db = new DatabaseSync(join(os.homedir(), 'app.db'));- 每个项目有自己的数据目录,避免脚本之间互相覆盖文件。这只是默认位置,不是安全边界:脚本按受信任代码运行,可以访问 App 能访问的任意路径。
- 数据和项目存放在一起:开启 iCloud 同步时保存在 iCloud 云盘中,更改同步方式时随项目一起迁移;删除项目时一并删除。
- iCloud 按文件同步,而不是按数据库事务同步。请避免在多台设备上同时写入同一个 SQLite 数据库,否则改动可能发生冲突。
临时数据
os.tmpdir() 适合存放可以重新生成的缓存,例如下载的图片。它只保存在本机,不会同步到 iCloud。
How is this guide?
最后更新于