Node.js 作为 sidecar
在本指南中,我们将把一个 Node.js 应用打包成一个自包含的二进制文件,以便在 Tauri 应用中用作 sidecar,而无需终端用户安装 Node.js。本示例教程仅适用于桌面操作系统。
¥In this guide we are going to package a Node.js application to a self contained binary to be used as a sidecar in a Tauri application without requiring the end user to have a Node.js installation. This example tutorial is applicable for desktop operating systems only.
我们建议先阅读通用 sidecar 指南,以更深入地了解 Tauri sidecar 的工作原理。
¥We recommend reading the general sidecar guide first for a deeper understanding of how Tauri sidecars work.
在此示例中,我们将创建一个 Node.js 应用,该应用从命令行 process.argv 读取输入并使用 console.log 将输出写入 stdout。
你可以利用其他进程间通信系统,例如本地服务器、stdin/stdout 或本地套接字。请注意,每个都有自己的优点、缺点和安全问题。
¥In this example we will create a Node.js application that reads input from the command line process.argv
and writes output to stdout using console.log.
You can leverage alternative inter-process communication systems such as a localhost server, stdin/stdout or local sockets.
Note that each has their own advantages, drawbacks and security concerns.
先决条件
¥Prerequisites
使用 shell 插件设置的现有 Tauri 应用,可在本地为你编译和运行。
¥An existing Tauri application set up with the shell plugin, that compiles and runs for you locally.
:::note 注意
请首先按照 shell 插件指南 正确设置和初始化插件。如果插件未初始化和配置,示例将无法运行。
¥Please follow the shell plugin guide first to set up and initialize the plugin correctly. Without the plugin being initialized and configured the example won’t work.
:::
指南
¥Guide
-
Let’s create a new Node.js project to contain our sidecar implementation. Create a new directory in your Tauri application root folder (in this example we will call it
sidecar-app
) and run theinit
command of your preferred Node.js package manager inside the directory:npm inityarn initpnpm initWe will compile our Node.js application to a self container binary using pkg. Let’s install it as a development dependency:
npm add @yao-pkg/pkg --save-devyarn add @yao-pkg/pkg --devpnpm add @yao-pkg/pkg --save-dev -
Write Sidecar Logic
Now we can start writing JavaScript code that will be executed by our Tauri application.
In this example we will process a command from the command line argmuents and write output to stdout, which means our process will be short lived and only handle a single command at a time. If your application must be long lived, consider using alternative inter-process communication systems.
Let’s create a
index.js
file in oursidecar-app
directory and write a basic Node.js app: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);} -
To package our Node.js application to a self contained binary, we can run the following
pkg
command:npm run pkg -- --output appyarn pkg --output apppnpm pkg --output appThis will create the
sidecar-app/app
binary on Linux and macOS, and asidecar-app/app.exe
executable on Windows. To rename this file to the expected Tauri sidecar filename, we can use the following Node.js script: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}`); -
Configure the Sidecar in the Tauri Application
Now that we have our Node.js application ready, we can connect it to our Tauri application by configuring the
bundle > externalBin
array:src-tauri/tauri.conf.json {"bundle": {"externalBin": ["binaries/app"]}}The Tauri CLI will handle the bundling of the sidecar binary as long as it exists as
src-tauri/binaries/app-<target-triple>
. -
We can run the sidecar binary either from Rust code or directly from JavaScript.
Let’s execute the
ping
command in the Node.js sidecar directly: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;Let’s pipe a
ping
Tauri command to the 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}
Tauri 中文网 - 粤ICP备13048890号