09Sep

nodejs_logo_green

Всем привет! Тема ближайших статей: Самые часто используемые модули Node.js.

Первым методом, который мы изучим, будет метод util inspect модуля, встроенного util. Этот метод позволят красиво вывести любой объект, даже если у этого объекта, как в этом примере, есть ссылка на самого себя.

var util = require('util');  
  
var obj = {  
  a: 5,  
  b: 6,  
};  
obj.self = obj;  
  
console.log( util.inspect(obj) ); 

Запускаем node inspect.js и видим, что, действительно, все красиво обработалось. При этом, если у объекта есть свойства inspect, и оно равно функции, то эта функция будет вызвана.

var util = require('util');  
  
var obj = {  
  a: 5,  
  b: 6,  
  inspect: function() {  
    return 123;  
  }  
};  
obj.self = obj;  
  
console.log( util.inspect(obj) );  

Именно ее результат будет возвращен. Например, я сделал функцию inspect и вернулся 123. Таким образом, поведение метода util inspect несколько напоминает toString. И этот метод используется в console автоматически, если она хочет добавить в log какой-то объект. Я убрал util inspect:

var util = require('util');  
  
var obj = {  
  a: 5,  
  b: 6,  
  inspect: function() {  
    return 123;  
  }  
};  
obj.self = obj;  
  
console.log(obj);

Вызываю. Все работает так же. Потому что, на самом деле, console вызывает его внутри. Однако, иногда все же необходимо обращаться к util inspect явно, в первую очередь, в тех случаях, когда мы хотим вывести что-то не в console, а, например, получить строчное представление объекта для вывода в файл. Кроме того, есть дополнительные параметры util inspect: можно, например, задать глубину вывода объекта, по умолчанию два. Но они используются редко.

Следующая команда – это  util format. Создадим файл format.js.

var util = require('util');  
var str = util.format("My %s %d %j", "string", 123, {test: "obj"});   
  
console.log(str);

Util format получает строку и дальше оно подставляет в нее следующие параметры. Вместо  %s будет выведена строка, вместо %d будет выведено число, а далее вместо %j будет выведен объект в формате json. Если я сейчас это запущу, то вот что я получу:

{“text”:”obj”}

Обратите внимание, это формат json. Это не вывод util inspect. Соответственно, если вдруг я вместо числа передал здесь что-то еще, то при выводе я получу NaN, потому что автоматически происходит конвертация.

Метод util format также используется в console не явно. Если я сейчас возьму и перенесу это прямо в консоль:

var util = require('util');  
var str = util.format("My %s %d", "string", 123, {test: "obj"});   
  
console.log(str);

то все отлично продолжит работать:

var util = require('util');  
  
  
console.log("My %s %d", "string", 123, {test: "obj"}); 

Следующий, последний метод util, о котором пойдет речь – это метод util inherits. Чтобы его было легче понять, я позволил себе скачать исходники Node.js и достать из них файл util.js. Это как раз и есть исходник модуля util. И там на чистом java script есть метод inherits:

exports.inherits = function(ctor, superCtor); {  
ctor.super_ = superCtor  
ctor.prototype = Object.create(superCtor.prototype, {  
constructor: {  
value:ctor,  
enumerable:false,  
writable:true,  
configurable:true  
}  
});  
}; 

Если вы знаете, как работает OOP в JavaScript, тогда вы этот метод сразу понимаете. Если же нет, то рекомендуется разобраться с этим. Впрочем, использовать его одно и так довольно просто. Достаточно создать родительский класс, конструктор, методы в прототипе.

var util = require('util');  
  
// Parent  
function Animal(name) {  
  this.name = name;  
}  
  
Animal.prototype.walk = function() {  
  console.log("Running " + this.name);  
};  

Затем, чтобы унаследовать от него, создаем конструктор потомка и вызываем util inherits:

// Потомок  
function Rabbit(name) {  
  this.name = name;  
}  
  
util.inherits(Rabbit, Animal);

Потом добавляем в прототип методы:

Rabbit.prototype.jump = function() {  
  console.log("Jumping " + this.name);  
};  

Получается, что все объекты, создаваемые этим конструктором, будут наследовать от Animal. Так что если я сейчас запущу код node inherits.js, то rabbit.walk сначала вызовет метод родителя, а rabbit.jump вызовет метод потомка. Все как обычно при наследовании:

var util = require('util');

// Parents
function Animal(name) {
    this.name = name;
}

Animal.prototype.walk = function() {
    console.log("Running " + this.name);
};

// Child
function Rabbit(name) {
    this.name = name;
}

util.inherits(Rabbit, Animal);

Rabbit.prototype.jump = function() {
    console.log("Jumping " + this.name);
};

// Usage
var rabbit = new Rabbit("rabbit");
rabbit.walk();
rabbit.jump();

Код данного урока можно скачать отсюда.

More-To-Come-Soon

Материал урока взят из следующего скринкаста.

We are looking forward to meeting you on our website soshace.com

4. Уроки Node.js. Структура Пакета NPM

Продолжаем наш разговор об NPM.Для того чтобы посмотреть на реальный package.json поставим модуль express. Введем в консоли:

npm i [email protected]

Этим модулем мы будем еще пользоваться в будущем, а сейчас мы просто ставим этот внешний модуль и посмотрим на его package.json, как он выглядит. Обнаружим там массу всего интересного.

Мы кратко пройдемся по некоторым особенностям package.json пока что в общих чертах, в дальнейшем, когда мы будем делать конкретные вещи, то используем это для решения конкретных задач. Итак, поля.

3. Уроки Express.js. Шаблонизация с EJS: Layout, Block, Partials

В реальной жизни у нас обычно больше, чем один шаблон. Более того, если уж так получилось, что мы делаем сайт со страницами, то, как правило, бывает так, что у нас множество страниц есть в одинаковом оформлении. Шаблонная система должна это предусматривать. К сожалению, ejs не очень хорошо с этим справляется. Поэтому, мы сейчас поставим немного другую систему для шаблонизации , которая называется ejs-locals(добавим в app.js)

Уроки React. Урок 12.

Всем привет! Сейчас мы пробежимся по нашему домашнему заданию, а также дадим важные комментарии , которые помогут Вам в дальнейшей работе с React. Для удобства Вам понабиться видеть перед собой код, поэтому перейдите на нужный commit и мы продолжим. Начнем с connect.connect нужен нам, чтобы обратиться к store. Добавим небольшую ремарку, что если Вы можете передать данные используя обычные props – передавайте. Например в containers/Articles.js мы обращаемся к store чтобы из его state достать необходимые нам статьи: