Pregunta

¿Cómo se comparan los dos entre sí?

¿Fue útil?

Solución

Tl; Dr

Dnode

  • proporciona RMI;
  • Las funciones remotas pueden aceptar devoluciones de llamada como argumentos;
  • Lo cual es bueno, ya que es completamente asincrónico;
  • se ejecuta independientemente o a través de un servidor HTTP existente;
  • puede tener clientes de navegador y nodo;
  • admite el middleware, al igual que connect;
  • ha existido más tiempo que ahora.

Ahorajs

  • Va más allá de RMI e implementa una API de "alcance compartido". Es como dropbox, solo con variables y funciones en lugar de archivos;
  • funciones remotas también acepta devoluciones de llamada (Gracias a Sridatta y Eric de Nowjs por la aclaración);
  • Depende de que funcione un servidor HTTP de escucha;
  • solo puede tener clientes de navegador;
  • se hizo público muy recientemente;
  • es algo erróneo en este momento.

Conclusión

Nowjs es más un juguete en este momento, pero mantén un reloj a medida que madura. Para cosas serias, tal vez vaya con DNode. Para una revisión más detallada de estas bibliotecas, lea.

Dnode

DNODE proporciona un marco de invocación de métodos remoto. Tanto el cliente como el servidor pueden exponer funciones entre sí.

// On the server

var server = DNode(function () {
    this.echo = function (message) {
        console.log(message)
    }
}).listen(9999)

// On the client

dnode.connect(9999, function (server) {
    server.echo('Hello, world!')
})

La función que se pasa a DNode() es un manejador no diferente al pasado ahttp.createServer. Tiene dos parámetros: client se puede utilizar para acceder a las funciones exportadas por el cliente y connection se puede usar para manejar eventos relacionados con la conexión:

// On the server

var server = DNode(function (client, connection) {
    this.echo = function (message) {
        console.log(message)
        connection.on('end', function () {
            console.log('The connection %s ended.', conn.id)
        })
    }       
}).listen(9999)

Los métodos exportados se pueden pasar cualquier cosa, incluidas las funciones. Están correctamente envueltos como proxies por DNODE y se pueden volver a llamar al otro punto final. Esto es fundamental: DNode es completamente asincrónico; No bloquea mientras espera que regrese un método remoto:

// A contrived example, of course.
// On the server

var server = DNode(function (client) {
    this.echo = function (message) {
        console.log(message)
        return 'Hello you too.'
    }
}).listen(9999)

// On the client

dnode.connect(9999, function (server) {
    var ret = server.echo('Hello, world!')
    console.log(ret) // This won't work
})

Las devoluciones de llamada deben aprobarse para recibir respuestas del otro punto final. Las conversaciones complicadas pueden volverse ilegibles bastante rápido. Esta pregunta Discute posibles soluciones para este problema.

// On the server

var server = DNode(function (client, callback) {
    this.echo = function (message, callback) {
        console.log(message)
        callback('Hello you too.')
    }

    this.hello = function (callback) {
        callback('Hello, world!')
    }
}).listen(9999)

// On the client

dnode.connect(9999, function (server) {
    server.echo("I can't have enough nesting with DNode!", function (response) {
        console.log(response)
        server.hello(function (greeting) {
            console.log(greeting)
        })
    })
})

El cliente DNODE puede ser un script que se ejecuta dentro de una instancia de nodo o puede integrarse dentro de una página web. En este caso, solo se conectará al servidor que sirvió en la página web. Conectar es de gran ayuda en este caso. Este escenario se probó con todos los navegadores modernos y con Internet Explorer 5.5 y 7.

Dnode se inició hace menos de un año, en junio de 2010. Es tan maduro como puede ser una biblioteca de nodos. En mis pruebas, no encontré problemas obvios.

Ahorajs

Nowjs proporciona una especie de API mágica que limita con ser lindo. El servidor tiene uneveryone.now alcance. Todo lo que se pone dentro everyone.now se vuelve visible para cada cliente a través de su now alcance.

Este código, en el servidor, compartirá un echo Funcionar con cada cliente que escriba un mensaje en la consola del servidor:

// Server-side:

everyone.now.echo = function (message) {
    console.log(message)
}

// So, on the client, one can write:

now.echo('This will be printed on the server console.')

Cuando se ejecuta una función "compartida" del lado del servidor, this tendrá un now atributo que es específico para el cliente que hizo esa llamada.

// Client-side

