Краткое знакомство с Node.js

Node.js - это среда кросс-разработки, созданная Райаном Далем в 2009 году для создания эффективной и надежной среды, основанной на javascript.

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

Итак, почему вам стоит рассмотреть возможность изучения Node.js?

Вот несколько плюсов и причин подумать об изучении и работе с Node.js в вашем следующем проекте.

  • На основе Javascript (лицевая и оборотная стороны).
  • Встроенная асинхронная система, управляемая событиями.
  • Работает на однопоточной неблокирующей архитектуре.
  • Большой набор пакетов и модулей.
  • Отлично подходит для создания приложений, дружественных к данным.
  • На его основе созданы потрясающие фреймворки.

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

Event-Loop - это основное ядро ​​запуска и выполнения асинхронного кода на Node.js, поэтому понимание того, как Node.js работает за кулисами и выполняет ваш код, действительно важно для создания высокоуровневых, удобных для производительности приложений.

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

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

Архитектура Node.js

Node.js построен на основе C ++, который является одним из наиболее эффективных языков программирования, что позволяет ему реализовывать некоторые из его частей с использованием других библиотек для обработки определенных задач, таких как запуск цикла событий или обработка вызовов ввода-вывода для обеспечения перекрестной связи. платформенная среда.

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

Вот почему многие серверы построены с использованием Node.js, поскольку он может обрабатывать как можно больше запросов с хорошим процессом и временем отклика.

Кроме того, Node.js построен на основе движка Chrome V8, который на сегодняшний день является самым надежным и производительным компилятором JavaScript и движком времени выполнения, который вы можете найти в настоящее время.

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

С момента первого выпуска Node.js многие команды и компании начали менять свои приложения и серверные инфраструктуры, чтобы использовать Node.js вместо Java EE или PHP. Вот некоторые из ведущих технических компаний, которые используют Node.js на своих серверы.

Теперь достаточно поговорить о теоретических вещах, и давайте сразу перейдем к коду.

Начиная

Теперь давайте попробуем настроить и установить Node.js, он доступен для (Windows, Linux и Mac OS X), поэтому установка может отличаться от одной платформы к другой, но это очень просто, всего один щелчок, чтобы установить и настроить среда разработки.

Зайдите на официальный сайт и скачайте установщик для своей платформы (скачайте последнюю версию).

Установите его, как и любое другое программное обеспечение, на вашем компьютере будут установлены как Nodejs, так и NPM CLI (Node Package Manager).

Вам также понадобится редактор кода для ввода вашего кода и терминал (например, CMD) для запуска ваших файлов javascript с использованием компилятора узлов, и поэтому я люблю использовать редактор кода VSCode, он очень легкий и предоставляет вам такие функции, как встроенный терминал и среда на основе IDE для запуска приложений Node одним нажатием кнопки, а также множество других интересных функций.

Бери его Отсюда.

Вы по-прежнему можете использовать любой редактор кода, который вам больше нравится, чтобы следовать руководству.

Теперь откройте VScode или другой редактор кода с помощью терминала и создайте папку проекта для размещения всех файлов вашего проекта.

Инициализируйте свой проект Node.js

Инициализация - это просто добавление конфигурации для идентификации вашего проекта и обеспечения его совместимости с экосистемой проекта Node.js, чтобы иметь возможность запускать его, устанавливать сторонние пакеты или распространять его в репозиторий NPM.

npm init

You will be asked a couple of questions concerning your project make sure to fill it respectively.

This will create a package.json JSON file on the root directory of your project (project folder).

Node.js REPL

So for those of you who don’t know what is REPL, it actually stands for Read, Evaluate, Print and Loop and they are the basic operations for an Interactive Command Line Interpreter, and that what will REPL gives it being shipped with Nodejs and it is pretty much like (Shell or bash) that will allow you to type javascript code on your terminal pretty much like doing it on an Editor then running on the Interpreter (Your Browser).

It allows you to type and execute one command at a time, mostly used for testing some data or doing a quick javascript test for a specific API.

node

Это запустит интерактивный REPL для вас, где вы можете ввести и выполнить обычный код javascript.

