2. Что такое Node.JS? Почему Node.JS?

А теперь мы поговорим о том, что такое Node.JS. Node.JS — это программное средство для выполнения JavaScript. То есть ставится Node.JS и Node.JS выполняет JavaScript на сервере, на десктопе, на ноутбуке, на мобильных устройствах и так далее. JavaScript где угодно. Node.js был создан Райаном Далом в 2009 году.
Node.JS = V8 + I/O + библиотеки
Что же такое сделал Райан и почему Node.JS получил такое большое признание? Ведь на самом деле до Node.JS существовали другие попытки сделать то же самое. Node.JS создан на основе виртуальной машины V8. Эта виртуальная машина была создана компанией Google для браузера Chrome и она умеет выполнять JavaScript.
V8: быстро, современно, экономно
Не просто умеет, она делает это очень хорошо. Она выполняет JavaScript быстро, она поддерживает практически все возможности современного JavaScript, самого современного стандарта который сейчас принят, плюс можно при помощи специальных флагов включить возможности будущего стандарта. Кроме того V8 очень экономно расходует память, очень хорошо оптимизирована в этом плане, позволяет профилировать процессор, память, смотреть, что происходит. Очень, очень хорошая штука!
Альтернативы: Rhino, JSC, WSH…
Альтернативы V8 которые есть, а они существуют, это Rhino — на основе Java, Java Script Core — который используется в частности в Safari в Mac OS, Windows Script Host — который есть в Windows. То есть другие способы выполнять JavaScript на сервере. На любом компьютере их можно поставить, но они уступают V8 в скорости, в эффективности расходования памяти. По этому V8 в данном случае безусловно плюс. Но V8 это JavaScript, V8 не умеет читать файлы, не умеет работать с сетью и так далее. По этому Райан добавил при помощи специальных библиотек и конечно же своего кода возможности по работе с сетью, с файлами, с потоками ввода/вывода и некоторыми другими. То что получилось в результате, позволяет делать из JavaScript — Web сервер.
Почему Node.JS?
Что интересного может быть для нас в Node.JS как технологии, почему мы можем захотеть Node.JS.
Для этого есть ряд причин:
- Хочу JavaScript! Если вы хорошо знаете JavaScript зачем изучать другой язык? Будем использовать его и на клиенте и на сервере.
- Общий код на клиенте и на сервере. Значить мы можем использовать одинаковый код, ту же библиотеку и на клиенте и на сервере. Впрочем на практике это повторное использование весьма ограничено и оно обычно касается библиотек общего вида. Допустим есть объект «User». Этот объект «User» в браузере делает одно, использует возможности браузера, а на сервере он обычно делает другое, в том числе работает с базами данных, тут уже вообще другой код. То есть прямо таки разделяемого кода не так много, но тем не менее он есть.
- Решает основные задачи для Web. Node.JS предназначен для решения основных задач, которые перед нами ставит Web разработка. Хотим работать с базой данных, легко — Node.JS отлично работает с самыми распространенными современными базами данных. Хотим получить низкоуровневый доступ к сети http, https, tcp, udp, в Node.JS содержится отлично проработанная коллекция модулей. Node.JS Это инструмент который изначально проектировался для решения задач под Web и в нем очень много этого сделано. С другой стороны Node.JS наверно не самый лучший если вы хотите создать оконное приложение под Windows или посчитать число Пи с точностью до какого то n-го знака. В этом случае наверно будут более предпочтительны другие инструменты. Node.JS это средство которое решает основные задачи под Web и делает это хорошо.
- Много соединений и задач одновременно. Node.JS лучше всего себя ведет там, где нужно поддерживать большое количество соединений. Например это 10 000 клиентов в чате одновременно или это онлайн игра, где тоже очень много игроков одновременно подключены и что то делают. Большое количество соединений, задач это то с чем Node.JS справляется хорошо. При этом эти задачи не должны быть вычислительными. Хотя если задачи вычислительные то в Node.JS есть средства для параллелизации, но они не так хорошо проработаны как на некоторых других платформах.
- Легко сделать рабочий прототип. Следующее, это рабочий прототип. На Node.JS очень легко создать, что то готовое и заставить это работать, причем работать в том числе под нагрузкой. Когда мы разрабатываем, то современные методики разработки итеративны. То есть мы делаем что то, оно должно работать, потом мы добавляем к этому фичи, она опять работает, потом мы добавляем что то еще и так. И на Node.JS первый этап проходит очень быстро, а если все в порядке с архитектурой, то и дальше оно отлично расширяется.
- Удобный менеджер пакетов, где много всего. В Node.JS есть очень удобный менеджер пакетов, NPM, мы его подробно рассмотрим и есть очень много готовых пакетов, которые можно поставить и работать с ними.
- Большое и активное сообщество вокруг. Ну и наконец, сообщество. Есть много, много людей которые любят Node.JS, которые пишут под Node.JS, которые поддерживают то, что они сделали под Node.JS. Преимущественно это индивидуальные разработчики или небольшие компании плюс сообщество. По этому такая ситуация складывается, что есть очень много готовых пакетов, модулей которые нужно поставить и они вместе нормально работают. Для приложений на Node.JS, совершенно нормально если они используют двадцать, тридцать, пятьдесят, восемьдесят готовых модулей даже. Такая вот матричная структура получается, когда есть много, много маленьких модулей которые вместе интегрируются и отлично работают, благодаря тому, что Node.JS предоставляет для этого Framework.
Опубликовано 29.07.2016 12.01.2019 Автор Konstantin F
One thought on “2. Что такое Node.JS? Почему Node.JS?”
Думают стоит добавить больше отличий I/O, где подход блокирующий , а где асинхронный. А так же отличия работы в одном потоке.
Логическое НЕ (!)
Логический оператор НЕ ( ! ) (логическое отрицание) меняет логическое значение операнда с истины в ложь и наоборот. Обычно он используется с булевыми (логическими) значениями. При использовании с любыми другими значениями, если операнд может быть преобразован в true , то вернёт false ; в противном случае он возвращается true .
Интерактивный пример
Синтаксис
!expr;
Описание
Возвращает false , если операнд может быть преобразован в true ; в противном случае возвращается true .
Если значение может быть преобразовано в true , то оно рассматривается как истинноподобное (truthy). Если же значение может быть преобразовано в false , то оно называется ложноподобным (falsy).
Примеры выражений, которые могут быть преобразованы в false :
- null ;
- NaN ;
- 0 ;
- пустая строка ( «» , » , « );
- undefined .
Несмотря на то, что оператор ! может использоваться с операндами, значения которых не относится к типу Boolean, это всё равно булевый оператор, поскольку его возвращаемое значение всегда можно преобразовать в булевый примитив. Чтобы явно преобразовать возвращаемое значение этого оператора (или вообще любое выражение) в соответствующее значение булевого типа, используйте двойной оператор НЕ (en-US) или конструктор Boolean (en-US).
Примеры
Использование логического НЕ
В следующем коде показаны примеры использования оператора ! (логическое НЕ).
= !true; // !t вернёт false n2 = !false; // !f вернёт true n3 = !""; // !f вернёт true n4 = !"Cat"; // !t вернёт false
Двойное НЕ ( !! )
Можно один за другим использовать пару операторов НЕ, чтобы явным образом принудительно преобразовать любое значение в соответствующий булевый примитив. Преобразование основано на «истинноподобности» или «ложноподобности» значения (см. truthy и falsy)).
Точно такое же преобразование может быть выполнено с помощью функции Boolean (en-US).
= !!true; // !!truthy вернёт true n2 = !!>; // !!truthy вернёт true: любой объект - истинноподобный. n3 = !!new Boolean(false); // . даже Boolean-объект со значением false из вызова .valueOf()! n4 = !!false; // !!falsy вернёт false n5 = !!""; // !!falsy вернёт false n6 = !!Boolean(false); // !!falsy вернёт false
Конвертация операторов НЕ
Следующая операция с булевыми значениями:
!!bCondition;
Логические операторы
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/logical-operators.
Для операций над логическими значениями в JavaScript есть || (ИЛИ), && (И) и ! (НЕ).
Хоть они и называются «логическими», но в JavaScript могут применяться к значениям любого типа и возвращают также значения любого типа.
|| (ИЛИ)
Оператор ИЛИ выглядит как двойной символ вертикальной черты:
result = a || b;
Логическое ИЛИ в классическом программировании работает следующим образом: «если хотя бы один из аргументов true , то возвращает true , иначе – false «. В JavaScript, как мы увидим далее, это не совсем так, но для начала рассмотрим только логические значения.
Получается следующая «таблица результатов»:
alert( true || true ); // true alert( false || true ); // true alert( true || false ); // true alert( false || false ); // false
Если значение не логического типа – то оно к нему приводится в целях вычислений. Например, число 1 будет воспринято как true , а 0 – как false :
if (1 || 0) < // сработает как if( true || false ) alert( 'верно' ); >
Обычно оператор ИЛИ используется в if , чтобы проверить, выполняется ли хотя бы одно из условий, например:
var hour = 9; if (hour < 10 || hour >18)
Можно передать и больше условий:
var hour = 12, isWeekend = true; if (hour < 10 || hour >18 || isWeekend)
Короткий цикл вычислений
JavaScript вычисляет несколько ИЛИ слева направо. При этом, чтобы экономить ресурсы, используется так называемый «короткий цикл вычисления».
Допустим, вычисляются несколько ИЛИ подряд: a || b || c || . . Если первый аргумент – true , то результат заведомо будет true (хотя бы одно из значений – true ), и остальные значения игнорируются.
Это особенно заметно, когда выражение, переданное в качестве второго аргумента, имеет сторонний эффект – например, присваивает переменную.
При запуске примера ниже присвоение x не произойдёт:
var x; true || (x = 1); alert(x); // undefined, x не присвоен
…А в примере ниже первый аргумент – false , так что ИЛИ попытается вычислить второй, запустив тем самым присваивание:
var x; false || (x = 1); alert(x); // 1
Ошибка TypeError: что это и как её исправить
Ошибки TypeError появляются, когда разработчики пытаются выполнить операцию с неправильным типом данных. Давайте разберём несколько примеров: почему появилась ошибка и как её исправить.
TypeError: Cannot read properties of null/undefined
Что означает: вы пытаетесь обратиться к свойству объекта, который имеет значение null или undefined .
Пример: объявим переменную, но не присвоили ей значение. Если вызовем метод toUpperCase() или любой другой на такой переменной, появится ошибка TypeError:
let name; name.toUpperCase(); // TypeError: Cannot read property 'toUpperCase' of undefined
Что делать: проверить значение переменной, которую вы используете.
TypeError: Cannot convert undefined/null to object
Что означает: вы используете null или undefined в качестве объекта.
Пример: попробуем использовать функцию Object.keys() , чтобы получить массив ключей объекта obj . Но так как переменная obj имеет значение undefined и не является массивом, возникнет ошибка TypeError:
let obj = undefined; let result = Object.keys(obj); // TypeError: Cannot convert undefined to object
Что делать: убедитесь, что вы не используете переменную со значением null или undefined . Проверьте, что вы присваиваете правильное значение объекту, или используйте условные операторы, чтобы избежать использования null или undefined в неподходящих местах.
TypeError: x is not a function
Что означает: вы неправильно использовали функцию или передали неверные аргументы.
Пример: попытаемся вызвать переменную numbers как функцию. Но так как это обычный массив, мы получим TypeError:
const numbers = [1, 2, 3]; numbers(); // TypeError: numbers is not a function
Что делать: убедитесь, что переменная является функцией или методом объекта. Проверьте, правильно ли объявлена функция или правильно ли вы вызываете метод объекта.
TypeError: x is not iterable
Что означает: вы пытаетесь выполнить итерацию (например, с помощью цикла for. of ) по значению, которое не является итерируемым (например, массивом или строкой).
Итерация — это повторное выполнение одного и того же блока кода несколько раз. Самый распространённый способ выполнения итераций в JavaScript — использовать циклы for и while .
Пример: выполним итерацию по значению x . Но так как это число, итерация не может быть выполнена — появится ошибка TypeError:
const x = 123; for (let item of x) < // TypeError: x is not iterable console.log(item); >
Что делать: проверьте тип данных. Возможно, их стоит преобразовать в другой формат.
Как обработать ошибку TypeError. Конструкция try. catch
Ошибки в коде опасны: если их не обработать, интерпретатор не сможет дальше читать код. В результате весь JavaScript, что находится ниже, просто не выполнится.
Чтобы ничего не сломалось, разработчики используют конструкцию try. catch . Она помогает поймать и обработать ошибки и защищает программу от аварийного завершения.
Как использовать конструкцию:
try < //Место, где может появиться ошибка let name; name.toUpperCase(); // TypeError: Cannot read property 'toUpperCase' of undefined >catch (error) < // Дополнительные действия для обработки ошибки console.log("Произошла ошибка:", error.message); >
Внутри блока try находится код, который может вызвать ошибку. Если что-то пойдёт не так и мы столкнёмся с TypeError, выполнение программы перейдёт в блок catch . Здесь мы можем выполнить любые действия, например, вывести ошибку в консоль или показать пользователю модальное окно с просьбой перезагрузить страницу.
Конструкция try. catch полезна, когда нужно предусмотреть появление ошибок и добавить альтернативные пути выполнения кода.
Однако конструкция не является универсальным решением для исправления TypeError. Её следует использовать лишь тогда, когда вы знаете, как обработать конкретную ошибку. А чтобы снизить риски появления проблем, следуйте следующим рекомендациям.
Как избежать ошибок типа TypeError
- Перед выполнением операций внимательно проверяйте типы данных переменных.
- Используйте условный оператор if для проверки, определена ли переменная, прежде чем вызывать методы или выполнять операции с ней.
- При работе с функциями проверяйте, что передаваемые аргументы имеют правильный тип данных.
- Используйте инструменты разработчика — особенно полезна консоль — чтобы отслеживать и исправлять ошибки типа TypeError.
Следуя этим советам, можно значительно сократить риски появления ошибок TypeError и повысить надёжность и корректность вашего JavaScript-кода.
Материалы по теме
- TypeScript. Зачем он нужен и почему так популярен
- Туториал. Список задач с drag & drop
- 12 полезных книг по JavaScript
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.