¿Cómo crear archivos exe desde una aplicación node.js?


123

Tengo una aplicación de nodo que escribí, que ejecuto de la siguiente manera:

node.exe app.js inputArg

¿Hay alguna forma de que pueda empaquetar esto en un .exe por sí mismo? ¿Entonces puedo hacer algo como esto?

App.exe inputArg

Tengo alguna forma de fingir esto usando un archivo por lotes, así que puedo hacer esto:

App.bat inputArg

Pero esto requiere que tenga todas las dependencias y el nodo en esa carpeta, lo cual no es ideal.




Una buena lista de herramientas está aquí: stackoverflow.com/a/12486874/32679
GrGr

1
Creo que cualquiera que agregue una respuesta aquí realmente debe considerar si ya se ha hecho. Esta pregunta se está convirtiendo en un montón de enlaces a varios productos de código abierto de diferente calidad / actividad.
Liam

Respuestas:


35

Existen algunas alternativas, tanto gratuitas como comerciales. No he usado ninguno de ellos, pero en teoría deberían funcionar:

La mayoría requerirá que mantenga el archivo por lotes como ejecutable principal y luego agrupe node.exe y sus scripts.

Dependiendo de su secuencia de comandos, también tiene la opción de migrarlo a JSDB , que admite una forma fácil de crear ejecutables simplemente agregando recursos.

Una tercera cuasi-solución es mantener el nodo en algún lugar como C:\utilsy agregar esta carpeta a su PATHvariable de entorno. Luego, puede crear archivos .bat en ese directorio que ejecutan el nodo + sus scripts preferidos: tengo coffeescript coffeefuncionando en Windows de esta manera. Esta configuración se puede automatizar con un archivo por lotes, un script vb o un instalador.


Estos se ven bien y parecen que pueden hacer lo que yo quiero. Lo intentaré y te responderé.
Aishwar

2
Probé el convertidor "Advanced" Batch To EXE, y funcionó a las mil maravillas. Puede empaquetar las dependencias en el archivo EXE. Gracias por la ayuda.
Aishwar

1
@Aishwar, pero no puede agrupar la carpeta node_modules, por lo que no puede hacer nada avanzado en ella ...
Clint

¿Qué sucede si comprime / rar node_modules y extrae a un directorio temporal cuando se ejecuta la aplicación? Sin embargo, podría volverse un poco lento, si tiene muchos módulos.
Jarrod Mosen

55

La solución que he usado es el node-webkit de Roger Wang .

Esta es una forma fantástica de empaquetar aplicaciones de nodejs y distribuirlas, incluso te da la opción de "empaquetar" toda la aplicación como un solo ejecutable. Es compatible con Windows, Mac y Linux.

Aquí hay algunos documentos sobre las diversas opciones para implementar aplicaciones de node-webkit, pero en pocas palabras, haga lo siguiente:

  1. Comprima todos sus archivos, con un package.json en la raíz
  2. Cambiar la extensión de .zip a .nw
  3. copiar / b nw.exe + app.nw app.exe

Solo como una nota adicional: he enviado varias aplicaciones de CD de instalación / caja de producción utilizando esto, y funcionó muy bien. La misma aplicación se ejecuta en Windows, Mac, Linux y en la web.

Actualización: el nombre del proyecto ha cambiado a 'nw.js' y está ubicado correctamente aquí: nw.js


1
Solo lo probé, ¡funcionó muy bien! Y cuenta con el apoyo de la gente de Intel.
Timo Huovinen

Esta debería ser la respuesta correcta y más actual a día de hoy. Consulte también la hoja de trucos del webkit del nodo aquí: gist.github.com/LeCoupa/80eca2716a2b13c37cce Incluye otras cosas sumamente útiles como cómo compilar el JS (o al menos reducir al código de bytes dependiendo de qué tan anticuado quiera ser sobre la palabra "compilar").
Erik Reppen

