Программа node js что это

Node.js как среда выполнения JS

Node или Node.js — это программная платформа, основанная на движке V8 и превращающая JavaScript из узкоспециализированного языка в язык общего назначения. Представляет собой среду выполнения кода на JavaScript, которая позволяет транслировать вызовы на языке JavaScript в машинный код.

Чаще всего эту платформу используют для создания веб-сервисов, требующих интенсивного обмена информацией с пользователями, в том числе, для реализации чатов, систем совместной работы, социальных сетей и т.д. Многие программы, созданные на Node.js, состоят из серверной и клиентской частей. С применением Node.JS приложение, написанное на JavaScript, может обращаться к широкому перечню глобальных объектов, в том числе document или window , к винчестеру и файловой системе пользователя, а также к библиотекам и программным решениям, находящимся на компьютере, что заметно расширяет возможности взаимодействия.

Node.js использует модульную систему, т. е. вся встроенная функциональность разбита на отдельные пакеты или модули — блоки кода, которые могут использоваться повторно в других модулях (подробнее см. Модули в JavaScript).

Документация по платформе Node.JS размещена на сайте https://nodejs.org .

Node.js позволяет JavaScript:

  1. обеспечивать создание серверных приложений, в т. ч.:
    • взаимодействовать с устройствами ввода-вывода через API, написанный на C++;
    • подключать другие внешние библиотеки, написанные на разных языках, передавая вызовы к ним из JavaScript-кода;
    • разрабатывать десктопные оконные приложения (при помощи NW.js, AppJS или Electron для Linux, Windows и macOS);
    • программировать микроконтроллеры (например, tessel, low.js и espruino).

    В основе Node.js лежит событийно-ориентированное и асинхронное (или реактивное) программирование с неблокирующим вводом/выводом.

    Javascript называют “однопоточным”, имея ввиду, что только одна инструкция исполняется в каждый момент времени ( подробнее о работе движка JavaScript). Один вызов функции имеет ровно один контекст выполнения, связанный с ним. При этом в каждый момент времени в Javascript активен только один контекст выполнения.

    Node.JS позволяет нивелировать однопоточность JS: пока Node.js ждет выполнения кода и вызова функции, он может решать какие-то другие задачи (при этом поток в ожидании запроса блокироваться не будет). Таким образом, приложение может обратиться с запросом к базе данных сервера, а пока ожидается ответ, обработать какие-то другие запросы. Это заметно ускоряет обмен информацией с сервером и, как итог, работу браузерного приложения.

    Node.js является открытым проектом, исходники которого можно посмотреть на github.com.

    Загрузка установочного пакета доступна на официальном сайте https://nodejs.org .

    Основные версии Node.js переходят в текущий статус выпуска (Current) на шесть месяцев, что дает авторам библиотек время добавить для них поддержку. По прошествии шести месяцев выпуски с нечетными номерами (9, 11 и т. д.) становятся неподдерживаемыми, а выпуски с четными номерами (10, 12 и т. д.) переходят в статус Active LTS и готовы к общему использованию ( подробнее . ). Статус выпуска LTS — «долгосрочная поддержка», который обычно гарантирует исправление критических ошибок в течение 30 месяцев. Рабочие приложения должны использовать только версии Active LTS или Maintenance LTS .

    Стек MEAN, MERN, MEVN

    При веб-разработке на разных уровнях стека могут использоваться разные языки программирования. Однако существуют стеки, использующие всего один язык программирования — JavaScript:

    1. MEAN — включает базу данных MongoDB, фреймворки Express.js и AngularJS, технологию Node.js;
    2. MERN — в качестве фронтенд-фреймворка используется React;
    3. MEVN — в качестве фронтенд-фреймворка используется VueJS.

    npm (node package manager)

    В состав Node.js входит собственный установщик пакетов npm (node package manager). Установка необходимого пользователю пакета производится при помощи команды:

    Все доступные для установки пакеты и их краткое описание выводятся командой:

    Этой же командой можно производить выборочный поиск пакетов.

    Инициализация проекта в Node.JS

    Для инициализации проекта и создания файла package.json , определяющего настройки проекта (зависимости верхнего уровня от других пакетов, скрипты, название и т.д.), npm запускается в корневой папке проекта командой npm init:

    npm init -y (флаг -y — настройки по умолчанию, для быстрой инициализации).

    Источник: flagman.top

    Что такое Node.js

    Node.js — это способ запускать JavaScript-код не только в браузере. Приложения, которые чаще всего создаются на этой платформе, можно разделить на две категории:

    • вспомогательные инструменты для клиентских приложений — системы сборки, распространения пакетов, серверы разработки, редакторы кода и системы статического анализа;
    • серверные приложения — начиная от простых API и заканчивая огромными корпоративными программами.

    Как пользоваться

    Установите Node.js на свой компьютер. Теперь в терминале можно выполнить команду, которая выведет текущую версию платформы и докажет, что все установлено корректно:

    node -v node -v Скопировать Скопировано Не удалось скопировать

    Node.js позволяет исполнить любой JavaScript-файл. Создадим демо-файл script . js :

    const whereIAm = __dirname// __dirname — глобальная переменная, хранящая папку, в которой лежит файл скрипта console.log(`I am at $`) const whereIAm = __dirname // __dirname — глобальная переменная, хранящая папку, в которой лежит файл скрипта console.log(`I am at $whereIAm>`) Скопировать Скопировано Не удалось скопировать

    Запустим его в терминале:

    node script.js node script.js Скопировать Скопировано Не удалось скопировать

    Как понять

    За выполнение JavaScript в браузере Google Chrome (и других браузерах основанных на Chromium — Edge, Яндекс.Браузер, Opera) отвечает движок V8, разработанный в Google. В 2009 году Райан Даль, в качестве эксперимента, создал платформу Node.js, которая использует V8 для выполнения JavaScript-кода вне браузера.

    В среде Node.js у приложения нет доступа к стандартным браузерным API. Например, document и window недоступны, потому что код исполняется вне браузера. Никаких документов и окон в его контексте не существует.

    Читайте также:
    Bitcop что это за программа

    Абсолютное большинство инструментов для JavaScript-разработки использует Node.js. Многие серверные приложения тоже используют её, в основном при серверном рендеринге клиентских приложений и создании API-гейтвеев.

    API-гейтвей — сервис с удобным клиенту API, который сам не выполняет никакой работы, а только вызывает другие сервисы, чтобы получить данные или совершить операцию. Ценность таких сервисов в удобном для клиентского кода API.

    Например, можно сделать простое приложение на Node.js, которое отвечает на все запросы одинаковым текстом. В первую очередь, для этого потребуется сторонний npm -пакет:

    npm init // инициализируем package.jsonnpm install express // добавим пакет для создания веб-приложений npm init // инициализируем package.json npm install express // добавим пакет для создания веб-приложений Скопировать Скопировано Не удалось скопировать

    Теперь нужно создать файл с кодом приложения, назовём его server . js :

    // express — фреймворк для создания веб-приложенийconst express = require(‘express’) // создаём express-приложениеconst app = express()// оно будет работать на определенном порту компьютераconst port = 3000 // если отправить GET-запрос на /, то получим ответ ‘Hello World!’app.get(‘/’, (req, res) => res.send(‘Hello World!’)>) // запускаем приложениеapp.listen(port, () => console.log(`Приложение запущено на http://localhost:$`)>) // express — фреймворк для создания веб-приложений const express = require(‘express’) // создаём express-приложение const app = express() // оно будет работать на определенном порту компьютера const port = 3000 // если отправить GET-запрос на /, то получим ответ ‘Hello World!’ app.get(‘/’, (req, res) => res.send(‘Hello World!’) >) // запускаем приложение app.listen(port, () => console.log(`Приложение запущено на http://localhost:$port>`) >) Скопировать Скопировано Не удалось скопировать

    Все готово к запуску! Исполним файл командой:

    node server.js node server.js Скопировать Скопировано Не удалось скопировать

    Если в браузере перейти на http : / / localhost : 3000 , то можно увидеть ответ веб-сервера.

    Особенности версионирования

    Версии в Node.js подчиняются некоторым правилам в зависимости от мажорной версии. Это первое число из полной версии. Например, для Node.js 16.13.1 мажорной версией будет 16.

    Нечётные версии (13, 15 и др.) являются экспериментальными. В них, как правило, появляются самые новые возможности, однако период поддержки таких версий всего полгода. Это важно, потому что в программах постоянно выявляются критичные ошибки или опасные уязвимости.

    Чётные версии (14, 16 и др.) через полгода разработки переходят в стадию LTS (от английского long-term support, долгосрочная поддержка). Это означает, что в течение 12 месяцев будет вестись активная разработка, будут добавляться новые возможности и исправляться ошибки. По окончании этих 12 месяцев ещё 18 месяцев будут исправляться критичные ошибки и проблемы с безопасностью.

    Таким образом, нечётные версии лучше не использовать, кроме случаев когда нужно попробовать новые возможности. В продакшене обязательно нужно использовать LTS версии — они наиболее стабильны и гарантируют, что 30 месяцев будут исправляться критичные уязвимости.

    На практике

    Игорь Камышев советует

    Часто система сборки проекта требует очень специфичной версии Node.js. Например, проект может собираться только на 10 версии. Чтобы не переустанавливать платформу каждый раз при смене проекта, был создан nvm — Node Version Manager. Это небольшая консольная программа, которая позволяет легко выбирать версию Node.js и произвольно менять её.

    С помощью nvm можно установить любую версию, просто выполнив команду:

    nvm install 10.10.0 nvm install 10.10.0 Скопировать Скопировано Не удалось скопировать

    И изменить используемую версию в любой момент времени с помощью команды:

    nvm 8.9.1 nvm 8.9.1 Скопировать Скопировано Не удалось скопировать

    Источник: doka.guide

    Всё что вам нужно знать о Node.js

    В наши дни платформа Node.js является одной из самых популярных платформ для построения эффективных и масштабируемых REST API’s. Она так же подходит для построения гибридных мобильных приложений, десктопных программ и даже для IoT.

    Я работаю с платформой Node.js более 6 лет и я на самом деле люблю её. Этот пост главным образом пытается быть путеводителем по тому, как Node.js работает на самом деле.

    Мир до Node.js

    Многопоточный сервер

    Веб-приложения, написанные следуя клиент/серверной архитектуре, работают по следующей схеме — клиент запрашивает нужный ресурс у сервера и сервер отправляет ресурс в ответ. В этой схеме сервер, ответив на запрос, прерывает соединение.

    Такая модель эффективна поскольку каждый запрос к серверу потребляет ресурсы (память, процессорное время и т.д.). Для того чтобы обрабатывать каждый последующий запрос от клиента, сервер должен завершить обработку предыдущего.

    Значит ли это, что сервер может обрабатывать только один запрос за раз? Не совсем! Когда сервер получает новый запрос он создаёт отдельный поток для его обработки.

    Поток, если простыми словами, это время и ресурсы, что CPU выделаят на выполнение небольшого блока инструкций. С учётом сказанного, сервер может обрабатывать несколько запросов одновременно, но только по одному на поток. Такая модель так же называться thread-per-request model.

    Для обработки N запросов серверу нужно N потоков. Если сервер получает N+1 запросов, тогда он должен ждать пока один из потоков не станет доступным.

    На рисунке выше, сервер может обрабатывать до 4 запросов (потоков) единовременно и когда он получает следующие 3 запроса, эти запросы должны ждать пока любой из этих 4 потоков не станет доступным.

    Один из способов избавиться от ограничений — добавить больше ресурсов (памяти, ядер процессора и т. д.) на сервер, но это не самое лучшее решение….

    И, конечно, не забываем о технологических ограничениях.

    Блокирующий ввод/вывод

    Ограниченное число потоков на сервере не единственная проблема. Возможно, Вам стало интересно почему один поток не может обрабатывать несколько запросов одновременно? всё из-за блокирующих операций ввода/вывода.

    Допустим, Вы разрабатываете онлайн магазин и Вам нужна страница где пользователь может просматривать список всех товаров.

    Пользователь стучится на http://yourstore.com/products и сервер рендерит HTML файл со всеми продуктами с базы данных в ответ. Совсем не сложно, да?

    Читайте также:
    Alcor micro usb card reader driver что это за программа

    Но, что же происходит за кулисами?

    • Когда пользователь стучится на /products особый метод или функция должна выполниться, что бы обработать запрос. Маленький кусочек кода (Ваш или фреймворка) анализирует URL-адрес запроса и ищет подходящий метод или функцию. Поток работает.
    • Теперь нужный метод или функция выполняется, так как и в первом пункте — поток работает.
    • Так как Вы хороший разработчик, Вы сохраняете все системные логи в файл, ну и конечно же, что бы быть уверенными, что роутер выполняет нужный метод/функцию — Вы так же логируете строку “Method X executing!!». Но всё это блокирующие операции ввода/вывода. Поток ждёт.
    • Все логи сохранены и следующие строки функции выполняются. Поток работает снова.
    • Время обращаться к базе данных и получать все продукты — простой запрос, вроде SELECT * FROM products , выполняет свою работу, но угадайте что? Да-да, это блокирующая операция ввода/вывода. Поток ждёт.
    • Вы получили массив или список всех продуктов, но убедитесь, что Вы всё это залогировали. Поток ждёт.
    • Теперь у Вас есть все продукты и пришло время рендерить шаблон для будущей страницы, но перед этим Вам нужно их прочитать. Поток ждёт.
    • Движок рендеринга делает свою работу и шлёт ответ клиенту. Поток работает снова.
    • Поток свободен, словно птица в небесах.

    На сколько медленны операции ввода/вывода? Ну это зависит от конкретной. Давайте обратимся к таблице:

    Операции сети и чтения с диска слишком медленные. Представьте сколько запросов или обращений к внешним API ваша система могла бы обработать за это время.

    Подбивая итоги: операции ввода/вывода заставляют поток ждать и тратить ресурсы впустую.

    Проблема C10K

    Проблема

    C10k (англ. C10k; 10k connections — проблема 10 тысяч соединений)

    В ранние 2000-е, серверные и клиентские машины были медленными. Проблема возникала при параллельной обработке 10 000 клиентских соединений к одной машине.

    Но почему традиционная модель thread-per-request (поток на запрос) не могла решить эту проблему? Что ж, давайте используем немного математики.

    Нативная реализация потоков выделаят больше 1 Мб памяти на поток, выходя из этого — для 10 тысяч потоков требуется 10 Гб оперативной памяти и это только для стека потоков. Да, и не забывайте, мы в начале 2000-х!!

    В наши дни серверные и клиентские компьютеры работают быстрее и эффективней и почти любой язык программирования или фреймворк справляются с этой проблемой. Но фактически проблема не исчерпана. Для 10 миллионов клиентских соединений к одной машине проблема возвращается вновь (но теперь она C10M Problem).

    JavaScript спасение?

    Осторожно, спойлеры.
    Node.js на самом деле решает проблему C10K… но как?!

    Серверный JavaScript не был чем-то новым и необычным в начале 2000-х, на тот момент уже существовали реализации поверх JVM (java virtual machine) — RingoJS и AppEngineJS, что работали на модели thread-per-request.

    Но если они не смогли решить проблему, тогда как Node.js смог?! Всё из-за того, что JavaScript однопоточный.

    Node.js и цикл событий

    Node.js

    Node.js это серверная платформа, что работает на движке Google Chrome — V8, который умеет компилировать JavaScript код в машинный код.

    Node.js использует событийно-ориентированную модель и неблокирующую ввод / вывод архитектуру, что делает его легковесным и эффективным. Это не фреймворк, и не библиотека, это среда выполнения JavaScript.

    Давайте напишем маленький пример:

    Non-blocking I/O

    Node.js использует неблокирующие ввод/вывод операции, что же это значит:

    • Главный поток не будет блокироваться операциями ввода/вывода.
    • Сервер будет продолжать обслуживать запросы.
    • Нам придётся работать с асинхронным кодом.

    Давайте напишем пример, в котором на запрос к /home сервер в ответ шлёт HTML страницу, а для всех других запросов — ‘Hello World’. Что бы отослать HTML страницу сначала ее нужно прочитать из файла.

    Если запрашиваемый url-адрес /home , тогда используется нативный модуль fs для чтения файла home.html .

    Функции что попадают в http.createServer и fs.readFile как аргументы — колбэки. Эти функции будут выполнены в какой-то из моментов в будущем (Первая, как только сервер получит запрос, а вторая — когда файл будет прочитан с диска и помещён в буфер).

    Пока файл считывается с диска, Node.js может обрабатывать другие запросы и даже считывать файл снова и всё это в одном потоке… но как?!

    Цикл событий

    Цикл событий — это магия, которая происходит внутри Node.js. Это буквально бесконечный цикл и на самом деле один поток.

    Libuv — C библиотека которая реализует этот паттерн и является частью ядра Node.js. Вы можете узнать больше о libuv здесь.

    Цикл событий имеет 6 фаз, каждое исполнение всех 6 фаз называют tick-ом.

    • timers: в этой фазе выполняются коллбэки, запланированные методами setTimeout() и setInterval() ;
    • pending callbacks: выполняются почти все коллбэки, за исключением событий close , таймеров и setImmediate() ;
    • idle, prepare: используется только для внутренних целей;
    • poll: ответственен за получение новых событий ввода/вывода. Node.js может блокироваться на этом этапе;
    • check: коллбэки, вызванные методом setImmediate() , выполняються на этом этапе;
    • close callbacks: например, socket.on(‘close’, . ) ;

    Хорошо, есть только один поток, и этот поток и есть цикл событий, но тогда кто выполняет все операции ввода/вывода?

    Обратите внимание.
    Когда циклу событий нужно выполнить операцию ввода/вывода он использует поток ОС с тредпула (thread pool), а когда задача выполнена, коллбэк ставится в очередь во время фазы pending callbacks.

    Разве это не круто?

    Проблема CPU-ёмких задач

    Node.js кажется идеальным! Вы можете создавать всё, что захотите.

    Давайте напишем API для вычислений простых чисел.

    Простое число — это целое (натуральное) число больше единицы и делимое только на 1 и на само себя.

    Дано число N, API должен вычислять и возвращать первые N простых чисел в список (или массив).

    prime.js это реализация нужных вычислений: функция isPrime проверяет является ли число простым, а nthPrime возвращает N таких чисел.

    Читайте также:
    Лев что за программа

    Файл же index.js отвечает за создание сервера и использует модуль prime.js для обработки каждого запроса на /primes . Число N прокидывается через строку запроса в URL-адресе.

    Что бы получить первых 20 простых чисел нам нужно сделать запрос на http://localhost:8080/primes?n=20 .

    Предположим, к нам стучатся 3 клиента и пытаются получить доступ к нашему не блокирующемуся вводом/выводом API:

    • Первый запрашивает 5 простых чисел каждую секунду.
    • Второй запрашивает 1000 простых чисел каждую секунду
    • Третий запрашивает 10 000 000 000 простых чисел, но…

    Когда третий клиент шлёт запрос — главный поток блокируется и это главный признак проблемы CPU-ёмких задач. Когда главный поток занят исполнением «тяжёлой» задачи он становится недоступен для других задач.

    Но как насчёт libuv? Если Вы помните, эта библиотека помогает Node.js исполнять операции ввода/вывода с помощью потоков ОС избегая блокировки главного потока и Вы абсолютно правы, это решение нашей проблемы, но для того, что бы это стало возможным, наш модуль должен быть написан на языке C++, что бы libuv могла с ним работать.

    К счастью, начиная с v10.5 в Node.js добавлен нативный модуль Worker Threads.

    Воркеры и их потоки

    Воркеры полезны для выполнения CPU-ёмких JavaScript операций; не используйте их для операций ввода/вывода, уже встроенные в Node.js механизмы более эффективно справляться с такими задачи, чем Worker thread.

    Исправление кода

    Пришло время переписать наш код:

    В файле index-workerthreads.js при каждом запросе на /primes создаётся экземпляр класса Worker (с нативного модуля worker_threads ) для выгрузки и исполнения файла primes-workerthreads.js в поток воркера. Когда список простых чисел просчитан и готов, инициируется событие message – результат попадает в главный поток из-за того, что у воркера не осталось работы он также инициирует событие exit , позволяя основному потоку отправлять данные клиенту.

    primes-workerthreads.js изменён немного. Он импортирует workerData (это копия параметров, переданных с основного потока) и parentPort через который результат роботы воркера передаётся назад в главный поток.

    Теперь давайте испробуем наш пример снова и посмотрим, что случиться:

    Основной поток больше не блокируется.

    Теперь всё работает как нужно, но плодить воркеры без всяких на то причин все же не лучшая практика, создавать потоки не дешёвое удовольствие. Обязательно создайте пул потоков перед этим.

    Заключение

    Node.js мощная технология, которую стоит изучить при возможности.
    Моя личная рекомендация — всегда будьте любопытными! Если Вы знаете, как что-то работает изнутри, Вы сможете работать с этим более эффективно.

    Это всё на сегодня, ребята. Я надеюсь этот пост был полезен для Вас и вы узнали что-то новое о Node.js.

    Источник: medium.com

    Node.js — Введение

    От автора: что такое Node.js? Node js — это серверная платформа, построенная на JavaScript Engine от Google Chrome (V8 Engine). Node.js был разработан Райаном Далем в 2009 году, последняя версия фреймворка — v0.10.36.

    Определение Node.js, которое дается в официальной документации, выглядит следующим образом: Node.js — это платформа, построенная на Chrome’s JavaScript runtime предназначенная для разработки производительных и масштабируемых веб-приложений. Node.js использует управляемую событиями, неблокирующую модель ввода-вывода, которая делает ее простой и эффективной, идеальной для приложений с интенсивным использованием данных в реальном времени, работающих через распределенные устройства.

    Node.js — это кросс-платформенная среда с открытым исходным кодом для разработки серверных и сетевых приложений. Приложения Node.js написаны на JavaScript и могут выполняться в среде исполнения Node.js на ОС X, Microsoft Windows и Linux.

    Node.js также предоставляет обширную библиотеку различных модулей JavaScript, что в значительной степени упрощает разработку веб-приложений. Node.js = Runtime Environment + JavaScript Library

    Особенности Node.js

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

    Бесплатный курс «NodeJS. Быстрый старт»

    Изучите курс и узнайте, как создать веб-приложение с нуля на JavaScript с NodeJS

    Асинхронные скрипты на основе событий. Все API-интерфейсы библиотеки Node.js являются асинхронными, то есть неблокирующими загрузку. По сути, это означает, что сервер на основе Node.js никогда не ожидает возврата данных от API. После вызова сервер переходит к следующему API, а механизм уведомлений Node.js Events помогает серверу получить ответ от предыдущего вызова API.

    Очень быстрый. Будучи построенным на JavaScript-браузере Google Chrome V8, библиотека Node.js очень быстро выполняется в коде.

    Однопоточный, но легко масштабируемый — Node.js использует однопоточную модель с циклом событий. Механизм Event помогает серверу реагировать неблокирующим образом и обеспечивает высокую масштабируемость, в отличие от традиционных серверов, которые создают ограниченные потоки для обработки запросов. Node.js использует однопоточную программу, и одна и та же программа может обслуживать гораздо большее количество запросов, чем традиционные серверы, такие как Apache HTTP Server.

    Отсутствие буферизации — приложения Node.js не буферизуют данные. Пприложения просто выводят данные по частям.

    Лицензия — Node.js выпущен под лицензией MIT.

    Кто использует Node.js?

    Ниже приведена ссылка на wiki github, по которой вы найдете полный список проектов, приложений и компаний, которые используют Node.js. Среди них такие крупные компании, как eBay, General Electric, GoDaddy, Microsoft, PayPal, Uber, Wikipins, Yahoo! и Yammer. Проэкты, приложения и компании использующие Node

    Основные концепции

    На следующей диаграмме приведены некоторые важные компоненты Node.js, которые мы подробно рассмотрим в следующих главах.

    Node.js — Введение

    Где используется Node.js?

    Ниже приведены области, где Node.js зарекомендовал себя как идеальное технологическое решение:

    Приложения, связанные с вводом-выводом данных

    Приложения для потоковой передачи данных

    Интенсивное использование данных в режиме реального времени (DIRT)

    Приложения на основе API JSON

    Редакция: Команда webformyself.

    Бесплатный курс «NodeJS. Быстрый старт»

    Изучите курс и узнайте, как создать веб-приложение с нуля на JavaScript с NodeJS

    NodeJS. Быстрый старт

    Создание веб-приложения на JavaScript с NodeJS

    Источник: webformyself.com

    Рейтинг
    ( Пока оценок нет )
    Загрузка ...
    EFT-Soft.ru