Сегодня увидела свет версия 6.0. Изменений много, в том числе за счет обновления версии v8 (до v5.0), при этом некоторые из них могут поломать ваш код. В октябре этого года ветка v6.x станет новой активной LTS версией и её поддержка продлится до апреля 2018 года.


Изменена логика работы Buffer для повышения безопасности приложений. Из коробки будут доступны Proxy, Reflect, расширеная поддержка ES 2015. Основные изменения c примерами под катом.


Поддержка текущей LTS ветки Node.js v4 'Argon' продлится до апреля 2017. Поддержка же v5 продлится еще два месяца, чтобы разработчики использующие эту версию смогли перейти на v6. Поддержка v0.10 и v0.12 будет полностью прекращена в ноябре и декабре 2016 соответсвенно.


Изменения API


Выдержка из changelog наиболее значимых изменений:


Buffer


Конструктор объекта Buffer изменил свое поведение. Старый конструктор получил статус deprecated, а его поведение перешло в отдельные методы:


// Было
new Buffer(size);

// Стало
Buffer.alloc(size);

По умолчанию буфер заполняется нулями, если это не требуется, используйте Buffer.allocUnsafe. Для инициализации буфера из строки или других буферов появился метод Buffer.from:


// Было
new Buffer(str, 'utf8');

// Стало
Buffer.from(str, 'utf8');

EventEmitter


Объект EventEmitter получил два новых метода prependListener и prependOnceListener, оба метода добавляют новый обработчик события в начало списка обработчиков события.


var ee = new EventEmitter();

var result = [];
ee.on('event', () => result.push(1));
ee.prependListener('event', () => result.push(2));
ee.emit('event');

result; // -> [2, 1]

FileSystem


Методы fs.realpath и fs.realpathSync теперь использует обновленную логику libuv и может выбрасывать дополнительные ошибки. Так же на вход этим методам можно подавать Buffer.


HTTP


HTTP-сервер теперь генерирует событие clientError на ошибку клиента. Пример можно увидеть здесь.


Process


Представлен механизм предупреждения о проблемах. Вместо вывода в stderr, теперь можно передавать предупреждения в специальный метод:


process.emitWarning('something goes wrong');

Так же в него можно будет передавать объект Error. Подробнее смотрите в документации.


Stream


Потоки в объектном режиме больше не смогут принимать на запись null.


URL


Метод url.resolve будет отбрасывать значения username и password при изменении хоста.


Windows


Отказ от поддержки WinXP и Vista.


Изменения v8


Теперь в node.js можно будет использовать много крутых возможностей из ECMAScript 2015!


Деструктивное присваивание


Можно выбирать значения из массива или объекта прямиком в переменные:


let [a, b] = [1, 2];
let {c, e} = {c: 3, e: 4};

Деструктивные аргументы функции


Разобрать объект или массив можно и при передаче в функцию:


function fn({arg}) {
    return arg;
}

fn({arg: '1'}); // -> 1

Значения по-умолчанию


Функции получили значения по умолчанию, наконец-то можно избавиться от лишних проверок в начале тела функции:


function doSomething(task = 'nothing') {
    console.log('I\'m gonna do %s.', task);
}

doSomething(); // -> I'm gonna do nothing.

Proxy и Reflect


Объекты Proxy и Reflect доступны без флагов командной строки.


Наследование от Array


Наконец-то доступно почти полноценное наследование от объекта Array.


P.S.


По-моему, очень крутой релиз получился в этот раз! Думаю, можно поздравить команду Node.js.


P.P.S.


Спасибо, Dimd13 и ChALkeRx за важное дополнение по поддержке версий.