Me gusta esta respuesta, sin embargo, esto todavía no crea un exe independiente. Según Intel y nw.js en Github , todavía necesita tener al menos otros dos archivos en la misma carpeta: nw.pak e icudt.dll. ¿Cómo se crea un exe independiente?
Jeff Baker

@JeffBaker, si miras un poco hacia abajo en los documentos de github, puedes ver esto: github.com/nwjs/nw.js/wiki/… lo cual puedes hacer si no quieres tener que incluir archivos adicionales.
Clayton Gulick

@Clayton, Nw.js también está distribuido por chrome.com. developer.chrome.com/apps/migration#native
Pacerier

29

Para cualquiera que se encuentre con esta pregunta, ahora hay dos proyectos que crean exes a partir de sus proyectos de nodo, Pkg y Electron.atom.io , difieren ligeramente:

  1. Pkg compilará su proyecto en código nativo, también incluyen activos Y una instalación de nodejs (el sistema no necesitará instalar nodejs para ejecutar el .exe). No se incluirá su código fuente. El ejecutable resultante es SOLAMENTE Windows (.exe). Todas las plataformas son compatibles ahora. Ahora requiere una licencia para productos comerciales. Código completamente abierto.
  2. Electron.atom.io, si bien no se compactará ni generará un .exe para usted, PUEDE usarse para distribuir aplicaciones nodejs, ya que ofrecen una forma de distribuir aplicaciones . Los beneficios son que electron es multiplataforma (windows, mac osx, linux), las desventajas son que se incluirá su código fuente, incluso aunque ofrecen una forma de distribuir su aplicación dentro de un archivo asar . No será a prueba de balas, pero es mejor que su fuente en simple.

2
Actualice: EncloseJS SÍ es compatible con Linux y OS X ahora.
000000000000000000000

Comentario editado! @ 000000000000000000000
sokie

EncloseJS es el camino a seguir. ¡Voy a intentarlo ahora mismo! ¡Gracias por agregar tu respuesta! +1 :)
tftd

No puedo instalar EncloseJS. Dice el código Err ELIFECYCLE sin ningún mensaje de error útil.
Elmue

2
EncloseJS ya no se mantiene. El heredero parece ser zeit / pkg ( npmjs.com/package/pkg )
Lucas Gonze

21

De forma predeterminada, Windows asocia .jsarchivos con Windows Script Host , el motor de tiempo de ejecución JS independiente de Microsoft. Si escribe script.js en un símbolo del sistema (o hace doble clic en un .jsarchivo en el Explorador), el script es ejecutado por wscript.exe.

Esto puede estar resolviendo un problema local con una configuración global , pero podría asociar .js archivos con en su node.exelugar, de modo que escribir script.js en un símbolo del sistema o hacer doble clic / arrastrar elementos a los scripts los lanzará con Node.

Por supuesto, si, como yo, ha asociado .jsarchivos con un editor para que al hacer doble clic en ellos se abra su editor de texto favorito, esta sugerencia no servirá de mucho. También puede agregar una entrada de menú del botón derecho de "Ejecutar con nodo" a los .jsarchivos, aunque esta alternativa no resuelve sus necesidades de línea de comandos.


La solución más simple probablemente sea usar un archivo por lotes; no es necesario que tenga una copia de Node en la carpeta en la que reside su script. Simplemente haga referencia al ejecutable de Node absolutamente:

"C:\Program Files (x86)\nodejs\node.exe" app.js %*

Otra alternativa es esta aplicación C # muy simple que iniciará Node usando su propio nombre de archivo + .jscomo el script a ejecutar, y pasará cualquier argumento de línea de comando.

class Program
{
    static void Main(string[] args)
    {
        var info = System.Diagnostics.Process.GetCurrentProcess();
        var proc = new System.Diagnostics.ProcessStartInfo(@"C:\Program Files (x86)\nodejs\node.exe", "\"" + info.ProcessName + ".js\" " + String.Join(" ", args));
        proc.UseShellExecute = false;
        System.Diagnostics.Process.Start(proc);
    }
}

