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.
🌐 Goals
- 将 Node.js 应用打包为二进制文件。
- 将此二进制文件集成为 Tauri sidecar。
🌐 Implementation Details
- 为此我们使用 pkg 工具,但任何其他可以将 JavaScript 或 TypeScript 编译成二进制应用的工具都可以使用。
- 你还可以将 Node 运行时本身嵌入到你的 Tauri 应用中,并将打包好的 JavaScript 作为资源一起发布,但这样会将 JavaScript 内容以可读的文件形式发布,并且运行时通常比
pkg打包的应用更大。
在这个例子中,我们将创建一个 Node.js 应用,该程序从命令行读取输入 process.argv 并使用 console.log 写入输出到 stdout。
你可以利用其他进程间通信系统,例如本地主机服务器、stdin/stdout 或本地套接字。请注意,每种方式都有其自身的优点、缺点和安全问题。
🌐 Prerequisites
使用 shell 插件设置的现有 Tauri 应用,可在本地为你编译和运行。
🌐 An existing Tauri application set up with the shell plugin, that compiles and runs for you locally.
🌐 Guide
-
让我们创建一个新的 Node.js 项目来包含我们的 sidecar 实现。 在你的 Tauri 应用根文件夹中创建一个新目录(在这个例子中我们称它为
sidecar-app), 并在该目录中运行你选择的 Node.js 包管理器的init命令:npm inityarn initpnpm init我们将使用 pkg 等选项将我们的 Node.js 应用编译成自包含的二进制文件。 让我们将其作为开发依赖安装到新的
sidecar-app中:npm add @yao-pkg/pkg --save-devyarn add @yao-pkg/pkg --devpnpm add @yao-pkg/pkg --save-dev -
现在我们可以开始编写将由我们的 Tauri 应用执行的 JavaScript 代码。
在这个示例中,我们将处理来自命令行参数的命令,并将输出写入标准输出,这意味着我们的进程将是短暂的,并且一次只处理一个命令。如果你的应用必须长时间运行,请考虑使用替代的进程间通信系统。
让我们在
sidecar-app目录中创建一个index.js文件,并编写一个基本的 Node.js 应用:sidecar-app/index.js const command = process.argv[2];switch (command) {case 'hello':const message = process.argv[3];console.log(`Hello ${message}!`);break;default:console.error(`unknown command ${command}`);process.exit(1);} -
要将我们的 Node.js 应用打包成自包含的二进制文件,请在
package.json中创建一个脚本:sidecar-app/package.json {"scripts": {"build": "pkg index.ts --output my-sidecar"}}npm run buildyarn buildpnpm build这将在 Linux 和 macOS 上创建
sidecar-app/my-sidecar二进制文件,在 Windows 上创建sidecar-app/my-sidecar.exe可执行文件。对于 sidecar 应用,我们需要确保二进制文件的命名符合正确的模式,更多信息请阅读 嵌入外部二进制文件 要将此文件重命名为预期的 Tauri sidecar 文件名并移动到我们的 Tauri 项目中,我们可以使用以下 Node.js 脚本作为起始示例:
sidecar-app/rename.js 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: create `src-tauri/binaries` dirfs.renameSync(`my-sidecar${ext}`,`../src-tauri/binaries/my-sidecar-${targetTriple}${ext}`);并从
sidecar-app目录运行node rename.js。在此步骤中,
/src-tauri/binaries目录应包含已重命名的 sidecar 二进制文件。 -
安装 shell 插件 后,请确保配置所需的功能。
请注意,我们使用
"args": true,但你可以选择提供一个数组["hello"],阅读更多。src-tauri/capabilities/default.json {"permissions": ["core:default","opener:default",{"identifier": "shell:allow-execute","allow": [{"args": true,"name": "binaries/my-sidecar","sidecar": true}]}]} -
现在我们已经准备好 Node.js 应用,我们可以通过配置
bundle > externalBin数组将其连接到我们的 Tauri 应用:src-tauri/tauri.conf.json {"bundle": {"externalBin": ["binaries/my-sidecar"]}}只要副车二进制文件存在为
src-tauri/binaries/my-sidecar-<target-triple>,Tauri CLI 就会处理其打包。 -
我们可以从 Rust 代码或直接从 JavaScript 运行 sidecar 二进制文件。
让我们直接在 Node.js 辅助进程中执行
hello命令:import { Command } from '@tauri-apps/plugin-shell';const message = 'Tauri';const command = Command.sidecar('binaries/my-sidecar', ['hello', message]);const output = await command.execute();// once everything is configured it should log "Hello Tauri" in the browser console.console.log(output.stdout)让我们将
helloTauri 命令传输到 Node.js 辅助程序:use tauri_plugin_shell::ShellExt;#[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中注册它,然后在前端调用它:import { invoke } from "@tauri-apps/api/core";const message = "Tauri"console.log(await invoke("hello", { cmd: 'hello', message })) -
让我们测试它
npm run tauri devyarn tauri devpnpm tauri devdeno task tauri devbun tauri devcargo tauri dev按 F12 打开开发者工具(在 macOS 上按
Cmd+Option+I),你应该能看到 sidecar 命令的输出。如果你发现任何问题,请在 GitHub 上提交一个问题。
Tauri 中文网 - 粤ICP备13048890号
Nodejs.cn 旗下网站