2011-04-02 10 views
31

Quiero usar scripts Node.js en mis aplicaciones C/C++. Algunas personas me sugirieron que comenzara con v8, libev y libeio; pero significa volver a escribir Node.js desde cero.¿Cómo incrustar el intérprete Node.js en C/C++?

Entonces, ¿es posible incrustar Node.js en C o C++?

+2

node.js es realmente V8 incrustado en un servidor web. Dado que su aplicación probablemente no es un servidor web, simplemente puede incrustar V8 (o cualquier otro motor de JavaScript) en él. – MAK

+1

Técnicamente node.js no solo hace servidores web. Puede cumplir toneladas de roles diferentes, pero es realmente bueno para los servidores HTTP (servidores de archivos, servidores web, etc.). En cualquier caso, tienes razón acerca de usar V8 en su lugar. – tjameson

+5

@MAK node.js no es un servidor web. Integra un módulo de servidor web, pero ciertamente no es un servidor web. En las aplicaciones de C++, node.js trae una gran cantidad de módulos que no están disponibles solo con v8. – Coyote

Respuesta

0

probablemente lo es, V8 está escrito en C++, Node.js pueden funcionar con V8, pero a menos que tenga una buena razón extremadamente por las que se ejecute Javascript a C++ que son probablemente mucho mejor servido para encontrar un C apropiado ++ biblioteca e implementando la funcionalidad necesaria directamente en C++. La tarea de integrar lenguajes de scripting y código nativo generalmente no es trivial. P.ej. V8 documentation. Qt ofrece una integración bastante decente entre C++ y javascript, y aún no es trivial mover objetos de un lado a otro entre script y código.

+0

Hay un cierto esfuerzo para portar la biblioteca QtScript para aprovechar la ventaja de V8 - http://developer.qt.nokia.com/wiki/V8_Port – errordeveloper

14

primer lugar, debe considerar si sería suficiente para poner en práctica su aplicación como un módulo C++ para el nodo y luego pegar la parte principal como un script Nodo.

De lo contrario puede que desee "re-implementar nodo", tomando el código del núcleo como el ejemplo y eliminar las partes que no es necesario (por ejemplo, el módulo HTTP) y luego poner sus componentes en ella . La forma menos dolorosa sería hacer una fusión de subárbol y desmantelar el sistema de compilación, y luego agregar prefijos en los guiones de compilación para apuntar al directorio donde vive. Entonces puede evitar que se creen ciertas partes. Sin embargo, el sistema de compilación de Node contiene varias partes y puede ser un trabajo bastante difícil de hacer.

También puede intentar volver a empaquetar el nodo con sus cosas cargadas por defecto y cambiando el nombre del ejecutable. Sin embargo, esto es sólo una forma más compleja de tomar el primer enfoque que he descrito, sólo puede instalar un script en /usr/bin/ que irá como:

#!/usr/bin/node 
    var myAppMain = require('libmyApp'); 
    myAppMain.withConfig(filename, 
    function(err, cnf) { 
    if (err) throw err; // parser or file access error 
    cnf.evalMe(); 
    }); 

Se puede utilizar un JSLint como su analizador, a continuación, grep para llamadas peligrosas y luego o simplemente use require(config.js), aunque deberá agregar exports.someMethod = function (...) {...}. Pero require() es mucho más seguro en general, sin embargo, es posible que desee implementar un preprocesador para su configuración que sustituirá exports.someMethod = function (...) {...} en lugar de sus funciones y anexará require('OnlyCallMySafeMethods') y rechazará intentos de require('fs') u otra lib que tenga miedo de dejar alguien a quien usar Este tipo de seguridad es solo una cosa opcional que puede desear tener, todo depende de usted. Aunque supongo que es posible que desee hacer algo con la sustitución exports.someMethod = .... y tener uno require('myAppConfigLib) agregado en la parte superior para que el usuario simplemente use su API más cualquier cosa que deseen poner en su secuencia de comandos/configuración!

ACTUALIZACIÓN: No es un comentario bastante útil en line 66 de src/node.js:

// To allow people to extend Node in different ways, this hook allows 
    // one to drop a file lib/_third_party_main.js into the build 
    // directory which will be executed instead of Node's normal loading. 

Tenga en cuenta también que el contenido de src/ están siendo compilados a código de bytes en tiempo de compilación.

1

he construir algo parecido a lo que creo que está buscando:

https://github.com/ZECTBynmo/tacnode

Es una biblioteca que permite a Node.js a estar vinculados estáticamente en una aplicación C++. Definitivamente no está pulido, pero lo he usado para lanzar scripts de nodo simples.

+0

Lo intenté, pero un error de sintaxis en el script de construcción "vcbuild.bat" es lo suficientemente peor no gastar más tiempo en eso. – Lothar

0

Estaba comprobando js-git que está hecho para Node.js y también depende de algunos otros módulos de Node.js.

Sin embargo, el mismo desarrollador escribió una herramienta tim-task para concluir algunas funciones comunes Node.js, lo más importante require, y para empacar juntos algunos módulos de Node.js de tal manera que no debe depender de Node.js más . Lo usó para hacer git-web-platform, es decir, js-git empaquetado como un archivo JS que se puede usar en navegadores. El archivo empaquetado resultante se ve como this. Esto probablemente también se puede usar con modificaciones menores solo en V8 puro.

Esto podría ser útil para usted. Sin embargo, tenga en cuenta que este enfoque será limitado.

12

Incrustar Node.JS ahora es oficialmente compatible con un Node.JS fork JXcore. Los documentos de incrustación están disponibles en this link.

+1

Esta es una sugerencia excelente, y debería ser la respuesta aceptada imo, exactamente lo que el OP estaba buscando. –

1

Existen muchas buenas razones para insertar un nodo, incluida la capacidad de aprovechar npm.

Desafortunadamente JXCore está muriendo. this artice ofrece algunas alternativas. http://www.goland.org/nodeapps/