Node JS

NodeJS

  • NodeJS запускает javascript на сервере.
  • NodeJS создан на движке V8
  • Быстро и эффективно использует память
  • NodeJS использует библиотеки по работе с сетью с файлами

Why NodeJS

  • JavaScript
  • Общий код клиент сервер
  • Решает основные задачи WEB разработки
  • Хорошо работает с большим количеством соединений
  • К NodeJS очень удобный менеджер пакетов npm

Set Up

Modules

function User(name) {
    this.name = name
}

User.prototype.hello = function(who) {
    console.log(`Hello ${who.name}`);
}

let user1 = new User('Vic');
let user2 = new User('Vic2');
user1.hello(user2);

run code in terminal or cmd:

Modules

class User {
    constructor(name) {
        this.name = name;
    }

    hello(who) {
        console.log(`Hello ${who.name}`);
    }
}

let user1 = new User('Vic');
let user2 = new User('Vic2');
user1.hello(user2);

run code in terminal or cmd:

Modules

Подключение js файлов в другие js файлы

require

Вынесем User в другой файл

// user.js
class User {
    constructor(name) {
        this.name = name;
    }
    hello(who) {
        console.log(`Hello ${who.name}`);
    }
}
let user1 = new User('Vic');
let user2 = new User('Vic2');
user1.hello(user2);
console.log('require!');
// server.js
require('./user');

Modules

Для того что бы User стал доступным в server.js необходимо реализовать модуль в user.js

require

// user.js
class User {
    constructor(name) {
        this.name = name;
    }

    hello(who) {
        console.log(`Hello ${who.name}`);
    }
}

exports.User = User;
// server.js
const user = require('./user');

let user1 = new user.User('Vic');
let user2 = new user.User('Vic2');
user1.hello(user2);

Modules

global objects

// user.js
class User {
    constructor(name) {
        this.name = name;
    }

    hello(who) {
        console.log(`Hello ${who.name}`);
    }
}

global.User = User;
// server.js
require('./user');

let user1 = new User('Vic');
let user2 = new User('Vic2');
user1.hello(user2);

Все что будет записано в global будет доступно глобально, аналогия с обьектом window.

Modules

// user.js
const phrases = require('./ru.json');
class User {
    constructor(name) {
        this.name = name;
    }
    hello(who) {
        console.log(`${phrases.Hello} ${who.name}`);
    }
}

global.User = User;
// ru.json
{
  "Hello": "Привет"
}

Еще есть тип модуля JSON.

Добавим ru.json файл.

// server.js
require('./user');

let user1 = new User('Vic');
let user2 = new User('Vic2');
user1.hello(user2);

Modules

// user/index.js
const phrases = require('./ru.json');
class User {
    constructor(name) {
        this.name = name;
    }
    hello(who) {
        console.log(
          `${phrases.Hello} ${who.name}`
        );
    }
}

exports.User = User;
// server.js
const user = require('./user');

let user1 = new user.User('Vic');
let user2 = new user.User('Vic2');
user1.hello(user2);

Работа с модулями директориями.

Создадим директорию user, переместим в нее файлы user.js и ru.json. user.js переименуем в index.js

Modules

// user/index.js
const phrases = require('./ru.json');

class User {
    constructor(name) {
        this.name = name;
    }

    hello(who) {
        console.log(`${phrases.Hello} ${who.name}`);
    }
}

exports.User = User;

console.log(module);
// server.js
require('./user');

let user1 = new User('Vic');
let user2 = new User('Vic2');
user1.hello(user2);

Object Module.

Добавим в консоль module. В консоле будет большой обьект module.

Modules

// user/index.js

const phrases = require('./ru.json');

class User {
    constructor(name) {
        this.name = name;
    }

    hello(who) {
        console.log(
          `${phrases.Hello} ${who.name}`
        );
    }
}
exports.User = User;
console.log(module);
// server.js
require('./user');

let user1 = new User('Vic');
let user2 = new User('Vic2');
user1.hello(user2);

Object Module.

Добавим в консоль module. В консоле будет большой обьект module. Содержит информацию о модуле.

Из результата нам на данный момент будут важны два свойства parent и id.

Modules

// server.js
const user = require('./user');

function run() {
    let user1 = new user.User('Vic');
    let user2 = new user.User('Vic2');
    user1.hello(user2);
}

if (module.parent) {
    exports.run = run;
} else {
    run();
}