$ node
> var current = new Date()
undefined
> current
2019-02-27T17:43:15.055Z
> console.log("1 + 1 = ", 1+1)
1 + 1 =  2
undefined
>

Запуск модулей (скриптов).

Сценарий или модуль - это файл javascript, причина его вызова модулем заключается просто в том, что после того, как он будет выполнен интерпретатором Nodejs, ему будет предоставлена ​​среда выполнения, которая имеет глобальные переменные и конкретную область доступа только через этот модуль. если мы явно не экспортируем его.

Создайте новый файл javascript в корневом каталоге с именем app.js (который в большинстве случаев представляет собой основную точку входа в ваше приложение).

/* app.js */
console.log("Hello World");

Чтобы выполнить скрипт (модуль), просто запустите его через терминал с компилятором узла.

node app.js

Скрипты NPM

Сценарии - это способ легко выполнять команды и сокращать их до гораздо более простых и простых команд для вас на протяжении всего процесса разработки или для других разработчиков, которые работают с вами в одном проекте или даже при выпуске его на Github как с открытым исходным кодом.

Добавьте сценарий в package.json под объектом сценариев, сценарий имеет ключ и значение, которое представляет собой сокращенную команду, которую вы будете использовать для выполнения реальной команды, которая будет помещена в поле значения.

"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
   //Add the start script 
  "start": "node app.js"
},

Теперь вместо того, чтобы вводить команду узла для запуска сценария или запуска приложения, вы просто запускаете его через NPM.

npm run start

Экспорт / импорт объектов

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

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

Итак, допустим, у нас есть модуль app.js и модуль bootstrap.js, живущие в одном каталоге, и у нас есть объект Pet, к которому нужно получить доступ из app.js.

/* bootstrap.js */
//Some Object 
const Pet = { name: "Mino", type: "Cat" };
//Here we export the Pet object (Default Export).
module.exports = Pet;

Теперь из app.js нам нужно импортировать (потребовать) модуль начальной загрузки и получить экспортированный объект (по умолчанию он вернет причину экспорта объекта Pet по умолчанию).

/* app.js */
//require function takes the RELATIVE path to the module to import 
//Also, the required module what ever code is in there will be executed first.
const pet = require("./bootstrap");

console.log("Cat: ", pet);

Если вы попытаетесь запустить команду start, вы получите модуль bootstrap.js, который сначала будет выполнен, а затем он экспортирует объект Pet, возвращенный функцией require ().

Вы также можете экспортировать несколько объектов из одного модуля (именованный экспорт), просто обернув его модулем.

/* bootstrap.js */
//Some Object 
const Cat = { name: "Mino", type: "Cat" };
const Dog = { name: "Lucy", type: "Dog" }
//We can also export both of the objects 
module.exports = { Cat, Dog }; ///< Wrap it in an Object 
//Or you can do the same thing but setting the value under the exports objects.
module.exports.cat = Cat;
module.exports.dog = Dog;

Вы импортируете его так же, как экспорт по умолчанию, с той лишь разницей, что экспортируете несколько данных, а затем получаете доступ к ним по имени ключа, который был экспортирован как, или по умолчанию он возвращает единственный доступный объект.

Глобалы

Глобальные объекты - это объекты, которые по умолчанию доступны в каждом модуле, не требуя, чтобы они находились в глобальной области видимости Node.js.

Он представляет стандартные объекты и функции, такие как (require, module).

Проверьте доступные глобалы в Документах.

Вы можете получить полный путь к исполняемому в данный момент модулю (абсолютный путь) из глобальной переменной __filename или __dirname.

console.log("Full Path: ", __filename);

ОС процесса

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

Например, вы можете зарегистрировать прослушиватель событий, когда ваше приложение Nodejs вот-вот завершится (для очистки памяти).

process.on('exit', (code) => {
  console.log(`About to exit with code: ${code}`);
});

ОС - это стандартный модуль, используемый для доступа к текущей операционной системе и получения подробной информации о (процессор, ядра, память, ядро…).

const os = require("os");
//Get current Operating System identifying platform 
console.log(os.platform());

Это даст вам текущую работающую платформу

win32

События EventEmitter

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

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

