Node.js como sidecar
En esta guía vamos a empaquetar una aplicación Node.js en un binario autónomo para ser utilizado como Sidecar en una aplicación Tauri sin requerir que el usuario final tenga una instalación de Node.js. Este tutorial de ejemplo es aplicable únicamente a sistemas operativos de escritorio.
Recomendamos leer primero la guía general de sidecars para comprender mejor cómo funcionan los sidecars de Tauri.
Objetivos
Sección titulada "Objetivos"- Empaquetar una aplicación Node.js como un binario.
- Integrar este binario como un Sidecar de Tauri.
Detalles de Implementación
Sección titulada "Detalles de Implementación"- Para esto usamos la herramienta pkg, pero cualquier otra herramienta que pueda compilar JavaScript o TypeScript en una aplicación binaria funcionará.
- También puedes incrustar el propio entorno de ejecución de Node en tu aplicación Tauri y distribuir el JavaScript empaquetado como un recurso, pero esto distribuirá el contenido JavaScript como archivos medianamente legibles y el runtime suele ser más grande que una aplicación empaquetada con
pkg.
En este ejemplo crearemos una aplicación Node.js que lee la entrada desde la línea de comandos process.argv
y escribe la salida en stdout usando console.log.
Puedes aprovechar sistemas alternativos de comunicación entre procesos como un servidor localhost, stdin/stdout o sockets locales.
Ten en cuenta que cada uno tiene sus propias ventajas, inconvenientes y consideraciones de seguridad.
Requisitos previos
Sección titulada “Requisitos previos”Una aplicación Tauri existente configurada con el plugin shell, que compile y se ejecute localmente en tu equipo.
-
Inicializar el Proyecto del Sidecar
Sección titulada "Inicializar el Proyecto del Sidecar"Creemos un nuevo proyecto Node.js para contener la implementación de nuestro sidecar. Crea un nuevo directorio en la carpeta raíz de tu aplicación Tauri (en este ejemplo lo llamaremos
sidecar-app) y ejecuta el comandoinitde tu gestor de paquetes de Node.js preferido dentro del directorio:npm inityarn initpnpm initCompilaremos nuestra aplicación Node.js en un binario autónomo usando pkg entre otras opciones. Instalémoslo como una dependencia de desarrollo dentro del nuevo
sidecar-app:npm add @yao-pkg/pkg --save-devyarn add @yao-pkg/pkg --devpnpm add @yao-pkg/pkg --save-dev -
Escribir la Lógica del Sidecar
Sección titulada "Escribir la Lógica del Sidecar"Ahora podemos comenzar a escribir código JavaScript que será ejecutado por nuestra aplicación Tauri.
En este ejemplo procesaremos un comando desde los argumentos de la línea de comandos y escribiremos la salida en stdout, lo que significa que nuestro proceso será de corta duración y solo manejará un comando a la vez. Si tu aplicación debe ser de larga duración, considera utilizar sistemas alternativos de comunicación entre procesos.
Creemos un archivo
index.jsen nuestro directoriosidecar-appy escribamos una aplicación Node.js básica: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);} -
Empaquetar el Sidecar
Sección titulada "Empaquetar el Sidecar"Para empaquetar nuestra aplicación Node.js en un binario autónomo, crea un script en el archivo
package.json:sidecar-app/package.json {"scripts": {"build": "pkg index.ts --output my-sidecar"}}npm run buildyarn buildpnpm buildEsto creará el binario
sidecar-app/my-sidecaren Linux y macOS, y un ejecutablesidecar-app/my-sidecar.exeen Windows.Para las aplicaciones sidecar, debemos asegurarnos de que el binario tenga el patrón de nombre correcto; para obtener más información, lee Incrustar Binarios Externos. Para renombrar este archivo al nombre de archivo esperado para el sidecar de Tauri y también moverlo a nuestro proyecto Tauri, podemos usar el siguiente script de Node.js como ejemplo inicial:
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}`);Y ejecuta
node rename.jsdesde el directoriosidecar-app.En este paso, el directorio
/src-tauri/binariesdebería contener el binario del sidecar renombrado. -
Configurar el permiso del plugin-shell
Sección titulada "Configurar el permiso del plugin-shell"Después de instalar el plugin shell, asegúrate de configurar los permisos requeridos.
Ten en cuenta que usamos
"args": true, pero opcionalmente puedes proporcionar un array["hello"], leer más.src-tauri/capabilities/default.json {"permissions": ["core:default","opener:default",{"identifier": "shell:allow-execute","allow": [{"args": true,"name": "binaries/my-sidecar","sidecar": true}]}]} -
Configurar el Sidecar en la Aplicación Tauri
Sección titulada "Configurar el Sidecar en la Aplicación Tauri"Ahora que tenemos nuestra aplicación Node.js lista, podemos conectarla a nuestra aplicación Tauri configurando el array
bundle > externalBin:src-tauri/tauri.conf.json {"bundle": {"externalBin": ["binaries/my-sidecar"]}}La CLI de Tauri se encargará de empaquetar el binario del sidecar siempre que exista como
src-tauri/binaries/my-sidecar-<target-triple>. -
Ejecutar el Sidecar
Sección titulada "Ejecutar el Sidecar"Podemos ejecutar el binario sidecar ya sea desde código Rust o directamente desde JavaScript.
Ejecutemos el comando
helloen el sidecar de Node.js directamente: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)Redirijamos un comando de Tauri
hellohacia el sidecar de 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()}Regístralo en
invoke_handlery llámalo en el frontend con:import { invoke } from "@tauri-apps/api/core";const message = "Tauri"console.log(await invoke("hello", { cmd: 'hello', message })) -
Ejecución
Sección titulada "Ejecución"Vamos a probarlo
npm run tauri devyarn tauri devpnpm tauri devdeno task tauri devbun tauri devcargo tauri devAbre las DevTools con F12 (o
Cmd+Option+Ien macOS) y deberías ver la salida del comando del sidecar.Si encuentras algún problema, por favor abre un issue en GitHub.
© 2026 Colaboradores de Tauri. CC-BY / MIT