系统级 API 调用——从 JS 脚本里下载文件、执行命令、打开新窗口
前置条件
要用系统级 API,需要同时满足两个条件:
- 配置页面里的"TauriApi"开关 已勾选
- 调用代码在 JS 注入脚本或打包的网页里运行
否则调用 API 时会报 __TAURI__ is not defined 或 Cannot read property 'invoke' of undefined。
PakePlus 特有的三个 API
除了标准 Tauri2 的 API(@tauri-apps/api/*),PakePlus 还额外暴露了三个常用能力——文档里明确提到的:
downloadFile(下载文件)
从 JS 里触发系统级的文件下载,绕过浏览器下载限制、用系统原生的"保存对话框":
// 伪代码:具体参数格式以 PakePlus 实现为准
window.__TAURI__?.invoke('download_file', {
url: '你的目标地址',
filename: 'big-file.zip',
saveDir: 'downloads', // 可选,默认系统下载目录
});
适用场景:网页里有下载按钮,但浏览器下载受 CORS 或安全策略限制——用 Tauri 的 downloadFile 直接从系统层下载。
executeCommand(执行命令)
在用户电脑上执行任意命令行命令。这是最危险也最强大的 API:
// 伪代码:慎用!
window.__TAURI__?.invoke('execute_command', {
command: 'notepad.exe',
args: ['C:/temp/output.txt'],
});
适用场景:本地工具类应用——比如把生成的结果导出成文件、用系统默认程序打开、调用 Python 脚本做后处理等。
⚠️ 安全警告:executeCommand 几乎等价于"在用户电脑上运行 cmd.exe / bash"。如果你的 JS 代码来源不可信、或者打包的网页本身有恶意脚本——用户电脑可能被完全接管。只在你完全信任代码来源时启用 TauriApi + 使用 executeCommand。
openWindow(打开新窗口)
从一个 PakePlus APP 里打开另一个 PakePlus 项目的窗口,或者打开一个新的 WebView:
// 伪代码
window.__TAURI__?.invoke('open_window', {
url: '你的目标地址',
width: 800,
height: 600,
});
适用场景:一个应用里嵌入多个子应用、标签页导航、或者跨 PakePlus 项目的联动。
标准 Tauri2 API(TauriApi 开关开启后全部可用)
文件系统(plugin-fs)
import { readFile, writeFile, createDir } from '@tauri-apps/plugin-fs';
// 读取本地文件
const content = await readFile('/absolute/path/file.txt', { encoding: 'utf-8' });
// 写入文件
await writeFile('/absolute/path/output.txt', 'Hello Tauri!', { encoding: 'utf-8' });
// 创建目录
await createDir('/absolute/path/new-dir', { recursive: true });
注意:Tauri2 的文件系统访问默认受限于安全目录(如应用数据目录),直接读写 C:/ 或 /etc 可能被拒绝。需要在 Tauri 高级配置里放宽权限(见 核弹级高级配置)。
文件对话框(plugin-dialog)
让用户选文件或目录:
import { open, save } from '@tauri-apps/plugin-dialog';
// 让用户选一个文件
const selected = await open({ multiple: false });
if (selected) {
console.log('用户选了:', selected);
}
// 让用户选保存位置
const savedTo = await save({ defaultPath: 'output.txt' });
HTTP 请求(plugin-http)
绕过浏览器 CORS 发 HTTP 请求:
import { fetch } from '@tauri-apps/plugin-http';
// 从系统层发请求,不受浏览器同源策略限制
const resp = await fetch('你的目标地址', {
method: 'POST',
body: JSON.stringify({ key: 'value' }),
headers: { 'Content-Type': 'application/json' },
});
const json = await resp.json();
窗口控制(api/window)
操作 PakePlus APP 的窗口:
import { getCurrentWindow } from '@tauri-apps/api/window';
const win = getCurrentWindow();
// 最小化
await win.minimize();
// 置顶
await win.setAlwaysOnTop(true);
// 移动位置
await win.setPosition({ x: 100, y: 100 });
// 关闭窗口
await win.close();
事件通信(api/event)
JS ↔ Rust 双向通信:
import { listen, emit } from '@tauri-apps/api/event';
// 监听来自 Rust 的事件
listen('rust-event', (payload) => {
console.log('收到 Rust 发来的数据:', payload);
});
// 发事件给 Rust
emit('js-event', { data: 'Hello from JS' });
什么时候用系统 API
| 场景 | API |
|---|---|
| 下载大文件、绕过浏览器限制 | downloadFile / plugin-http |
| 读写本地配置文件 / 数据 | plugin-fs |
| 让用户选文件导入导出 | plugin-dialog |
| 跨域请求 API 数据 | plugin-http |
| 托盘 / 置顶 / 窗口控制 | api/window |
| 执行本地 Python / Shell 脚本 | executeCommand |
不用系统 API 能做什么
大部分"把网站独立成客户端"的场景不需要开 TauriApi——用过滤元素 + JS 注入 + 窗口设置基本够了。系统级 API 是给"想从浏览器壳变成真正桌面应用"这个级别的需求准备的。