node js имеет встроенную систему событий, которая позволит вам генерировать и прослушивать события (настраиваемые или предварительно созданные) в вашем приложении.

Node.js имеет встроенный стандартный модуль, называемый событиями, и имеет объект EventEmitter, который позволяет нам управлять настраиваемыми событиями.

//Import the Standard Events and EventEmitter Modules 
const events = require('events');
const EventEmitter = events.EventEmitter; ///< that what we will need

And we can Instantiate an Object Of EventEmitter that we can use to submit and listen to events

/* app.js */
//Create a New Instance
var eventEmitter = new EventEmitter();
//emit the Event for triggering the handler
eventEmitter .emit('newUser', "alexdc");

//Require and pass eventEmitter instance reference to bootstrap.js to use it for listening
require("./boostrap")(eventEmitter);

We can register the event listener(handler) in the bootstrap.js module.

//Chalk is a third-party package allows us to print colorful text to the console
const chalk = require("chalk");

//Export a function as a default export 
module.exports = function(eventEmitter) {
  eventEmitter.on("newUser", username => {
      chalk.green("New User Has Joined the Game1 Room ", username)
  });
};

Когда вы запустите приложение, вы получите сообщение о присоединении нового пользователя imeddiatly, и это потому, что событие генерируется в коде.

Файловая система fs

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

модуль fs - это стандартный модуль Node.js с асинхронной и синхронной функцией, которые могут запускаться в зависимости от ваших потребностей, вы также можете обещать методы fs использовать его с async / await.

В зависимости от предыдущего примера событий предположим, что мы хотим сохранить нового пользователя, который присоединяется к нашей игровой комнате, в файле в папке logs /.

const chalk = require("chalk");

const fs = require("fs");
//Path is a standard module to manipulating file paths 
const path = require("path");

module.exports = function(eventEmitter) {
  eventEmitter.on("newUser", username => {
    //Resolve file path (converts relative to absolute path)
    const usersFilePath = path.resolve("logs/users.txt");
    //Save new User data with current date into users.txt filer under logs/ Asynchronously
    fs.writeFile(
      usersFilePath,
      `New user with Username ${username} Joined at ${new Date()}`,
      err => {
        //If there is any err stop execution and log the error details 
        if (err) {
          console.error(chalk.red("Cannot Write to File!"));
          return;
        }
        console.log(
          chalk.green("New User Has Joined the Game1 Room ", username)
        );
      }
    );
  });
};

После запуска приложения вы заметите, что новый файл создается в папке logs / в корневом каталоге вашего проекта.

Простой HTTP-сервер

Node.js очень эффективен, когда дело доходит до создания серверных инфраструктур с множеством мощных фреймворков, используемых специально для этого (Express), который построен поверх низкоуровневого модуля HTTP-сервера Node.js.

Итак, мы создадим простой HTTP-сервер Hello World, используя стандартный HTTP-модуль.

const http = require("http");

const PORT = 3000;
//Create a new instance of HTTP Server
const app = new http.Server();
//Listen for a new HTTP Request (any request method)
app.on("request", (request, response) => {
  //Write response header
  response.writeHead(200, { "Content-Type": "text/plain" });
  //Response Body Data
  response.write("Hello World");
  //Terminate and Send response back to the client
  response.end();
});
//Start server and Listen on PORT 
app.listen(PORT, err => {
  if (err) {
    console.error("Could not Start Server!", err);
    return;
  }
  console.log("Server is Listening on http://localhost:" + PORT);
});

Мы регистрируем обработчик запросов, который запускается при каждом запросе, полученном сервером (GET, POST…).

Любой HTTP-сервер должен прослушивать определенный ПОРТ, поэтому мы использовали 3000, в большинстве случаев он не был взят с другого сервера, работающего на нашем локальном компьютере, а для реального сервера, который развертывается на веб-хостинге, на котором он должен работать. порт 80, потому что это порт по умолчанию, на который браузер отправляет запрос.

Теперь вы можете попытаться получить доступ к вашему простому серверу через браузер http: // localhost: 3000, вы получите Hello World, напечатанный вам на веб-странице.

Для создания расширенных серверов с хорошей безопасностью я рекомендую изучить Epxressjs.