Node.js 作為 sidecar
在本指南中,我們將封裝 Node.js 應用程式為獨立的二進制檔案,以便在 Tauri 應用程式中作為 sidecar 使用,而無需終端使用者安裝 Node.js。本範例教學僅適用於桌面作業系統。
我們建議先閱讀sidecar 指南,以更深入了解 Tauri sidecar 的運作方式。
在本範例中,我們將建立一個 Node.js 應用程式,該應用程式從命令列 process.argv 讀取輸入,並使用 console.log 將輸出寫入 stdout。
您可以利用其他跨進程通訊系統,例如 localhost 伺服器、stdin/stdout 或本機 sockets。請注意,每種系統都有其自身的優點、缺點和安全考量。
先決條件
一個已存在的 Tauri 應用程式,已設定 shell 外掛程式,並且可以在本機編譯和執行。
指南
-
讓我們建立一個新的 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 邏輯
現在我們可以開始撰寫 JavaScript 程式碼,這些程式碼將由我們的 Tauri 應用程式執行。
在本範例中,我們將處理來自命令列參數的命令,並將輸出寫入 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