2 把 Node.js 用作 Sidecar

原文链接: https://tauri.app/learn/sidecar-nodejs/

在本指南中,我们将把一个 Node.js 应用打包成自包含的二进制文件,作为 Tauri 应用中的 sidecar 使用,而无需终端用户安装 Node.js。 本示例教程只适用于桌面操作系统。

为了更深入地理解 Tauri sidecar 的工作方式,我们建议先阅读通用的 sidecar 指南。

目标

  • 把一个 Node.js 应用打包成二进制文件。
  • 把这个二进制文件集成为 Tauri sidecar。

实现细节

  • 为此我们使用 pkg 工具,但任何能把 JavaScript 或 TypeScript 编译成二进制应用的工具都可以。
  • 你也可以把 Node 运行时本身嵌入 Tauri 应用,并以资源的形式附带打包后的 JavaScript,但这样会以可读性较高的文件形式附带 JavaScript 内容,而且运行时通常比用 pkg 打包的应用更大。

在这个示例中,我们将创建一个 Node.js 应用,它从命令行 process.argv 读取输入,并用 console.log 把输出写到 stdout。
你也可以利用其它进程间通信方式,例如 localhost 服务器、stdin/stdout 或本地 socket。 注意它们各有自己的优点、缺点和安全考量。

前置条件

一个已经配置好 shell 插件、能在本地编译并运行的 Tauri 应用。

指南

1. 初始化 Sidecar 项目

让我们创建一个新的 Node.js 项目来存放 sidecar 实现。 在你的 Tauri 应用根文件夹中创建一个新目录(本示例中我们叫它 sidecar-app),并在该目录中运行你所偏好的 Node.js 包管理器的 init 命令:

包管理器

1
npm init
1
yarn init
1
pnpm init
我们将用 pkg 等方案把 Node.js 应用编译成自包含的二进制文件。 先把它作为开发依赖安装到新建的 sidecar-app 中:

包管理器

1
npm add @yao-pkg/pkg --save-dev
1
yarn add @yao-pkg/pkg --dev
1
pnpm add @yao-pkg/pkg --save-dev

2. 编写 Sidecar 逻辑

现在我们可以开始编写将由 Tauri 应用执行的 JavaScript 代码了。

在这个示例中,我们会处理来自命令行参数的一个命令并把输出写到 stdout, 这意味着我们的进程是短生命周期的,一次只处理一个命令。 如果你的应用必须长期运行,请考虑使用其它进程间通信方式。

让我们在 sidecar-app 目录中创建 index.js 文件,写一个基础的 Node.js 应用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

switch (command) {
  case 'hello':
    const message = process.argv[3];
    console.log(`Hello ${message}!`);
    break;
  default:
    console.error(`unknown command ${command}`);
    process.exit(1);
}

3. 打包 Sidecar

要把 Node.js 应用打包成自包含的二进制文件,请在 package.json 中创建一个脚本:

1
2
3
4
5
{
  "scripts": {
    "build": "pkg index.ts --output my-sidecar"
  }
}

包管理器

1
npm run build
1
yarn build
1
pnpm build
这会在 Linux 和 macOS 上生成 sidecar-app/my-sidecar 二进制文件,在 Windows 上生成 sidecar-app/my-sidecar.exe 可执行文件。

对于 sidecar 应用,我们需要确保二进制文件按正确的模式命名,更多信息请阅读嵌入外部二进制文件。 要把这个文件重命名为 Tauri 期望的 sidecar 文件名并移动到我们的 Tauri 项目中,可以把下面的 Node.js 脚本作为起点:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import { execSync } from 'child_process';
import fs from 'fs';

const ext = process.platform === 'win32' ? '.exe' : '';

const targetTriple = execSync('rustc --print host-tuple').toString().trim();
if (!targetTriple) {
  console.error('Failed to determine platform target triple');
}
// TODO:创建 `src-tauri/binaries` 目录
fs.renameSync(
  `my-sidecar${ext}`,
  `../src-tauri/binaries/my-sidecar-${targetTriple}${ext}`
);

然后在 sidecar-app 目录中运行 node rename.js。

到这一步,/src-tauri/binaries 目录中应当包含重命名后的 sidecar 二进制文件。

4. 设置 plugin-shell 权限

安装 shell 插件之后,请确保配置好所需的能力。

注意我们使用了 "args": true,但你也可以选择提供一个数组 ["hello"],更多内容见此。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  "permissions": [
    "core:default",
    "opener:default",
    {
      "identifier": "shell:allow-execute",
      "allow": [
        {
          "args": true,
          "name": "binaries/my-sidecar",
          "sidecar": true
        }
      ]
    }
  ]
}

5. 在 Tauri 应用中配置 Sidecar

现在 Node.js 应用已经准备好了,我们可以通过配置 bundle > externalBin 数组把它接到 Tauri 应用上:

1
2
3
4
5
{
  "bundle": {
    "externalBin": ["binaries/my-sidecar"]
  }
}

只要 sidecar 二进制文件以 src-tauri/binaries/my-sidecar-<target-triple> 的形式存在,Tauri CLI 就会负责它的打包。

6. 执行 Sidecar

我们既可以从 Rust 代码运行 sidecar 二进制文件,也可以直接从 JavaScript 运行。

语言

让我们直接在 Node.js sidecar 中执行 hello 命令:

1
2
3
4
5
6
7
8
import { Command } from '@tauri-apps/plugin-shell';

const message = 'Tauri';

const command = Command.sidecar('binaries/my-sidecar', ['hello', message]);
const output = await command.execute();
// 一切配置正确后,浏览器控制台应当打印 "Hello Tauri"。
console.log(output.stdout)

让我们把一个 hello Tauri 命令管道接到 Node.js sidecar 上:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

#[tauri::command]
async fn hello(app: tauri::AppHandle, cmd: String, message: String) -> String {
    let sidecar_command = app
        .shell()
        .sidecar("my-sidecar")
        .unwrap()
        .arg(cmd)
        .arg(message);
    let output = sidecar_command.output().await.unwrap();
    String::from_utf8(output.stdout).unwrap()
}

在 invoke_handler 中注册它,并在前端这样调用:

1
2
3
4
import { invoke } from "@tauri-apps/api/core";

const message = "Tauri"
console.log(await invoke("hello", { cmd: 'hello', message }))

7. 运行

让我们测试一下。

包管理器

1
npm run tauri dev
1
yarn tauri dev
1
pnpm tauri dev
1
deno task tauri dev
1
bun tauri dev
1
cargo tauri dev
用 F12(macOS 上是 Cmd+Option+I)打开 DevTools,你应该能看到 sidecar 命令的输出。

如果你遇到任何问题,请在 GitHub 上提 issue。

最后修改 September 25, 2026: 更新 (4c0ee2db0)