V8 может работать автономно или может быть интегрирован в любое приложение C++. Благодаря этому вы можете написать свой собственный код на C++ и сделать его доступным для JavaScript.
Чем хорош Node.js и зачем он нужен
Веб-технологии постоянно развиваются. Так что появление HTML5 буквально многое изменило. Браузеры с поддержкой HTML5 очень изменчивы, каждое обновление вносит свои коррективы. И все это требует современных инструментов для разработки интерактивных решений.
Платформа Node.js является одним из самых известных обязательных инструментов для разработчиков программных решений на JavaScript. Это очень просто и интуитивно понятно даже для начинающих программистов. При этом Node.js позволяет работать с серверными технологиями, реализовывать интерактивную работу, используя вычислительные мощности пользователей. Помимо прочего, эта платформа позволяет запускать код из командной строки любой из распространенных операционных систем.
Сегодня Node по праву считается одной из лучших платформ веб-разработки, и большинство веб-инструментов, как серверных, так и клиентских, работают на этом инструменте. Но давайте посмотрим поближе. И начнем с истории Node.js.
Самый непонятый разработчиками язык
Возможно, вы слышали, что JavaScript был создан Mozilla в 90-х, но мало кто знает, что он планировался как один из простых скриптовых языков для встраивания в HTML-код. Изначально JavaScript был придуман, чтобы «связать» в единое целое различные части веб-страниц: изображения, Java-апплеты, HTML-разметку и плагины. Этот инструмент был предназначен для веб-дизайнеров и верстальщиков. Ему просто нужно было облегчить и ускорить свою работу.
Но оказалось, что разработчики увидели совсем другое применение JavaScript и начали использовать его для предоставления интерактивных функций. Таким образом, самый непонятый язык программирования стал одним из самых популярных в мире.
С развитием веб-технологий требовалось все больше и больше инструментов для обеспечения взаимодействия с пользователем. В результате JavaScript приобрел большое количество стандартных и внешних библиотек, модулей и фреймворков из коробки. Все это требовало специализированных решений и компиляторов. Так, в числе прочих, появилась платформа Node.js, быстро завоевавшая популярность среди разработчиков.
Для реализации Node.js использовался движок V8, который переводит команды JavaScript в двоичный код. Короче говоря, Node — это приложение C++, предназначенное для выполнения кода JavaScript и быстрого ввода-вывода даже на компьютере пользователя. В результате таких улучшений JavaScript становится полным и практически универсальным ЯП. Те. С помощью этого JavaScript-решения вы можете писать, в том числе, различные приложения для компьютера.
Но оказалось, что разработчики увидели совсем другое применение JavaScript и начали использовать его для предоставления интерактивных функций. Таким образом, самый непонятый язык программирования стал одним из самых популярных в мире.
В чём преимущество Node?
Узел легче масштабировать. При одновременном подключении к серверу тысяч пользователей Node работает асинхронно, то есть более разумно расставляет приоритеты и распределяет ресурсы. Java, например, выделяет отдельный поток для каждого соединения.
Node родился в 2009 году благодаря Райану Далю. До этого серверы использовали подход «один поток на соединение», и Даль разработал систему, основанную на событиях. То есть реагирует на действие или бездействие и выделяет на это ресурс. Основная цель Node — создание масштабируемых сетевых серверов.
Используют ли какие-либо крупные компании Node?
Конечно, вот неполный список:
eBay постепенно переходит на Node, как и веб-версия PayPal. В 2012 году LinkedIn перешел с Ruby On Rails на Node и сразу ощутил преимущества этой платформы: 27 серверов показали прирост скорости в 20 раз.
Что я могу написать на Node?
Полная программа для Интернета, Linux, OS X и Windows.
А если подробнее?
Без проблем. Node удобен для создания API — удобные библиотеки вроде Loopback уже существуют.
На этом языке можно писать кроссплатформенные приложения; Наряду с настольными и мобильными устройствами Node помогает достичь синхронности. Например, когда вы набираете сообщение с телефона, оно тут же появляется на вашем ноутбуке и в Интернете.
eBay постепенно переходит на Node, как и веб-версия PayPal. В 2012 году LinkedIn перешел с Ruby On Rails на Node и сразу ощутил преимущества этой платформы: 27 серверов показали прирост скорости в 20 раз.
Чем хорош Node.js
Если вы начали изучать программирование, вы поймете концепцию последовательного выполнения программ. Сначала выполняется первая строка, затем вторая, затем третья и так далее. Может где-то программа прыгает туда-сюда, где-то зацикливается, но в целом работает линейно.
У JS есть хитрость: он может выполнять код параллельно (условно говоря). Программисты называют это обработкой событий. Вы можете сказать программе: «Если это когда-нибудь случится, сделайте там эту функцию, она знает, что делать». Многие из этих событий можно предвидеть; получается, что процессы кажутся параллельными. Программа может сидеть сложа руки и ждать, пока что-то произойдет.
Также процессы асинхронны: программа может что-то запросить в начале задания, например, что-то запросить из базы данных. И пока база данных чешется, программа Node.js будет заниматься своими делами. И когда придет ответ, возьмет его и обработает.
При разработке любой программы Node.js могут быть сотни таких параллельных событий и обработчиков. Чтобы ни одна из них не была покрыта одеялом, Node.js создает бесконечный цикл, в котором он предоставляет процессорное время каждой функции по кругу. В результате создается иллюзия, что они работают параллельно и не мешают друг другу, но на самом деле они жестко контролируются самой платформой.
Именно такое равномерное распределение всего в цикле событий дает Node.js преимущество при создании серверных приложений.
Пример: веб-сервер на Node.js
Как работает обычный веб-сервер
Раньше была такая проблема:
- На странице, например, следует отображать аватарку и никнейм пользователя.
- Для этого сервер сделал запрос к базе данных, чтобы получить оттуда эту информацию.
- Пока база не ответит, сервер ничего не может сделать, он терпеливо ждет.
- Сервер ждет.
- Когда приходит ответ от базы с изображением и ником, сервер оживает, продолжает загружать страницу и, наконец, запрашивает у базы фоновое изображение для сайта.
- Сервер ждет
- Страница тоже не работает, так как не до конца загрузилась. Половина скриптов тоже не работают, потому что ждут полной загрузки страницы. Все ждут ответа базы.
- Для каждого такого запроса требуются ресурсы для поддержания соединения с базой данных.
- Если таких запросов много, то ресурсы на сервере быстро исчерпываются и тогда сайт начинает тормозить у всех сразу.
- Сервер начинает падать и иногда падает с ошибкой. Страницы падают, пользователи сходят с ума и уходят в другое место.
В «Яндекс Практикуме» вы можете стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатна, чтобы попробовать и найти то, что вам нравится. Затем идут программы занятости.
Цикл событий JavaScript
Если у вас есть 26 минут, посмотрите отличное видео с объяснением цикла событий узла:
Если нет, вот пошаговое объяснение того, как цикл событий работает в JavaScript:
1. Отправить main() в стек вызовов.
2. Отправить console.log() в стек вызовов. Сразу запускается и появляется.
3. Отправить setTimeout(2000) в стек setTimeout(2000) — это API узла. Когда мы вызываем его, мы регистрируем пару событие-обратный вызов. Событие будет ждать 2000 миллисекунд перед вызовом обратного вызова.
4. После регистрации setTimeout(2000) появляется в стеке вызовов.
5. Таким же образом прописывается второй setTimeout(0). Теперь у нас есть два API узла, ожидающих выполнения.
6. После ожидания 0 секунд setTimeout(0) переходит в очередь обратного вызова, как и setTimeout(2000).
7. В очереди выполнения обратного вызова функции ожидают, что стек вызовов будет пуст, поскольку в каждый момент времени может выполняться только одна функция. Это обеспечивает цикл событий.
8. Вызывается последний console.log() и main() из стека вызовов.
9. Цикл обработки событий видит, что стек вызовов пуст, а очередь обратного вызова — нет. Поэтому он помещает обратные вызовы (по порядку) вверх по стеку вызовов для выполнения.
Это библиотеки, созданные сообществом. Они решат наиболее распространенные проблемы npm (Node Package Manager) содержит пакеты, которые вы можете использовать в своих приложениях, чтобы сделать вашу разработку более быстрой и эффективной.
Require
Require выполняет три функции:
Загружайте модули, поставляемые с Node.js, например из файловой системы или HTTP, из API Node.js.
Он загружает сторонние библиотеки, такие как Express и Mongoose, которые вы устанавливаете из npm.
Он позволяет создавать собственные файлы и разбивать проект на модули.
Require — это функция, которая принимает параметр маршрута и возвращает module.exports.
Если вы начали изучать программирование, вы поймете концепцию последовательного выполнения программ. Сначала выполняется первая строка, затем вторая, затем третья и так далее. Может где-то программа прыгает туда-сюда, где-то зацикливается, но в целом работает линейно.
Установка
Фреймворк Node.js можно установить несколькими способами:
Также есть несколько вариантов развертывания приложений:
- создание локального туннеля с помощью ngrok или localtunnel;
- платформы для прототипирования и демонстрации: Glitch, Codepen; – бессерверная публикация с использованием Serverless Framework или стандартной библиотеки; -решения на любой вкус: Zeit, Nanobox, Heroku, Azure, Google Cloud;
- Виртуальный выделенный сервер: Digital Ocean, Linode, Amazon Web Services; .
Обычно мы запускаем файлы сценариев с помощью Node.js, но его также можно использовать в режиме REPL.
Установка и обновление пакетов
Менеджер пакетов Node.js выполняет всю работу по загрузке и установке внешних зависимостей проекта. Все файлы загружаются в папку node_modules.
Команду можно выполнить с разными параметрами:
- —save сохраняет пакет в разделе зависимостей файла package.json. Это означает, что он необходим для полной функциональности готового приложения.
- —save-dev: Сохранить в раздел devDependencies, т.е в список зависимостей, необходимых для разработки (например, для тестирования).
- -g — глобальная установка. Узнать, куда именно будет установлен глобальный пакет, можно с помощью команды npm root -g .
Вы также можете указать конкретную версию:
npm установить -g веб-пакет @ 4.16.4
package.json
Файл package.json является ключевым элементом приложений Node.js. Это своего рода манифест проекта, который включает в себя множество важных данных о нем:
- name — имя приложения или пакета, а также имя папки, в которой он хранится;
- лицензия – тип лицензии;
- автор — автор. Здесь вы можете указать имя (name), почту (email), адрес сайта (url);
- налогоплательщики — иные участники разработки;
- версия — текущая версия;
- описание – краткое описание;
- ключевые слова — ключевые слова;
- домашняя страница — веб-страница проекта;
- репозиторий — репозиторий;
- main — точка входа;
- private: установка значения true предотвращает случайную публикацию в npm;
- scripts — это набор команд с псевдонимами, которые можно запускать из терминала, например npm run ;
- зависимости — список зависимостей проекта;
- devDependencies — список зависимостей разработки;
- двигатели — версия Node;
- список браузеров: поддерживаемые браузеры (или их версии);
- баги: ссылка на трекер ошибок;
- определенные свойства, такие как eslintConfig , babel и другие с различными конфигурациями инструментов.
Программирование на Node.js
Hello world
Простой веб-сервер будет служить традиционным приложением helloworld.
Модуль http обеспечивает работу в сети.
Сохраните этот файл как server.js и назовите его:
После запуска сервера выполнится обратный вызов метода слушателя, и в консоли появится сообщение.
Если вы отправляете запрос на сервер (открыв страницу http://127.0.0.1:3000 в браузере), событие запроса будет запущено, а обратный вызов, настроенный при его создании, будет запущен. Функция получит объект запроса с заголовками и другими данными, а также объект ответа, который будет возвращен клиенту после установки необходимых параметров.
Импорт и экспорт
Платформа Node.js позволяет разбивать функциональность приложения на модули и включать их по мере необходимости. Чтобы импортировать модуль, используйте конструкцию require:
Здесь адрес относится к текущему каталогу.
Все в файле модуля по умолчанию скрыто от внешнего кода, поэтому вам нужно специально указать, какие функции будут доступны с помощью module.exports :
Импорт будет выглядеть так:
Переменные окружения и аргументы командной строки
Все переменные среды доступны как свойства объекта process.env, а аргументы, переданные из терминала, сохраняются в process.argv :
Ввод и вывод данных
Объект консоли работает с основным потоком вывода, аналогично консоли браузера.
Другие полезные методы объекта консоли :
- ясно — очищение;
- count — количество предметов;
- трассировка: получить стек вызовов;
- time и timeEnd — отсчет времени;
- ошибка — вывод в поток stderr.
Модуль readline обеспечивает доступ к входному потоку process.stdin.
После того, как пользователь введет свое имя, программа отправит ему приветствие и завершит работу.
Пакет Inquirer.js обеспечивает расширенную обработку пользовательского ввода.
Выход из программы
Закрыть программу можно не только из терминала комбинацией ctrl+c, но и прямо из кода.
- радикальным способом является принудительная остановка процесса с прерыванием всех операций. В этом случае необходимо указать код выхода.
- отправлять уведомления процессу — сигналы POSIX
HTTP-запросы и веб-сокеты
За обычные HTTP-запросы отвечает уже известный нам по примеру helloworld модуль http, который умеет не только создавать серверы. Он имеет множество полезных свойств и методов, которые можно найти в документации.
Альтернативой HTTP являются веб-сокеты, реализованные в библиотеке Node ws.
Вы можете увидеть живой пример на Glitch.
Работа с файлами
Встроенный модуль fs отвечает за взаимодействие с файловой системой. Он предоставляет большое количество методов для получения информации, чтения, записи и перезаписи и многих других операций. Вы можете найти полный список доступных действий в официальной документации. Почти все методы являются асинхронными, но у них есть синхронный аналог.
При работе с файловой системой необходимо иметь дело с путями к файлам и папкам. Это обрабатывается модулем маршрута.
Модуль os
Платформа Node.js может взаимодействовать с операционной системой компьютера; за это отвечает модуль os.
Потоки
Потоки в Node.js — это эффективный способ обработки больших объемов данных «порциями» без сохранения их в памяти. Модуль потоковой передачи обеспечивает основу для всех API потоковой передачи.