Комментарии (20)


  1. k12th
    28.04.2016 14:37

    А что там с наследованием от Array не так? Не нашел в официальном чейнджлоге.


    1. rumkin
      28.04.2016 14:59

      Стало корректно наследоваться свойство length, Array.isArray для таких объектов возвращает true.


      1. k12th
        28.04.2016 15:00
        +4

        У вас написано «почти», мой вопрос в том, чего именно не хватает.


        1. rumkin
          28.04.2016 15:48
          +2

          Не все методы работают как вы можете ожидать. Например, метод map вернет Array, а не ваш класс.


          1. k12th
            28.04.2016 15:50
            +1

            Понятно, спасибо.


          1. rock
            28.04.2016 19:08
            +1

            Т.е. в методах массива (и не только массива) пока нет поддержки паттерна @@species, она добавлена в V8 5.1.


            1. rumkin
              28.04.2016 21:11

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


              1. ChALkeRx
                28.04.2016 21:22
                +2

                5.1 ещё не стабильна. Ветки v8 можно считать стабильными только с выходом Chrome соответствующей версии.
                Для 5.1 это Chrome 51.

                Будет стабильной — попадёт в master Node.js, и в табличке http://node.green/ в Nightly версии Node.js можно будет увидеть обновление.


  1. Dimd13
    28.04.2016 14:40
    +6

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

    В октябре этого года ветка v6.x станет новой активной LTS версией и её поддержка продлится до апреля 2018 года, а поддержка текущей LTS ветки Node.js v4 'Argon' продлится до апреля 2017. Поддержка же v5 продлится еще два месяца, чтобы разработчики использующие эту версию смогли перейти на v6. Поддержка v0.10 и v0.12 будет полностью прекращена.


  1. heilage
    28.04.2016 15:04
    +14

    > Деструктивное присваивание
    destruction != destructuring, равно как и деструкция != деструктуризации.


  1. ChALkeRx
    28.04.2016 16:02
    +4

    > Node.JS, node.js

    Node.js

    > поддержка текущей LTS ветки Node.js v4 'Argon' продлится до апреля 2017

    Активная фаза LTS. Кроме этого, есть ещё Maintenance (в основном исправления безопасности) — до апреля 2018. См. график: https://raw.githubusercontent.com/nodejs/LTS/master/schedule.png

    > Поддержка v0.10 и v0.12 будет полностью прекращена.

    В начале ноября и конце декабря соответственно.
    Перестанут выходить обновления безопасности. Кто ещё не слез — слезайте.

    > JS 2016

    ECMAScript 2015.

    > Конструктор, new Buffer(size);

    Не совсем так, он ещё в версии 4.0.0 перестал быть конструктором. Но в остальном верно.

    > если это не требуется, используйте Buffer.allocUnsafe

    Не просто «если это не требуется», а если вы на 100% уверены что вне зависимости от действий пользователя у вас никуда не утечёт буфер с не инициализированной памятью (в том числе частично).

    > Деструктивное присваивание

    Кхм?

    — Кстати, по поддержке — см http://node.green, там 93% ECMAScript 2015. Раз уж вы вспомнили 2016 — то упомяну и про 50% поддержу его (а именно — Array.prototype.includes). Да, в ECMAScript 2016 всего две фичи по сравнению с 2015 — Array.prototype.includes и оператор возведения в степень (его поддержки пока нет).


    1. rumkin
      28.04.2016 16:14

      Спасибо за дополнение.


      Не просто «если это не требуется», а если вы на 100% уверены что вне зависимости от действий пользователя у вас никуда не утечёт буфер с не инициализированной памятью (в том числе частично).

      Это скорее касается очистки буфера нежели инициализации. Потому как чувствительные данные должны чиститься, в вашем описании появляется ложная уверенность защищенности.


      И, кстати, это один из контрибьюторов Node.js. Если что мучайте его вопросами )


      1. ChALkeRx
        28.04.2016 18:14
        +1

        > Потому как чувствительные данные должны чиститься, в вашем описании появляется ложная уверенность защищенности.

        Нереально удалить все данные оттуда, если честно. Так что надо именно быть уверенными, что у нас не осталось никакого «мусора» в буфере ни при каких условиях.

        См. https://github.com/ChALkeR/notes/blob/master/Buffer-knows-everything.md


  1. pterolex
    28.04.2016 17:10
    +3

    ES6 модули уже поддерживаются из коробки?


    1. k12th
      28.04.2016 17:19

      Мне, кстати, непонятно, почему их нету в https://kangax.github.io/compat-table/es6/.

      В самом худшем случае можно, наверное, взять npm install babel-register c пустым .babelrc (не пробовал пока).


      1. pterolex
        28.04.2016 17:31
        +1

        У них есть issue на эту тему: https://github.com/kangax/compat-table/issues/316


    1. ChALkeRx
      28.04.2016 18:30
      +1

      Модули пока не готовы, в ES 2015 они описаны не полностью.


    1. Valery4
      28.04.2016 19:54
      -4

      Ещё один довод, для меня, в сторону перехода на TypeScript, где модули из коробки.
      Всё таки при частичной поддержке ES2015 в NodeJS использование Babel было для меня под вопросом, а вот TypeScript и так планировали использовать в связке с Angular 2.


  1. dolphin4ik
    04.05.2016 14:58

    Дефолтные значение в функциях как то связаны с ES, или это будет фишка Node?


    1. k12th
      04.05.2016 15:01

      Часть ES2015.
      Node вообще не привносит никакого синтаксиса.