Что такое node в node.js?

В Erlang я смог сразу понять понятие "node" - автономной VM Erlang. Я мог запустить node на одной машине с помощью erl -name gandalf -setcookie abc, а другой node на другой машине (в той же локальной сети) с помощью erl -name bilbo -setcookie abc. Затем я мог бы порождать процессы на гэндалфе, которые могли бы волноваться с другими процессами на бильбо. Теперь, поскольку я также хотел обслуживать джазкую веб-страницу с анимированными графическими результатами моих процессов Erlang, я взял Javascript и узнал jQuery. Еще скромный падуван, но я понимаю, как Javascript вписывается в схему вещей.

Недавно я встретил node.js, и (злой) голос начал шептать: "Вот оно! Теперь вы можете делать все с помощью Javascript! Забудьте об Эрланге и стражах и периодах, придерживайтесь языка, который каждый использует".

Я немного читал документы, но я до сих пор не понимаю, что такое node в node.js. Должен ли я запускать http-сервер, и это становится моим node? Что делать, если мне не нравится http, или мне все равно, как gandalf разговаривает с билбо - это то, что мне нравится в Erlang. Может быть, я най: вы ожидаете, что node.js - erlang с сахаром Javascript?

Ответ 1

Node.js имеет гораздо больше общего с Twisted, чем Erlang/OTP. Node.js - это просто однопоточный SEDA цикл событий. Node.js не имеет ничего общего с Erlang VM, когда речь заходит о распределении, перезагрузке горячего кода и масштабируемости через процессы, это не что-то близко к "Erlang с сахаром JavaScript"

Ответ 2

Возможно, из-за вашего знания Эрланга вы подумали, что каким-то образом Node.js имеет какое-то отношение к "узлам" (как узлы erlang), но это просто имя.

Основная идея с Node.js заключается в том, что вы откладываете все дорогостоящие операции ввода-вывода и назначаете обратные вызовы на результат этих операций. Причина в том, что I/O блокирует (только) процесс, который выполняется в данный момент. Node.js будет обрабатывать это для вас, учитывая, что вы правильно кодируете.

Простым примером этого является вызов базы данных:

result = SQL.query("EXPENSIVE SELECT HERE")
doSomething(result);
moreStuff(); // This line must wait until the previous ones are completed.

В node вы будете кодировать это по-другому:

SQL.query("EXPENSIVE SELECT HERE", function(result) {
  doSomething(result);
});
moreStuff(); // This line executes inmediately

Если у вас неправильный код в Node.js script, например:

while(true) { }

Затем вы блокируете процесс и не сможете обрабатывать больше запросов, чем текущий, поэтому в Node.js обязательно следовать приведенным выше рекомендациям.

Ответ 3

Как я понимаю, Node.JS node является экземпляром движка V8 с исполняемой средой Node.JS и циклом событий. Хотя среда выполнения Node.JS дает вам возможность очень быстро и просто начать обработку HTTP-запросов, это не обязательно; он очень хорош в управлении большинством любых асинхронных операций ввода-вывода.

Я не очень разбираюсь в Erlang, но мое поверхностное понимание заключается в том, что его огромная сила - это высокая вычислительная способность. Node.JS не специализируется на этом, как таковом. Его сердце "событие ввода/вывода", аккуратно и чисто, с асинхронным вводом/выводом.

Ответ 4

в node.js

отсутствует node "

как уже упоминалось, при запуске

node my_script.js 

выполняется один экземпляр интерпретатора V8 java script (который использует одно ядро ​​для своего времени жизни).