node java что это
Node java что это
Node это интерфейс, от которого наследуют несколько типов DOM, он так же позволяет различным типам быть обработанными(или протестированными).
Свойства
Наследует свойства от родителей EventTarget . [1]
Методы
Наследует методы от своих родителей EventTarget . [1]
. Node.getUserData() Этот API вышел из употребления и его работа больше не гарантируется.
Позволяет пользователю получить некоторый DOMUserData от узла. Node.hasAttributes() Этот API вышел из употребления и его работа больше не гарантируется.
Node.isSupported() Этот API вышел из употребления и его работа больше не гарантируется.
Возвращает Boolean флаг содержащий результаты теста, реализует ли реализация DOM конкретную особенность и поддерживается ли эта особенность конкретным узлом. Node.lookupPrefix() Node.lookupNamespaceURI() Node.normalize() Очищает все текстовые узлы под этим элементом (поглотить смежный, удалить пустой). Node.removeChild() Удаляет дочерний узел из текущего элемента, который должен быть потомком текущего узла. Node.replaceChild() Заменяет одного потомка Node из существующего на второй указанный в параметре. Node.setUserData() Этот API вышел из употребления и его работа больше не гарантируется.
Позволяет пользователю присоединить или удалить DOMUserData к узлу.
Примеры
Просмотреть все дочерние узлы
Следующая функция рекурсивный цикл всех дочерних узлов узла и она исполняет вызов функции относительно их (и себя относительно родительского узла).
Синтаксис
Описание
Руководство по Node.js, часть 1: общие сведения и начало работы
Мы начинаем публикацию серии материалов, которые представляют собой поэтапный перевод руководства по Node.js для начинающих. А именно, в данном случае «начинающий» — это тот, кто обладает некоторыми познаниями в области браузерного JavaScript. Он слышал о том, что существует серверная платформа, программы для которой тоже пишут на JS, и хотел бы эту платформу освоить. Возможно, вы найдёте здесь что-то полезное для себя и в том случае, если уже знакомы с Node.js.
Кстати, в прошлом году у нас был похожий по масштабам проект, посвящённый bash-скриптам. Тогда мы, после публикации всех запланированных материалов, собрали их в виде PDF-файла. Так же планируется поступить и в этот раз.
Сегодня мы обсудим особенности Node.js, начнём знакомство с экосистемой этой платформы и напишем серверный «Hello World».
Обзор Node.js
Node.js — это опенсорсная кроссплатформенная среда выполнения для JavaScript, которая работает на серверах. С момента выпуска этой платформы в 2009 году она стала чрезвычайно популярной и в наши дни играет весьма важную роль в области веб-разработки. Если считать показателем популярности число звёзд, которые собрал некий проект на GitHub, то Node.js, у которого более 50000 звёзд, это очень и очень популярный проект.
Платформа Node.js построена на базе JavaScript движка V8 от Google, который используется в браузере Google Chrome. Данная платформа, в основном, используется для создания веб-серверов, однако сфера её применения этим не ограничивается.
Рассмотрим основные особенности Node.js.
▍Скорость
Одной из основных привлекательных особенностей Node.js является скорость. JavaScript-код, выполняемый в среде Node.js, может быть в два раза быстрее, чем код, написанный на компилируемых языках, вроде C или Java, и на порядки быстрее интерпретируемых языков наподобие Python или Ruby. Причиной подобного является неблокирующая архитектура платформы, а конкретные результаты зависят от используемых тестов производительности, но, в целом, Node.js — это очень быстрая платформа.
▍Простота
Платформа Node.js проста в освоении и использовании. На самом деле, она прямо-таки очень проста, особенно это заметно в сравнении с некоторыми другими серверными платформами.
▍JavaScript
В среде Node.js выполняется код, написанный на JavaScript. Это означает, что миллионы фронтенд-разработчиков, которые уже пользуются JavaScript в браузере, могут писать и серверный, и клиентский код на одном и том же языке программирования без необходимости изучать совершенно новый инструмент для перехода к серверной разработке.
В браузере и на сервере используются одинаковые концепции языка. Кроме того, в Node.js можно оперативно переходить на использование новых стандартов ECMAScript по мере их реализации на платформе. Для этого не нужно ждать до тех пор, пока пользователи обновят браузеры, так как Node.js — это серверная среда, которую полностью контролирует разработчик. В результате новые возможности языка оказываются доступными при установке поддерживающей их версии Node.js.
▍Движок V8
В основе Node.js, помимо других решений, лежит опенсорсный JavaScript-движок V8 от Google, применяемый в браузере Google Chrome и в других браузерах. Это означает, что Node.js пользуется наработками тысяч инженеров, которые сделали среду выполнения JavaScript Chrome невероятно быстрой и продолжают работать в направлении совершенствования V8.
▍Асинхронность
В традиционных языках программирования (C, Java, Python, PHP) все инструкции, по умолчанию, являются блокирующими, если только разработчик явным образом не позаботится об асинхронном выполнении кода. В результате если, например, в такой среде, произвести сетевой запрос для загрузки некоего JSON-кода, выполнение потока, из которого сделан запрос, будет приостановлено до тех пор, пока не завершится получение и обработка ответа.
JavaScript значительно упрощает написание асинхронного и неблокирующего кода с использованием единственного потока, функций обратного вызова (коллбэков) и подхода к разработке, основанной на событиях. Каждый раз, когда нам нужно выполнить тяжёлую операцию, мы передаём соответствующему механизму коллбэк, который будет вызван сразу после завершения этой операции. В результате, для того чтобы программа продолжила работу, ждать результатов выполнения подобных операций не нужно.
Подобный механизм возник в браузерах. Мы не можем позволить себе ждать, скажем, окончания выполнения AJAX-запроса, не имея при этом возможности реагировать на действия пользователя, например, на щелчки по кнопкам. Для того чтобы пользователям было удобно работать с веб-страницами, всё, и загрузка данных из сети, и обработка нажатия на кнопки, должно происходить одновременно, в режиме реального времени.
Если вы создавали когда-нибудь обработчик события нажатия на кнопку, то вы уже пользовались методиками асинхронного программирования.
Асинхронные механизмы позволяют единственному Node.js-серверу одновременно обрабатывать тысячи подключений, не нагружая при этом программиста задачами по управлению потоками и по организации параллельного выполнения кода. Подобные вещи часто являются источниками ошибок.
Node.js предоставляет разработчику неблокирующие базовые механизмы ввода вывода, и, в целом, библиотеки, использующиеся в среде Node.js, написаны с использованием неблокирующих парадигм. Это делает блокирующее поведение кода скорее исключением, чем нормой.
Когда Node.js нужно выполнить операцию ввода-вывода, вроде загрузки данных из сети, доступа к базе данных или к файловой системе, вместо того, чтобы заблокировать ожиданием результатов такой операции главный поток, Node.js инициирует её выполнение и продолжает заниматься другими делами до тех пор, пока результаты выполнения этой операции не будут получены.
▍Библиотеки
Благодаря простоте и удобству работы с менеджером пакетов для Node.js, который называется npm, экосистема Node.js прямо-таки процветает. Сейчас в реестре npm имеется более полумиллиона опенсорсных пакетов, которые может свободно использовать любой Node.js-разработчик.
Рассмотрев некоторые основные особенности платформы Node.js, опробуем её в действии. Начнём с установки.
Установка Node.js
Node.js можно устанавливать различными способами, которые мы сейчас рассмотрим.
Так, официальные установочные пакеты для всех основных платформ можно найти здесь.
Существует ещё один весьма удобный способ установки Node.js, который заключается в использовании менеджера пакетов, имеющегося в операционной системе. Например, менеджер пакетов macOS, который является фактическим стандартом в этой области, называется Homebrew. Если он в вашей системе есть, вы можете установить Node.js, выполнив эту команду в командной строке:
Список менеджеров пакетов для других операционных систем, в том числе — для Linux и Windows, можно найти здесь.
Популярным менеджером версий Node.js является nvm. Это средство позволяет удобно переключаться между различными версиями Node.js, с его помощью можно, например, установить и попробовать новую версию Node.js, после чего, при необходимости, вернуться на старую. Nvm пригодится и в ситуации, когда нужно испытать какой-нибудь код на старой версии Node.js.
Я посоветовал бы начинающим пользоваться официальными установщиками Node.js. Пользователям macOS я порекомендовал бы устанавливать Node.js с помощью Homebrew. Теперь, после того, как вы установили Node.js, пришло время написать «Hello World».
Первое Node.js-приложение
Самым распространённым примером первого приложения для Node.js можно назвать простой веб-сервер. Вот его код:
Для того чтобы запустить этот код, сохраните его в файле server.js и выполните в терминале такую команду:
Разберём этот пример.
Для начала, обратите внимание на то, что код содержит команду подключения модуля http.
Платформа Node.js является обладателем замечательного стандартного набора модулей, в который входят отлично проработанные механизмы для работы с сетью.
Метод createServer() объекта http создаёт новый HTTP-сервер и возвращает его.
Сервер настроен на прослушивание определённого порта на заданном хосте. Когда сервер будет готов, вызывается соответствующий коллбэк, сообщающий нам о том, что сервер работает.
Первый предоставляет в наше распоряжение сведения о запросе. В нашем простом примере этими данными мы не пользуемся, но, при необходимости, с помощью объекта req можно получить доступ к заголовкам запроса и к переданным в нём данным.
Второй нужен для формирования и отправки ответа на запрос.
Далее, мы устанавливаем заголовок Content-Type :
После этого мы завершаем подготовку ответа, добавляя его содержимое в качестве аргумента метода end() :
Мы уже говорили о том, что вокруг платформы Node.js сформировалась мощная экосистема. Обсудим теперь некоторые популярные фреймворки и вспомогательные инструменты для Node.js.
Фреймворки и вспомогательные инструменты для Node.js
Node.js — это низкоуровневая платформа. Для того чтобы упростить разработку для неё и облегчить жизнь программистам, было создано огромное количество библиотек. Некоторые из них со временем стали весьма популярными. Вот небольшой список библиотек, которые я считаю отлично сделанными и достойными изучения:
Краткая история Node.js
В этом году Node.js исполнилось уже 9 лет. Это, конечно, не так уж и много, если сравнить этот возраст с возрастом JavaScript, которому уже 23 года, или с 25-летним возрастом веба, существующем в таком виде, в котором мы его знаем, если считать от появления браузера Mosaic.
9 лет — это маленький срок для технологии, но сейчас возникает такое ощущение, что платформа Node.js существовала всегда.
Я начал работу с Node.js с ранних версий платформы, когда ей было ещё только 2 года. Даже тогда, несмотря на то, что информации о Node.js было не так уж и много, уже можно было почувствовать, что Node.js — это очень серьёзно.
Теперь поговорим о технологиях, лежащих в основе Node.js и кратко рассмотрим основные события, связанные с этой платформой.
Итак, JavaScript — это язык программирования, который был создан в Netscape как скриптовый язык, предназначенный для управления веб-страницами в браузере Netscape Navigator.
Node.js или Java: производительность, ресурсы, управление потоками, популярность и личный опыт
Недавно мы с коллегами обсуждали вопрос популярности некоторых технологий — в частности Java и node.js. После недолгого интернет-серфинга выяснилось, что именно эти технологии используют многие информационные гиганты для разработки и поддержания своих площадок в сети. Ниже, я приведу лишь малую часть.
Компании использующие Java:
Компании использующие node.js:
He менее интересным является и то, что по данным поиска на indeed.com (28.06.2019) по запросам Java Developer (30272 вакансии) и node.js developer (7401 вакансии), специалисты по этим технологиям довольно востребованы.
Но все это лишь общая информация, касающаяся популярности. Информация, которая натолкнула меня на мысль углубиться в тему и порассуждать на предмет технических особенностей, что привело к написанию этой статьи.
Почему их стоит сравнивать
Java — это язык, node.js — можно назвать экосистемой построенной на базе JS, и, прежде всего, на базе V8 — движка от Google.
Однако, когда мы говорим про Java, мы говорим не только про язык, а про виртуальную машину Java, а также всю экосистему и инфраструктуру построенную вокруг этой машины. Как минимум, их можно сравнивать по этому признаку — как результат, в обоих случаях, мы имеем среду исполнения. В случае Java — это виртуальная машина. В случае node.js — это движок V8 который представлен на большинстве ОС, таких как Windows, Linux, MacOS и менее известных.
Разработчики могут писать код пользуясь одним и тем же языком, и это будет работать более-менее одинаковым образом на разных ОС за счет того, что существует среда исполнения. Среда исполнения влияет на то, как происходит взаимодействие с ОС. Кроме того, их можно сравнивать т.к. они используются для решения похожего круга задач.
V8 и JVM
Когда в v8 попадает код JS, осуществляется just in time компиляция в байт код, который используется в виртуальной машине, код на JS выполняется все быстрее и быстрее.
Байт код — это промежуточный язык высокого уровня, поэтому в виртуальной машине Java пишут не только на Java, но также на Scala и Kotlin.
Есть предпосылки тому, что в ближайшем будущем для V8 можно будет использовать не только JS но и TypeScript или другие. На данный момент идет транспайлинг этих языков в JS. В будущем, они вероятно будут поддерживаться из коробки, и все будет работать намного быстрее.
Сейчас идет непрерывное развитие V8, и по большому счету, появление новых версий node.js связано с появлением новой версии движка V8. Они прямо взаимосвязаны.
Node.js: преимущества и недостатки
Node.js был создан Райаном Далом (Ryan Dahl) в 2009 году.
Сам node.js включает в себя несколько основных составляющих:
Преимущества и недостатки Java
В противовес сразу рассмотрим основные характеристики Java.
Конфликт Oracle и Google
Java была создана компанией Sun, которая позже была выкуплена компанией Oracle и по сей день принадлежит ей. По этой причине, для многих компаний использование Java создает некоторые проблемы.
У Google возникли проблемы, когда Oracle начали с ними судебное разбирательство за использование Java в Android. Из-за этого Google очень активно принял Kotlin, который появился независимо. Java является проприетарной. Но есть виртуальная машина Oracle, а также открытая виртуальная машина Java (open JVM), которая используется в Linux и написана в open source. Иногда существуют некоторые несовместимости, но в последнее время их все меньше и меньше.
Кстати, Google так и не смог полностью отказаться от Java. В Dalvik, который используется как ядро в Android, вшит JVM. Возможно от этого уйдут, но сделать это будет очень сложно т.к. практически вся экосистема Android построена на Java — прежде всего — на использовании модернизированного JVM. И это, в какой-то момент, тоже было причиной конфликта между Oracle и Google, потому что Oracle запрещает просто так модернизировать JVM. Это самая важная часть Java. А сам язык можно использовать практически без ограничений.
Java vs node.js: производительность и ресурсоемкость
Прежде всего стоит отметить, что производительность Java намного выше чем у JS, и, соответственно, node.js.
Производительность node.js и Java
Если запустить какую-то простую задачу, вроде возведения в квадрат, то в тестах показатели могут различаться до 10 раз. Если запустить циклы в миллионы задач калькуляции, Java практически всегда будет превосходить node.js. Плюс, огромное различие между Java и node.js в том, что node является однопоточным, это является как его преимуществом, так и недостатком с другой стороны.
Java умеет работать с потоками, которые поддерживаются на уровне ОС, и получается, что программа написанная на Java наиболее полно использует возможности ОС. И если нужно написать высоконагруженное приложение, которое будет использовать большое количество вычислений, то Java для этого однозначно подойдет лучше. Проблема в том, что даже маленький сервер написанный на Java будет занимать много памяти — как на диске, так и оперативной.
Node.js является легковесным за счет архитектуры построенной на обработке событий. Он построен для работы в качестве веб-сервера и очень хорошо справляется с обслуживанием легковесных задач. Например, простой запрос вроде расчета чего-либо, или записи в базу данных происходит очень быстро. А если запросов становится очень много и мы хотим масштабировать систему в node, можно использовать веб-сервер Nginx или Apache. Можно завести много одинаковых инстансов node. Тогда все будет распределяться через балансировку нагрузки по round-robin. Если мы запустим 8 инстансов node на 16 ядер соответственно, ОС сама распределит инстансы между ядрами. Node этим не управляет, у него будет один поток.
Управление потоками в Java и node.js
В Java мы можем создать приложение и запустить в нем 8 потоков. За счет того, что происходит более тесное взаимодействие с ОС, можно распределить нагрузку.
Как известно, один из веб-серверов написанных на Java — это tomcat. Там можно четко проследить, что когда пользователь делает запрос, запускаются дополнительные потоки. А когда приходит запрос на node, цикл событий (event loop) будет обработан и отправлен обратно, затем придет следующий запрос. И за счет того, что мы не ждем результатов первого, он тоже будет подхвачен. Пока запросы легковесные, все хорошо. Однако, когда производится тяжелое вычисление, при наличии одного инстанса, node останавливается и наступает тайм-аут.
Управление потоками в Java
На node можно прописать буквально несколько строк кода и получить простейший веб-сервер. Естественно, для более широкого функционала, где будут нотификации, авторизации, логирование и т.д. это сложнее реализовать, но существуют фреймворки которые позволяют решать такие вопросы.
Управление потоками в node.js
На Java есть развитое API — concurrency api, которое позволяет работать с конкурентными потоками. Но в то же время, это является и одной из проблем т.к. конкурентность это очень сложная штука и далеко не каждый разработчик хорошо в этом разбирается.
Веб, REST API — это стихия node, и иногда именно его и используют. Но если мы имеем дело со сложными калькуляциями, все же лучше использовать Java.
Мой проект на Java
На Java у меня был интересный проект — распределенное приложение, основной задачей которого была обработка больших объемов графической информации для дальнейшего использования в каталогах. При создании каталога необходимо подготовить наборы большого количества изображений различных разрешений, которые будут использованы при создании каталога. Проще говоря — это приложение для автоматизации предпечатной подготовки каталога.
Раньше фотографам приходилось делать все вручную. Для начала нужно было использовать какое-то небольшое приложение для того, чтобы загрузить свои изображения. Далее, специалист создававший каталог должен был разработать структуру каталога через другое приложение. Потом, в другом приложении, создавался воркфлоу, который раскидывал картинки в ту структуру, которая была создана. В общем, процесс был довольно тяжелым. Использовался ImageMagick который есть на Linux, Windows, MacOS. Мы имели дело с Linux.
Что-то из этого проекта все же можно было перенести на node, но некоторые вещи все равно пришлось бы делать на Java, т.к. там было много различных вычислений. В принципе, мы могли сделать части на node, которые бы вызывали определенные части на Java и использовать микросервисную архитектуру. Можно было использовать смешанный вариант. Но этот подход не всегда работает, т.к. разработчик специализирующийся на node, может не являться специалистом в Java и наоборот. А найти универсальных разработчиков гораздо сложнее.
Из опыта на node.js
Был проект по организации большого объема данных. Чем-то похоже на проект описанный выше. Только здесь у нас загружается файл, который содержит большой набор информации и подлежит валидации через сторонний сервис (написанный на java), несколько раз и по разным правилам. Нужно было обрабатывать сотни гигабайт информации, а node для этого не предназначен.
Проектировать архитектуру системы было особенно интересно, т.к. приложение состояло из нескольких микросервисов, в том числе сторонних. При работе со сторонним сервисом, который осуществлял валидацию, мы использовали RabbitMQ message broker. Мы отдавали стороннему серверу необходимую информацию и получали сообщение от RabbitMQ после окончания валидации, затем данные обрабатывались по частям, чтобы избежать out of memory.
И если изначально приложение обрабатывало файл, содержащий 10000 записей, то теперь может обрабатывать до миллиона. Нам все же удалось решить эту задачу с помощью node.js, хотя на Java ее можно было решить проще, однако заказчик хотел использовать именно node, т.к. нужна была единая инфраструктура и архитектура с микросервисами написанными на JS. Используя node решить задачу было намного сложнее, и потребовало больше времени, но node.js выигрывает за счет скалируемости. Именно поэтому сейчас мы можем наращивать количество воркеров и обрабатывать все больше и больше данных. На Java это происходило бы сложнее.
На самом деле, любую задачу можно решить и так и так, но тут стоит повториться: если есть много вычислений то лучше использовать Java, если вычислений не много, можно смело использовать node.
Итоги и перспективы: сможет ли node.js обогнать Java?
Сейчас идет к тому, что node.js часто будет использоваться как обертка, а начинку будут писать на других языках. Его недостатки давно известны. Например, такой условный недостаток как однопоточность уже исправлен. В последней версии node представлена возможность использования нескольких потоков.
Java изначально создавалась как легковесное решение заменяющее C++, а теперь стала тяжеловесной. Это как эволюция. Возможно, когда-нибудь появится что-то, что заменит и node.
Модули — Развитие Java vs node.js
node.js для Java-разработчиков: первые шаги
У опытного программиста, сталкивающегося с новой технологией для решения конкретной прикладной задачи, сразу возникает множество практических вопросов. Как правильно установить платформу? Где и что будет лежать после установки? Как создать каркас проекта, как он будет структурирован? Как разбивать код на модули? Как добавить библиотеку в проект? Где вообще взять готовую библиотеку, которая делает то, что нужно? Как и в чём отлаживать код? Как написать модульный тест?
Ответы на эти вопросы можно при желании легко найти в сети, но придётся перечитать дюжину статей, и на каждый вопрос ответов будет, скорее всего, несколько. Некоторое время назад мне понадобилось написать небольшой туториал по node.js, который бы позволил быстро запустить разработку и познакомить новых программистов в проекте с этой технологией. Рассчитан он на опытных Java-разработчиков, которые и язык JavaScript хорошо знают, но node.js как платформа для бэкэнда для них в новинку.
Думаю, что данная статья будет полезна не только разработчикам из мира Java, но и всем, кто начинает работу с платформой node.js.
Установка и настройка
Установка node и npm
Windows
Установка node.js под Windows производится с помощью msi-инсталлятора. Для его загрузки нужно перейти на сайт https://nodejs.org и щёлкнуть «Install». После скачивания инсталлятора (файл с именем вида node-v0.12.4-install.msi) необходимо запустить его и следовать инструкциям по установке.
По умолчанию под Windows node.js устанавливается в папку c:\Program Files\nodejs. Также по умолчанию устанавливаются все компоненты (собственно node.js, пакетный менеджер npm, ссылка на документацию; кроме того, путь к node и npm прописывается в переменную среды PATH). Желательно убедиться, что все компоненты установки выбраны.
В OS X проще всего установить node через менеджер пакетов brew. Для этого необходимо выполнить команду:
Node установится в папку /usr/local/Cellar/ /node с постоянным симлинком /usr/local/opt/node/.
Ubuntu (x64)
Для установки последней ветки (0.12) лучше скачать дистрибутив с сайта:
Дистрибутив распакуется в папку /usr/local в подпапки bin, include, lib и share.
Проверка установки
Установка плагина в IntelliJ IDEA
Запустим IntelliJ IDEA, зайдём в настройки.
Найдём раздел Plugins и щёлкнем «Install JetBrains Plugin. »
Найдём в списке плагин NodeJS, щёлкнем по кнопке «Install Plugin». По окончании загрузки кнопка превратится в «Restart IntelliJ IDEA» — щёлкнем её для перезагрузки среды.
В разделе «Sources of node.js Core Modules» щёлкнем кнопку «Configure». В появившемся окне выберем «Download from the Internet» и щёлкнем «Configure», при этом скачаются и проиндексируются исходники node.js. Это позволит просматривать исходники при разработке.
В разделе packages отображаются глобально установленные пакеты (см. раздел «Глобальные пакеты»). В этом окне можно добавлять, удалять и обновлять эти пакеты. Если рядом с именем пакета отображается синяя стрелочка, значит, доступно обновление. Глобально лучше устанавливать только пакеты-утилиты.
Первые шаги
Пишем «Hello World»
Создадим файл app.js, который формирует и выводит соответствующую строчку в консоль:
Запустим его командой:
Используем REPL
Запустив команду node без аргументов, можно попасть в REPL-цикл, аналогичный браузерной JS-консоли. В нём можно выполнять и проверять фрагменты кода:
Каждая выполненная строчка имеет возвращаемый результат, который также выводится в консоль. Функция console.log() не возвращает результата, поэтому после её вызова в консоли вывелось «undefined».
В REPL-консоли работает автодополнение по нажатию клавиши Tab. Например, если написать «console.» и нажать Tab, то отобразится список атрибутов и функций объекта console.
Для выхода из консоли можно нажать Ctrl+D.
Работа с npm
Инициализация проекта
Для инициализации проекта выполним в каталоге будущего проекта команду npm init и введём необходимые данные в интерактивном режиме (можно просто нажимать Enter, так как предлагаются внятные настройки по умолчанию):
По окончании выполнения утилиты в текущем каталоге будет создан файл package.json, описывающий конфигурацию проекта. В нём же будет храниться информация о зависимостях проекта.
Добавление пакетов-зависимостей в проект
После выполнения этой команды обнаружим, что в текущем каталоге появилась папка node_modules\open, а в файле package.json добавилась запись:
Запись о зависимости можно добавить в файл package.json и вручную, но после этого необходимо выполнить npm install, чтобы загрузить указанную зависимость в каталог node_modules.
Глобальные пакеты
Пакеты можно устанавливать как в каталог проекта, так и глобально, тогда они будут видны для всех проектов. Как правило, глобально устанавливаются только пакеты, являющиеся утилитами, например, утилита управления зависимостями bower, сборщики gulp и grunt, генератор проектов на Express express-generator, и т.д.
Глобальные пакеты устанавливаются:
Работа в IntelliJ IDEA
Открытие проекта
Чтобы открыть проект на node.js, достаточно открыть папку, содержащую package.json.
Настройка конфигурации запуска
Заполним поля Name и JavaScript File:
Теперь можно запускать скрипт в обычном режиме и в режиме отладки с помощью соответствующих кнопок на панели инструментов:
Отладка
Для отладки необходимо запустить созданную конфигурацию в режиме Debug. При этом можно ставить брейкпойнты на строки, «шагать» по строкам, смотреть содержимое стека вызовов, значения переменных в текущем контексте и делать всё прочее, что ожидается от отладочного режима.
Модульность в node.js
В Java единицами модульности являются пакеты и классы. Единицей модульности в node.js является файл. Чтобы сделать импорт одного модуля в другой, используется модуль-локальная (т.е. неявно определённая в каждом модуле) функция require(). Стандартные модули или пакеты, установленные в node_modules, можно импортировать по простому имени:
В переменную http будет помещён объект, который был экспортирован модулем http.
Всё, что объявлено в файле модуля, видно только внутри него — за исключением того, что мы явно экспортируем. Например, в отличие от JavaScript в браузере, область видимости переменной, объявленной на верхнем уровне, ограничена тем модулем, в котором она объявлена:
Переменная enterprise будет видна только внутри модуля mymodule.js.
Чтобы экспортировать что-либо из модуля, можно использовать доступный в любом модуле атрибут module.exports, который по умолчанию содержит в себе пустой объект. Можно также использовать сокращённую ссылку на него — модуль-локальную переменную exports. Функция require(), которой передано имя нашего модуля, будет возвращать то, что мы поместили в module.exports. Соответственно, если мы поместим туда такой объект:
То именно его вернёт функция require, будучи вызванной в другом модуле:
Полученный объект mymodule — это тот же самый объект с функцией fun, который был присвоен атрибуту module.exports в нашем модуле.
Однако подобным способом сделать экспорт не получится:
Это связано с тем, что из модуля всегда экспортируется атрибут module.exports. Заменив сокращённую ссылку exports на другой объект, мы не изменили этот атрибут. Сокращённая ссылка exports может быть использована только для экспорта каких-то отдельных функций или атрибутов:
Тестирование
Mocha
Для добавления модульного тестирования в проект лучше всего начать с фреймворка Mocha. Устанавливается он как глобальный npm-модуль:
Протестируем модуль с простейшей функцией:
Тесты mocha по умолчанию размещаются в подпапке test:
Первый аргумент функции describe — это человекочитаемое описание поведения тестируемой функции или модуля, которое будет выводиться в консоль при прогоне тестов. Здесь желательно придерживаться некоторых структурных соглашений — например, в первом describe указывается имя модуля, во вложенном — имя тестируемой функции. Запустим mocha и убедимся, что тест нашей функции проходит:
Использование Mocha в IntelliJ IDEA
В окне настройки конфигурации запуска укажем название этой конфигурации (Name), а также путь к папке с тестами (Test directory). Сохраним конфигурацию.
Изменим код функции так, чтобы он не проходил, и выполним (Run) конфигурацию запуска Mocha.
Теперь щёлкнем кнопку Toggle auto-test в появившейся панели. Эта кнопка включает режим автоматического прогона тестов при изменении исходников.
Исправим код функции, при этом Mocha автоматически прогонит тест и покажет, что теперь всё хорошо: