PakePlus 中文文档 下载 App

系统级 API 调用——从 JS 脚本里下载文件、执行命令、打开新窗口

前置条件

要用系统级 API,需要同时满足两个条件:

  1. 配置页面里的"TauriApi"开关 已勾选
  2. 调用代码在 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 是给"想从浏览器壳变成真正桌面应用"这个级别的需求准备的。