Jaka jest różnica między dnode a nowjs?

Jak się do siebie porównują?

Author: blueberryfields, 2011-03-15

3 answers

TL;DR

DNode

  • dostarcza RMI;
  • funkcje zdalne mogą przyjmować wywołania zwrotne jako argumenty;
  • [[26]} co jest miłe, ponieważ jest w pełni asynchroniczne; [27]} W tym celu należy wykonać następujące czynności:]} Może mieć klientów przeglądarek i węzłów;]}
  • obsługuje middleware, podobnie jak connect;
  • istnieje dłużej niż teraz.

NowJS

  • wykracza poza RMI i wdraża " wspólny zakres" API. to jak Dropbox, tylko ze zmiennymi i funkcjami zamiast plików;
  • funkcje zdalne akceptują również wywołania zwrotne (podziękowania dla Sridatty i Erica z NowJS dla wyjaśnienia);
  • zależy od nasłuchującego serwera http do pracy;
  • może mieć tylko klientów przeglądarki;
  • stał się publiczny bardzo niedawno;
  • jest teraz trochę popsuty.

Podsumowanie

NowJS jest teraz bardziej zabawką -- ale keep Zegarek jak dojrzewa. Na poważne rzeczy, może iść z DNode. Dla bardziej szczegółowego przeglądu tych biblioteki, Czytaj dalej.

DNode

DNode zapewnia zdalny Framework wywoływania metod. Zarówno klient jak i serwer może wystawiać funkcje na siebie nawzajem.

// 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!')
})

Funkcja przekazywana do DNode() jest funkcją obsługi, która nie różni się od tej przekazywanej do http.createServer. Posiada dwa parametry: client może być użyty do uzyskania dostępu do funkcje eksportowane przez Klienta i connection mogą być użyte do uchwyt zdarzenia związane z połączeniem:

// 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)

Wyeksportowane metody mogą być przekazywane wszystkim, łącznie z funkcjami. Są odpowiednio zawinięty jako proxy przez DNode i może być wywołany z powrotem w innym punkcie końcowym. To jest fundamental: DNode jest w pełni asynchroniczny; nie blokuje się podczas oczekiwania dla zdalnej metody powrotu:

// 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
})

Wywołania zwrotne muszą być przekazywane wokół, aby otrzymać odpowiedzi od innych punkt końcowy. Skomplikowane rozmowy mogą stać się nieczytelne dość szybko. to pytanie omawia możliwe rozwiązania tego problemu.

// 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)
        })
    })
})

Klient DNode może być skryptem działającym wewnątrz instancji węzła lub może być osadzony wewnątrz strony internetowej. W takim przypadku połączy się tylko z serwerem, który służył stronie internetowej. Connect jest bardzo pomocny w tym przypadku. Ten scenariusz został przetestowany we wszystkich nowoczesnych przeglądarkach oraz z Internet Explorer 5.5 i 7.

DNode został uruchomiony niecały rok temu, w czerwcu 2010 roku. Jest tak dojrzały jako węzeł biblioteka może być. W moich testach nie znalazłem żadnych oczywistych problemów.

NowJS

NowJS zapewnia rodzaj magicznego API, które graniczy z byciem słodkim. Serwer posiada everyone.now zakres. Wszystko, co jest umieszczone wewnątrz everyone.now staje się widoczne dla każdego klienta poprzez ich now zakres.

Ten kod, na serwerze, będzie dzielił echo funkcję z każdym klientem, który zapisuje wiadomość do konsoli serwera:

// 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.')

Gdy uruchomiona zostanie funkcja "współdzielona" po stronie serwera, this będzie mieć atrybut now to jest specyficzne dla klienta, który wykonał ten telefon.

// 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.')
}

Funkcje w NowJS mogą mieć wartości zwracane. Aby je zdobyć, oddzwanianie musi być passed:

// On the client

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

// On the server

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

To ma implikację, jeśli chcesz przekazać callback jako uczciwy argument (nie aby pobrać wartość zwracaną ) -- należy zawsze przekazać wartość zwracaną, lub Teraz js może się pomylić. Według twórców, ten sposób pobierania zwracana wartość z niejawnym wywołaniem zwrotnym będzie prawdopodobnie zmiana w przyszłości:

// 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
}

I to jest to dla API NowJS. Cóż, właściwie są jeszcze 3 Funkcje, które może być używany do wykrywania połączenia i rozłączenia klienta. Nie wiem dlaczego oni nie ujawnił tych funkcji za pomocą EventEmitter.

W Przeciwieństwie Do DNode, NowJS wymaga, aby klient był skryptem działającym w przeglądarce internetowej. Strona zawierająca skrypt musi być obsługiwana przez ten sam węzeł, który jest uruchomiony serwer.

Po stronie serwera, NowJS potrzebuje również serwera http nasłuchującego. To musi być przekazane podczas inicjalizacji NowJS:

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 pierwszy commit jest sprzed kilku tygodni (marzec 2011). W związku z tym spodziewaj się, że bądź buggy. Sam znalazłem problemy pisząc tę odpowiedź. Również spodziewać się jego API, aby wiele zmienić.

Z pozytywnej strony, deweloperzy są bardzo dostępne -- Eric nawet prowadził mnie za wykonywanie połączeń zwrotnych. Kod źródłowy nie jest udokumentowany, ale na szczęście proste i krótkie, a użytkownik przewodnik i przykłady wystarczą,aby zacząć.

 61
Author: andref,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:16:04

Nowjs team member here. Poprawka do odpowiedzi andrefa:

NowJS W Pełni Obsługuje "Remote method Invocation" . Funkcje można przekazywać jako argumenty w wywołaniach zdalnych, a funkcje mogą być również zwracane.

Te funkcje są zawijane przez NowJS tak jak są w DNode tak, że są wykonywane na maszynie, na której funkcja została zdefiniowana. Ułatwia to wyświetlanie nowych funkcji na zdalnym końcu, tak jak w DNode.

P. S. Dodatkowo, Nie wiem, czy andref chciał sugerować, że połączenia zdalne są tylko asynchroniczne na DNode. Połączenia zdalne są również asynchroniczne na NowJS. Nie blokują Twojego kodu.

 14
Author: Sridatta Thatipamala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-16 22:21:30

Nie próbowałem Dnode więc moja odpowiedź nie jest porównanie. Ale chciałbym przedstawić kilka doświadczeń przy użyciu nowjs.

Nowjs opiera się na socket.io co jest dość buggy. Często doświadczam przerw sesji, rozłączeń i odpalenia zdarzeń now.ready wiele razy w krótkim czasie. Sprawdź ten numer {[6] } na stronie nowjs github.

Również okazało się, że korzystanie z websockets nie jest możliwe na niektórych platformach, jednak można to obejść, wyraźnie wyłączając websockets.

Planowałem stworzenie aplikacji produkcyjnej przy użyciu nowjs, ale wydaje się, że nie jest ona wystarczająco dojrzała, aby na niej polegać. Spróbuję dnode, jeśli to służy mojemu celowi, w przeciwnym razie przełączę się na zwykły-stary express.

Aktualizacja:

Nowjs wydaje się być złomowany. Brak commitów od 8 miesięcy.

 2
Author: Juzer Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55