Вышел в свет Node.JS v6.0

    Сегодня увидела свет версия 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 за важное дополнение по поддержке версий.

    Поделиться публикацией

    Похожие публикации

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

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

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

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

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

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

                  0

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

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

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

          В октябре этого года ветка v6.x станет новой активной LTS версией и её поддержка продлится до апреля 2018 года, а поддержка текущей LTS ветки Node.js v4 'Argon' продлится до апреля 2017. Поддержка же v5 продлится еще два месяца, чтобы разработчики использующие эту версию смогли перейти на v6. Поддержка v0.10 и v0.12 будет полностью прекращена.
            +14
            > Деструктивное присваивание
            destruction != destructuring, равно как и деструкция != деструктуризации.
              +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 и оператор возведения в степень (его поддержки пока нет).
                0

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


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

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


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

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

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

                  См. https://github.com/ChALkeR/notes/blob/master/Buffer-knows-everything.md
                +3
                ES6 модули уже поддерживаются из коробки?
                  0
                  Мне, кстати, непонятно, почему их нету в https://kangax.github.io/compat-table/es6/.

                  В самом худшем случае можно, наверное, взять npm install babel-register c пустым .babelrc (не пробовал пока).
                    +1
                    У них есть issue на эту тему: https://github.com/kangax/compat-table/issues/316
                    +1
                    Модули пока не готовы, в ES 2015 они описаны не полностью.
                      –4
                      Ещё один довод, для меня, в сторону перехода на TypeScript, где модули из коробки.
                      Всё таки при частичной поддержке ES2015 в NodeJS использование Babel было для меня под вопросом, а вот TypeScript и так планировали использовать в связке с Angular 2.
                        0
                        Не понял, я что-то не по делу написал? Если уже использовать транспайлеры в связке с нодой, то чем плох TypeScript?
                      0
                      Дефолтные значение в функциях как то связаны с ES, или это будет фишка Node?
                        0
                        Часть ES2015.
                        Node вообще не привносит никакого синтаксиса.

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

                      Самое читаемое