module.parent

Наш код который находится в server.js работает потому что его запускаем явно иначе его нужно exports делать. Как пример можем добавить проверку.

// user/index.js
const phrases = require('./ru.json');

class User {
    constructor(name) {
        this.name = name;
    }

    hello(who) {
        console.log(`${phrases.Hello} ${who.name}`);
    }
}

exports.User = User;

console.log(module);

Modules

// user/index.js
const phrases = require('./ru.json');
class User {
    constructor(name) {
        this.name = name;
    }

    hello(who) {
        console.log(`${phrases.Hello} ${who.name}`);
    }
}
module.exports = User;

module.exports

Для exports можем использовать module.exports или exports.

// server.js
const User = require('./user');
function run() {
    let user1 = new User('Vic');
    let user2 = new User('Vic2');
    user1.hello(user2);
}
if (module.parent) {
    console.log(module);
    exports.run = run;
} else {
    run();
}

В нашем случае как пример мы хотим возвращать функцию User а не обьект у которого данная функция является методом. В этом случае нужно использовать module.exports = User

Modules

// user/index.js
const db = require('../db');
db.connect(); // load data

class User {
    constructor(name) {
        this.name = name;
    }

    hello(who) {
        console.log(`${db.getPhrase('Hello')} ${who.name}`);
    }
}

module.exports = User;

Добавим упрощенную версию DB.

// db/index.js
let phrases;
exports.connect = function() {
    phrases = require('./ru.json');
}
exports.getPhrase = function(name) {
    return phrases[name];
}

Создадим папку db и в ней модуль. Также перенесем ru.json в эту папку.

Modules

Task

Добавьте проверку если данной фразы нет вывести ошибку.

Modules

Добавим еще обращение в базу данных.

// server.js
const User = require('./user');
const db = require('./db');

function run() {
    let user1 = new User('Vic');
    let user2 = new User('Vic2');
    user1.hello(user2);
    console.log(`${db.getPhrase('Run successful')}`);
}

if (module.parent) {
    console.log(module);
    exports.run = run;
} else {
    run();
}

Повторно вызывать connect не нужно. При первом подключении модуля он инициализируется и при повторном подключении файл уже проинициализирован, просто другой путь.

Modules

Перенесем db.connect в server.js

// server.js
const User = require('./user');
const db = require('./db');
db.connect(); // load data

function run() {
    let user1 = new User('Vic');
    let user2 = new User('Vic2');
    user1.hello(user2);
    console.log(`${db.getPhrase('Run successful')}`);
}

if (module.parent) {
    console.log(module);
    exports.run = run;
} else {
    run();
}

Modules

Работа с путями ../ не удобно.

// server.js
const User = require('./user');
const db = require('db');
db.connect(); // load data

function run() {
    let user1 = new User('Vic');
    let user2 = new User('Vic2');
    user1.hello(user2);
    console.log(`${db.getPhrase('Run successful')}`);
}

if (module.parent) {
    console.log(module);
    exports.run = run;
} else {
    run();
}

Порядок поиска модулей https://nodejs.org/api/modules.html#modules_all_together.

windows: set NODE_PATH=. mac os: NODE_PATH=.

Modules

Module factory.

// server.js
const User = require('./user');
const db = require('db');
db.connect(); // load data
const log = require('logger')(module);

function run() {
    let user1 = new User('Vic');
    let user2 = new User('Vic2');
    user1.hello(user2);
    log(`${db.getPhrase('Run successful')}`);
}

if (module.parent) {
    exports.run = run;
} else {
    run();
}

Заключается в том что при подключении модуля сразу передаем ему параметры.

// logger.js
module.exports = function(module) {
    return function() {
        const args = [module.filename]
        	.concat([].slice.call(arguments));
        // console.log.apply(console, arguments);
        console.log.apply(console, args);
    }
}

npm

  • Для создания такого модуля нужно вызвать комманду npm init
  • Для регистрации в центральной базе данных npm publish, но перед этим нужно создать user - npm adduser
  • Для установки модуля используем npm install <имя модуля>. Скаченный модуль установится в директорию node_modules.
  • Затем можем сделать require установленного модуля.
  • Либо мы можем вручную указать какие нам нужны модули в файле packa.json и затем выполнить комманду npm install.

npm

Давайте рассмотрим npm https://www.npmjs.com/package/lodash

NodeJS

By Oleg Rovenskyi