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

в 10:42, , рубрики: Google Chrome, javascript, node.js, метки: , ,

Приветствую тебя, 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.

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

Давайте же сравним какой-нибудь код, выполнив его в 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 функциями, в отличие от привычного 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js