Entonces, si nombra el EXE resultante "app.exe", puede escribir app arg1 ...y Node se iniciará con la línea de comando "app.js" arg1 .... Tenga en cuenta que la aplicación de arranque de C # se cerrará inmediatamente, dejando a Node a cargo de la ventana de la consola.

Dado que esto probablemente sea de un interés relativamente amplio, seguí adelante y lo puse a disposición en GitHub , incluido el exe compilado si lo tuyo es entrar en furgonetas con extraños.


Como mencionaste, esto no resuelve mi problema de una manera ideal. Pero +1 para las lecturas interesantes
Aishwar

@Aishwar, agregué una aplicación simple que iniciará Node por ti. Ver ediciones.
josh3736

@ josh3736 ¿su exe aún requiere que tenga node.exe en la misma carpeta?
Ricardo Tomasi

@RicardoTomasi, no. Asume que Node está instalado en el directorio de Archivos de programa de su sistema (donde lo coloca el instalador).
josh3736

@ josh3736 Esta es una solución interesante. Me gusta lo que has hecho, desearía poder hacer +1 de nuevo :). Pero esto todavía no es ideal, ya que requiere que el usuario tenga instalado node.js y en la ruta estándar.
Aishwar

20

La mejor herramienta que conozco es la herramienta NodeJS: zeit / pkg

Es muy fácil de usar (mucho más que Nexe, solo como ejemplo), puedes instalarlo globalmente: npm install -g pkg

para crear ejecutables para macOS, Linux y Windows:

pkg exampleApp.js

Tenía un código un poco complicado que usaba el servidor de socket NodeJS, probé diferentes aplicaciones, ninguna de ellas lo creó correctamente, excepto zeit / pkg .


Intenté compactar una instalación de Appium en un archivo Exe y zeit / pkg falló por completo. De los 310 MB en el disco resultó un pequeño archivo Exe de 18 MB que obviamente no funcionó en absoluto.
Elmue


12

Desde que se respondió a esta pregunta, se ha lanzado otra solución.

https://github.com/appjs/appjs

En el momento de escribir este artículo, esta es la solución definitiva para empaquetar aplicaciones node.js a través de un paquete de chrome reducido compilado en un ejecutable.

Editar: AppJS ya no está activo, pero sugiere una bifurcación llamada deskshell.

https://github.com/sihorton/appjs-deskshell/


1
Parece ser un enlace roto.
starbeamrainbowlabs

1
Este proyecto ya no está activo. Consulte node-webkit para obtener una alternativa como la menciona Clayton Gulick.
Kukks

Appjs en sí sugiere una bifurcación activa llamada deskshell github.com/sihorton/appjs-deskshell
bitfed

11

Aquí hay muchas buenas respuestas, pero no todas son tan sencillas como JXcore .

Una vez que tenga JXcore instalado en Windows, todo lo que tiene que hacer es ejecutar:

jx package app.js "myAppName" -native

Esto producirá un archivo .exe que puede distribuir y puede ejecutarse sin ninguna dependencia externa (ni siquiera necesita JXcore ni Node.js en el sistema).

Aquí está la documentación sobre esa funcionalidad: http://jxcore.com/packaging-code-protection/#cat-74

Editar 2018

Ese proyecto ahora está muerto, pero todavía está alojado aquí: https://github.com/jxcore/jxcore-release (gracias @Elmue)


1
Gracias amigo. ¿Puedo hacer un ejecutable de Linux desde Windows?
Sasivarnan

1
Hasta donde yo sé, no, no puedes. Creo que JXCore toma algunos archivos del sistema operativo para hacer el ejecutable, y no empaqueta esos archivos, por lo que si desea hacer un ejecutable de Linux, tendrá que ejecutar este comando en Linux.
Nepoxx


1
Todos los enlaces aquí están muertos. Esto funciona: github.com/jxcore/jxcore-release
Elmue

7

Prueba disclose: https://github.com/pmq20/disclose