now.receiveResponse = function (response) {
    console.log('The server said: %s')
}

// We just touched "now" above and it must be synchronized 
// with the server. Will things happen as we expect? Since 
// the code is not multithreaded and NowJS talks through TCP,
// the synchronizing message will get to the server first.
// I still feel nervous about it, though.

now.echo('This will be printed on the server console.')

// Server-side:

everyone.now.echo = function (message) {
    console.log(message)
    this.now.receiveResponse('Thank you for using the "echo" service.')
}

Las funciones en ahorajs pueden tener valores de retorno. Para obtenerlos, se debe pasar una devolución de llamada:

// On the client

now.twice(10, function (r) { console.log(r) }

// On the server

everyone.now.twice = function(n) {
    return 2 * n
}

Esto tiene una implicación si desea aprobar una devolución de llamada como un argumento honesto (no para recopilar un valor de retorno), uno siempre debe aprobar el recaudador de valor de retorno, o los ahora pueden confundirse. Según los desarrolladores, esta forma de recuperar el valor de retorno con una devolución de llamada implícita probablemente cambiará en el futuro:

// On the client

now.crunchSomeNumbers('compute-primes', 

    /* This will be called when our prime numbers are ready to be used. */

    function (data) { /* process the data */ }, 

    /* This will be called when the server function returns. Even if we
    didn't care about our place in the queue, we'd have to add at least
    an empty function. */

    function (queueLength) { alert('You are number ' + queueLength + ' on the queue.') }
)

// On the server

everyone.now.crunchSomeNumbers = function(task, dataCallback) {
    superComputer.enqueueTask(task, dataCallback)
    return superComputer.queueLength
}

Y esto es todo para la API Nowjs. Bueno, en realidad hay 3 funciones más que se pueden usar para detectar la conexión del cliente y la desconexión. No sé por qué no exponen estas características usando EventEmitter, aunque.

A diferencia de DNODE, NowJS requiere que el cliente sea un script que se ejecute dentro de un navegador web. La página que contiene el script debe ser atendida por el mismo nodo que ejecuta el servidor.

En el lado del servidor, Nowjs también necesita un servidor HTTP escuchando. Debe pasarse al inicializar ahorajs:

var server = http.createServer(function (req, response) {
    fs.readFile(__dirname + '/now-client.html', function (err, data) {
        response.writeHead(200, {'Content-Type':'text/html'})  
        response.write(data)
        response.end()
    })
})
server.listen(8080)
var everyone = now.initialize(server)

Nowjs First Commit es de hace un par de semanas (marzo de 2011). Como tal, espere que sea buggy. encontré problemas yo mismo mientras escribo esta respuesta. También espere que su API cambie mucho.

En el lado positivo, los desarrolladores son muy accesibles: Eric incluso me guió a hacer que las devoluciones de llamada funcionen. El código fuente no está documentado, pero afortunadamente es simple y corto y la guía del usuario y los ejemplos son suficientes para comenzar.

Otros consejos

Miembro del equipo de NowJS aquí. Corrección a la respuesta de Andref:

Ahorajs admite totalmente "invocación de métodos remotos". Puede aprobar funciones como argumentos en llamadas remotas y también puede tener funciones como valores de retorno.

Estas funciones están envueltas por ahora JS tal como están en DNode para que se ejecuten en la máquina en la que se definió la función. Esto hace que sea fácil exponer nuevas funciones al extremo remoto, al igual que en DNode.

PD, además, no sé si Andref tuvo la intención de implicar que las llamadas remotas son solo asíncronas en DNODE. Las llamadas remotas también son async en ahorajs. No bloquean su código.

No he probado DNode, por lo que mi respuesta no es una comparación. Pero me gustaría presentar pocas experiencias usando ahorajs.

Nowjs se basa en socket.io que es bastante buggy. Con frecuencia experimento tiempos de espera de sesión, desconexiones y now.ready Evento disparando varias veces en poco tiempo. Verificar este problema En la página ahorajs GitHub.

También encontré que el uso de WebSockets inviables en ciertas plataformas, sin embargo, esto se puede eludir al deshabilitar explícitamente WebSockets.

Había planeado crear una aplicación de producción que use ahorajs, pero parece que no es lo suficientemente maduro como para confiar. Intentaré dnode si sirve mi propósito, de lo contrario cambiaré a simple express.

Actualizar:

Ahorajs parece ser desechado. No se compromete desde 8 meses.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top