Node.js 作为 Sidecar
在本指南中,我们将打包一个 Node.js 应用程序到一个独立的二进制文件中,以便在 Tauri 应用程序中用作 Sidecar,而无需最终用户安装 Node.js。本示例教程仅适用于桌面操作系统。
我们建议首先阅读通用的 Sidecar 指南,以便更深入地了解 Tauri Sidecar 的工作原理。
在本例中,我们将创建一个 Node.js 应用程序,该程序从命令行 process.argv 读取输入,并使用 console.log 将输出写入 stdout。
您可以利用其他进程间通信系统,例如 localhost 服务器、stdin/stdout 或本地套接字。请注意,每种系统都有其自身的优点、缺点和安全问题。
先决条件
一个已使用 shell 插件设置好的现有 Tauri 应用程序,可以在本地编译和运行。
指南
-
让我们创建一个新的 Node.js 项目来包含我们的 Sidecar 实现。在您的 Tauri 应用程序根文件夹中创建一个新目录(在本例中,我们将其命名为
sidecar-app
),并在目录内运行您首选的 Node.js 包管理器的init
命令npm inityarn initpnpm init我们将使用 pkg 将我们的 Node.js 应用程序编译为自包含的二进制文件。让我们将其安装为开发依赖项
npm add @yao-pkg/pkg --save-devyarn add @yao-pkg/pkg --devpnpm add @yao-pkg/pkg --save-dev -
编写 Sidecar 逻辑
现在我们可以开始编写将由我们的 Tauri 应用程序执行的 JavaScript 代码。
在本例中,我们将处理来自命令行参数的命令并将输出写入 stdout,这意味着我们的进程将是短期的,并且一次只处理一个命令。如果您的应用程序必须长期运行,请考虑使用其他进程间通信系统。
让我们在我们的
sidecar-app
目录中创建一个index.js
文件,并编写一个基本的 Node.js 应用程序sidecar-app/index.js const command = process.argv[2];switch (command) {case 'ping':const message = process.argv[3];console.log(`pong, ${message}`);break;default:console.error(`unknown command ${command}`);process.exit(1);} -
要将我们的 Node.js 应用程序打包为自包含的二进制文件,我们可以运行以下
pkg
命令npm run pkg -- --output appyarn pkg --output apppnpm pkg --output app这将在 Linux 和 macOS 上创建
sidecar-app/app
二进制文件,并在 Windows 上创建sidecar-app/app.exe
可执行文件。要将此文件重命名为预期的 Tauri Sidecar 文件名,我们可以使用以下 Node.js 脚本import { execSync } from 'child_process';import fs from 'fs';const ext = process.platform === 'win32' ? '.exe' : '';const rustInfo = execSync('rustc -vV');const targetTriple = /host: (\S+)/g.exec(rustInfo)[1];if (!targetTriple) {console.error('Failed to determine platform target triple');}fs.renameSync(`app${ext}`,`../src-tauri/binaries/app-${targetTriple}${ext}`); -
在 Tauri 应用程序中配置 Sidecar
现在我们已经准备好 Node.js 应用程序,我们可以通过配置
bundle > externalBin
数组将其连接到我们的 Tauri 应用程序src-tauri/tauri.conf.json {"bundle": {"externalBin": ["binaries/app"]}}只要 Sidecar 二进制文件以
src-tauri/binaries/app-<target-triple>
形式存在,Tauri CLI 就会处理 Sidecar 二进制文件的捆绑。 -
我们可以从 Rust 代码或直接从 JavaScript 运行 Sidecar 二进制文件。
让我们直接在 Node.js Sidecar 中执行
ping
命令import { Command } from '@tauri-apps/plugin-shell';const message = 'Tauri';const command = Command.sidecar('binaries/app', ['ping', message]);const output = await command.execute();const response = output.stdout;让我们将
ping
Tauri 命令管道传输到 Node.js Sidecar#[tauri::command]async fn ping(app: tauri::AppHandle, message: String) -> String {let sidecar_command = app.shell().sidecar("app").unwrap().arg("ping").arg(message);let output = sidecar_command.output().unwrap();let response = String::from_utf8(output.stdout).unwrap();response}
© 2025 Tauri 贡献者。CC-BY / MIT