disclose esencialmente hace un archivo ejecutable autoextraíble de su proyecto Node.js y del intérprete Node.js con las siguientes características,

  1. Sin GUI. CLI puro.
  2. Sin dependencias en tiempo de ejecución
  3. Soporta Windows y Unix
  4. Se ejecuta lentamente por primera vez (extrayendo a un directorio de caché), luego rápido para siempre

Prueba node-compiler: https://github.com/pmq20/node-compiler

He creado un nuevo proyecto llamado node-compilerpara compilar su proyecto Node.js en un solo ejecutable.

Es mejor que disclosenunca se ejecuta lentamente por primera vez, ya que su código fuente se compila junto con el intérprete de Node.js, al igual que las bibliotecas estándar de Node.js.

Además, redirige las solicitudes de archivos y directorios de forma transparente a la memoria en lugar de al sistema de archivos en tiempo de ejecución. De modo que no se requiere código fuente para ejecutar el producto compilado.

Cómo funciona: https://speakerdeck.com/pmq20/node-dot-js-compiler-compiling-your-node-dot-js-application-into-a-single-executable

Comparando con proyectos similares,

  • pkg ( https://github.com/zeit/pkg ): Pkg pirateó fs. * API dinámicamente para acceder a los archivos del paquete, mientras que el compilador Node.js los deja solos y, en cambio, trabaja en un nivel más profundo a través de libsquash. Pkg usa JSON para almacenar archivos en el paquete, mientras que Node.js Compiler usa SquashFS más sofisticado y ampliamente utilizado como su estructura de datos.

  • EncloseJS ( http://enclosejs.com/ ): EncloseJS restringe el acceso a los archivos del paquete a solo cinco API fs. *, Mientras que el compilador Node.js admite todas las API fs. *. EncloseJS tiene licencia patentada y cobra dinero cuando se usa, mientras que el compilador Node.js tiene licencia MIT y los usuarios son libres de usarlo y de modificarlo.

  • Nexe ( https://github.com/nexe/nexe ): Nexe no admite el requerimiento dinámico debido a su uso de browserify, mientras que el compilador Node.js admite todo tipo de requerimiento, incluido require.resolve.

  • asar ( https://github.com/electron/asar ): Asar usa JSON para almacenar información de archivos mientras que el compilador Node.js usa SquashFS. Asar mantiene el archivo de código y el ejecutable por separado, mientras que el compilador Node.js vincula todo el código fuente de JavaScript junto con la máquina virtual Node.js y genera un solo ejecutable como producto final.

  • AppImage ( http://appimage.org/ ): AppImage solo es compatible con Linux con un kernel que admita SquashFS, mientras que Node.js Compiler es compatible con las tres plataformas de Linux, macOS y Windows, mientras que sin ningún requisito de características especiales del kernel.


@ StéphaneLaurent Echa un vistazo al compilador de nodos, definitivamente admite el uso de un argumento de línea de comandos con el exe.
Minqi Pan

Última confirmación el 30 de agosto de 2017 (hace 2 años). ¡¿Interrumpido?!
Thach Lockevn

4

Te recomiendo BoxedApp para eso. Es un producto comercial que funciona muy bien. Funciona para cualquier aplicación NodeJS. El usuario final obtendrá solo un archivo EXE para su aplicación. No necesita instalación.

En Electron, por ejemplo, el usuario final necesita instalar / descomprimir su aplicación, y verá todos los archivos fuente de su código.

BoxedApp Empaqueta todos los archivos y dependencias que necesita su aplicación NodeJS. Admite compresiones y el archivo compilado funciona en Windows XP +

Cuando lo use, asegúrese de agregar Node.EXE a la aplicación compilada. Elija una versión de nodo que sea compatible con Windows XP (si lo necesita)

El programa admite argumentos de línea de comando, así que después del paquete, puede hacer

c:\myApp argument1

Y puede obtener el argumento en su código de nodo:

process.argv[1]

A veces, su aplicación tiene dependencias de archivos, por lo que en BoxedApp puede agregar cualquier carpeta y archivo como dependencia, por ejemplo, puede insertar un archivo de configuración.

var mySettings=require('fs').readFileSync('./settings.jgon').toString()

Más información:

Solo una nota: por lo general, recomiendo software de código abierto / gratuito, pero en este caso no encontré nada que hiciera el trabajo.


1
También admite una buena protección de código porque los datos se guardan dentro de la RAM pero no en el disco duro
z0r1fan


3

He estado explorando este tema durante algunos días y esto es lo que encontré. Las opciones se dividen en dos categorías:

Si desea crear una aplicación de escritorio, las mejores opciones son:

1- NW.js : le permite llamar a todos los módulos de Node.js directamente desde DOM y habilita una nueva forma de escribir aplicaciones con todas las tecnologías web.

2- Electron : cree aplicaciones de escritorio multiplataforma con JavaScript, HTML y CSS

Aquí hay una buena comparación entre ellos: NW.js y Electron Compared . Creo que NW.js es mejor y también proporciona una aplicación para compilar archivos JS. También hay algunos constructores de instaladores y ejecutables independientes como Enigma Virtual Box . Ambos contienen una versión integrada de Chrome que no es necesaria para las aplicaciones de servidor.

si desea empaquetar una aplicación de servidor, estas son las mejores opciones:

Node-compiler : compilador adelantado (AOT) diseñado para Node.js, que simplemente funciona.

Nexe : cree un único ejecutable a partir de sus aplicaciones node.js

En esta categoría, creo que el compilador de nodos es mejor que admite módulos de nodo nativo y requerimiento dinámico. Es muy fácil de usar y la salida comienza en 25 MB. Puede leer una comparación completa con otras soluciones en la página Node Compiler. No leí mucho sobre Nexe, pero por ahora, parece que Node Compiler no compila el archivo js en formato binario usando la función de instantánea V8, pero está planeado para la versión 2. También va a tener un constructor de instaladores incorporado.


2
Electronno justifica ser una sugerencia válida para la emisión del PO; es un marco de Node completamente diferente.
progyammer

¡Gran comparación!
Vlad


1

Me cansé de comenzar en win desde el símbolo del sistema y luego me encontré con esto también. Versión ligeramente mejorada. sobre lo que josh3736 . Esto usa un archivo XML para tomar algunas configuraciones. Por ejemplo, la ruta Node.exey el archivo para comenzar en el archivo app.js. También el entorno para cargar (producción, desarrollo, etc.) que ha especificado en su app.js (o server.js o como lo llame). Básicamente, agrega NODE_ENV={0}donde {0} es el nombre de su configuración en app.js como una var para usted. Para ello, modifica el elemento "mode" en config.xml. Puede tomar el proyecto aquí ==> directorio github . Tenga en cuenta que en los eventos de Post Build puede modificar las rutas de copia para copiar automáticamente su config.xml y el ejecutable a suNodejs , solo para guardar un paso. De lo contrario, edítelos o su compilación arrojará una advertencia.

var startInfo = new ProcessStartInfo();
        startInfo.FileName = nodepath;
        startInfo.Arguments = apppath;
        startInfo.UseShellExecute = false;
        startInfo.CreateNoWindow = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        if(env.Length > 0)
            startInfo.EnvironmentVariables.Add("NODE_ENV", env);

        try
        {
            using (Process p = Process.Start(startInfo))
            {
                p.WaitForExit();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), "Start Error", MessageBoxButtons.OK);
        }


0

Existe un proyecto de herramienta de compilación de código abierto llamado nodebob . Supongo que las ventanas de la plataforma de trabajo

  1. simplemente clona o descarga el proyecto
  2. copie todos sus archivos de proyecto node-webkit en la carpeta de la aplicación.
  3. ejecute el script build.bat.

Encontrará el archivo ejecutable dentro de la carpeta de lanzamiento.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.