- PVSM.RU - https://www.pvsm.ru -

Node.js: JavaScript ты ли это?

Приветствую тебя, exports.users.habrauser.

Чуть более недели назад на хабре появилась статья, в которой затрагивалась «проблема»: Node.js — это JavaScript или нет. Некоторые аргументы, представленные в статье были справедливыми, но, увы, безосновательны. Другие же аргументы были вовсе абсурдными и не правдивыми. Я не буду писать о знаниях автора статьи в данной области, даже не буду давать ссылки на это статью (дабы статья перенесена в черновики, она осталась только в архивах). Я же просто сравню скрипты Node.js и JavaScript в таком виде, в котором все его привыкли видеть.

Введение

Для начала обратимся к Википедии и узнаем, что есть такое Node.js и JavaScript:

Node или Node.js — серверная реализация языка программирования JavaScript, основанная на движке V8. Предназначена для создания масштабируемых распределённых сетевых приложений, таких как веб-сервер. Node.js по целям использования сходен с каркасами Twisted на языке Python и EventMachine на Ruby. В отличие от большинства программ JavaScript, этот каркас исполняется не в браузере клиента, а на стороне сервера.

JavaScript — прототипно-ориентированный сценарный язык программирования. Является диалектом языка ECMAScript.

Что ж, определение Node.js немного расплывчато, и надо сказать не корректно. Тогда посмотрим на информацию на официальном сайте:

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

Самое главное слово здесь — платформа. Оно и характеризует весь Node.js. Из всего вышесказанного можно сделать предварительный вывод, что Node.js это среда выполнения JavaScript, точно как браузер, с той лишь разницей, что у нас нет доступа к DOM (а собственно, зачем он нужен на стороне сервера?; однако существует библиотека для работы с DOM — jsdom).

А причем тут Google?

А действительно, причем? Да, Node.js основан на V8 от Google, но на этом все. Слышать что Google как-то причастен к разработке Node.js — это все равно, что сказать в США «Россия» и услышать стереотипные «медведь», «балалайка» и «водка». Разработку изначально ведут авторы проекта (единственное нужно отметить, что главный автор ушел из проекта, чтобы заняться новыми идеями). Спонсирование ведет совсем непохожая на Google компания Joyent [1].

Они такие разные...

Давайте же сравним какой-нибудь код, выполнив его в Node.js и браузере, например Chrome. Я, конечно, не стану проверять тривиальный console.log(«Hello, World!»);, возьму что-то посложнее. Например, функцию вычисления факториала с использование хвостовой рекурсии:

var factorial = function (n, a) {
  return n < 2 ? a : factorial(n - 1, a * n);
};

console.log(factorial(10, 1));

Выполнив данный код в Node.js и Chrome мы получаем одинаковые результаты:

Node.js: JavaScript ты ли это?

Node.js: JavaScript ты ли это?

Но этот маленький пример не показывает одну из фишек JavaScript. Тогда давайте посмотрим код, используя ее — Прототипное ООП, думаю он будет понятен без лишнего объяснения:

var Celsius2Fahrenheit = function (val, unit) {
  this.val = val;
  this.unit = unit;
};

Celsius2Fahrenheit.prototype.setVal = function (degrees) {
  var degreesArray = degrees.split(" ");

  this.val = degreesArray[0];
  this.unit = degreesArray[1];
};

Celsius2Fahrenheit.prototype.convert = function (to) {
  if (this.unit != to) {
    this.unit = to;

    switch (to) {
      case "C": {
        this.val = Math.round((this.val - 32) * 5 / 9);
      } break;
      case "F": {
        this.val = Math.round(this.val * 9 / 5 + 32);
      } break;
    }
  }
};

var c2f = new Celsius2Fahrenheit(30, "C");
console.log(c2f.val + c2f.unit);

c2f.convert("F");
console.log(c2f.val + c2f.unit);

c2f.setVal("100 F");
console.log(c2f.val + c2f.unit);

c2f.convert("C");
console.log(c2f.val + c2f.unit);

Код может и не совсем «элегантен», однако результат очень похож на правильный. Проверьте сами, в браузере и в Node.js он одинаков:

30C
86F
100F
38C

Node.js: JavaScript ты ли это?
Так в чем же отличие? Ну, начнем с того, что для Node.js написано немало встроенных библиотек, или правильней сказать модулей (а соответственно появилась инструкция для их подключения — require). Стоит еще отметить, что в Node.js часто пользуются callback [2] функциями, в отличие от привычного JavaScript. И если смотреть поверхностно, то это все. Чтобы найти еще какие-либо отличая — нужно копать глубже.

Сегодня JavaScript, завтра Node.js

Несомненно, Node.js и JavaScript отличаются. Хотя сравнивать платформу и язык как то странно, но опять же оговорюсь, под JavaScript я подразумеваю скрипт, выполняемый на стороне клиента, а Node.js на сервере.

Так если это две разные стороны одной монеты, то и перейти с одной на другую сложно? Как я писал в комментариях к вышеупомянутой статье: «Не важно, куда ты крутишь руль, ты все равно поворачиваешь». Что значит: не важно, на какой стороне выполняется скрипт, JavaScript остается JavaScript'ом. Этим то и привлек меня Node,js: не надо писать на двух разных языках серверную и клиентскую часть, а если нужно использовать одинаковый код, то достаточно просто воспользоваться старым добрым Ctrl-C Ctrl-V. Не буду говорить за других, но я быстро перешел с написания серверной стороны на PHP к Node.js, и никаких трудностей не заметил.

Мы хотим стабильности!

Про стабильность приложений можно разговаривать вечность. Никто не может гарантировать вам стабильную работу, всегда будет иметь фактор случайности. И Node.js не исключение, как и Chrome, и Windows… Однако достаточно часто обновляется (минимум раз в две недели), что само собой обозначает достаточно надежную работу приложения. Так что на это грех жаловаться…

Послесловие

Конечно, данным текстом я выразил свое видение «проблемы» и никого не хотел обидеть. Я уверен, найдутся те, кто скажет, что различий гораздо больше, но я их пока не заметил. Если вы считаете что я где-то не прав или что-то не дописал, я открыт для конструктивного разговора в комментариях.

Автор: BOOMER_74

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/36145

Ссылки в тексте:

[1] Joyent: http://joyent.com/

[2] callback: http://ru.wikipedia.org/wiki/Callback_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29

[3] Источник: http://habrahabr.ru/post/182628/