Всех поздравляю с майскими праздниками. Сегодня хочу поделиться опытом использования ECMAScript 6(ES6). Мотивацией для написания статьи было отсутствие полного поэтапного руководства по использованию ES6, а точнее системы модулей с помощью транспилятора Babel. Кому интересно — добро пожаловать!

Существует много примеров использования Babel, однако, когда дело доходит до использования ES6 модулей, тут приходится дополнительно погуглить. Я в итоге так и не нагуглил готового руководства, даже на английском, поэтому написал своё руководство. Буду крайне краток и информативен.

Что необходимо установить на ваш любимый linux-дистрибутив:
sudo aptitude install nodejs    # для работы npm
sudo npm install -g babel       # для компиляции ES6 в ES5
sudo npm install -g browserify  # для использования модулей
sudo npm install -g watchify    # для удобства использования Browserify
cd path_to_sources
npm install --save-dev babelify # для взаимодействия Babel и Browserify

Напишем ES6 код для теста(полный проект тут):
// src/lib.js
class ES6Today
{
  use()
  {
    console.log("Hello from a JS class!");
  }
}

export { ES6Today };

// src/main.js
import { ES6Today } from "./lib";

var es6 = new ES6Today();
es6.use(); // output: Hello from a JS class!

Приведённый исходный код не претендует на самый полезный пример использования ES6, так как основная цель руководства — показать одну из технологий компиляции ES6 в ES5.

Переходим непосредственно к компиляции:
watchify src/main.js -t babelify -o build/main.js

Разберём принцип работы последней команды. Watchify-демон запускает сборщик Browserify и следит за изменениями в исходном коде файла main.js и модулях, используемых файлом main.js. При сохранении изменений в исходном коде Watchify-демон в очередной раз запускает сборщик Browserify и так до остановки демона Watchify.

Флаг -t со значением babelify говорит о том, что мы используем сгенерированный Babel транспилятором код с форматом модулей по умолчанию(CommonJS) для сборщика Browserify. Флаг -o указывает на выходной одиночный файл, который мы подключаем к HTML-странице.

В итоге мы имеем удобный способ использования ES6 уже сегодня.

P.S. А какой способ используете Вы (больше интересует front-end)?

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



  1. Voronar Автор
    02.05.2015 21:51
    -1

    Большая просьба ко всем минусующим: обосновывайте своё решение.


    1. f0rmat1k
      03.05.2015 14:43
      +3

      Я не минусовал, но написанное не тянет на статью. Есть уже много примеров использования es6 в продакшене. На сайте бейбела есть куча документации, есть в конце концов systemjs, умеющий все это собирать и также с кучей документации. У вас же пост в стиле «ребят смотрите, я в первый раз собрал es6».


      1. Voronar Автор
        03.05.2015 19:51
        -2

        А это и не статья, а просто специфический туториал, там около заголовка написано. И так как люди добавляют его в избранное, то польза от него есть, а это самое главное.


        1. f0rmat1k
          03.05.2015 19:59

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

          А это и не статья, а просто специфический туториал.

          Я повторяю, что это не тянет на пост (статья, туториал, не важно), т.к. гуглится за 10 секунд.


          1. Voronar Автор
            03.05.2015 23:02
            -3

            Я и не расстраиваюсь.
            Нагуглите мне подобный туториал за 10 секунд.
            Жду ссылку.


            1. Fesor
              04.05.2015 01:57

              advantcomp.com/blog/ES6Modules — ~15 секунд на поиск и пролистывание.


              1. Voronar Автор
                04.05.2015 09:49
                -5

                Значит не гуглится за 10 секунд и тем более в нём используют task-manager, а я показываю пример использования CLI. Да и вообще там на буржуйском написано.


                1. Fesor
                  04.05.2015 10:20

                  а я показываю пример использования CLI

                  И зачем? А потом через CLI еще прикручивать sass/less/postcss+autoprefixer. Лучше сразу через таск менеджеры.


                  1. Voronar Автор
                    04.05.2015 10:45

                    В конечном итоге всё зависит от необходимости прикручивания тех или иных присосок.


            1. whunter
              08.05.2015 10:45

              Использую с SailsJS. А на пост действительно не тянет, скорее введение, до P.S. думал что вот сейчас будет интересно. На 2ality много интересного по ES6 есть, включая Babel. А буржуйский нужно знать разработчику.


  1. isden
    02.05.2015 22:07
    -1

    > P.S. А какой способ используете Вы?

    А мы ставим nodejs версии >= 0.12 и просто используем ES6.


    1. Voronar Автор
      02.05.2015 22:44
      -1

      Это вы наверное про back-end говорите? Я забыл добавить, что имел ввиду front-end.


      1. isden
        02.05.2015 22:57

        А, теперь ясно.
        К слову, в браузерах, насколько я вижу, более-менее большая часть фич тоже поддерживается уже.


        1. Louter
          03.05.2015 14:10
          -1

          Если честно вот такие фразу меня, как разработчика и как юзера жутко раздражает:
          Мобильные браузеры (планшеты, коих уже в купе с «глупо»фонами поболее десктопов будет) вообще в рассчёт не берёте?)


          1. isden
            03.05.2015 14:20

            А что не так с мобильными браузерами (я немного не в теме разработки под мобильные браузеры)?
            В андроиде есть chrome/FF, которые вроде бы обновляются регулярно, а в iOS есть еще Сафари.


            1. rodweb
              03.05.2015 15:23

              Множество людей сидит на устаревших версиях ОС, для которых новые версии браузеров просто не выходят.


    1. k12th
      02.05.2015 23:06
      +2

      В nodejs версии 0.12 ES6 поддерживается на 23%. Тогда как babel дает аж 76.


      1. isden
        02.05.2015 23:11

        Ну я в курсе, но фичи, которые мне нужны, вполне уже есть. И остальное будет достаточно скоро.


      1. isden
        02.05.2015 23:15
        -1

        Стойте, а вы уверены, что та табличка не устарела? Там пишут, что nodejs не поддерживает, например, генераторы.


        1. dannyzubarev
          02.05.2015 23:40

          Генераторы спрятаны под флагом --harmony. В свою очередь, io.js (https://iojs.org/) поддерживает их нативно.


          1. isden
            02.05.2015 23:44
            +1

            Краем уха читал про io.js, но не вглядывался особо. Вы им пользуетесь? Как оно?


            1. dannyzubarev
              02.05.2015 23:56
              +2

              Если честно, сразу перешел на него из-за как раз ES6 «из коробки». Темп развития и вклад сообщества колоссальные, что не может не радовать. Некоторые считают, что так не должно быть, если это используется в enterprise, но тут мнения очень сильно расходятся.

              Хорошим аргументом в пользу io.js для меня было решение команды node-webkit перейти на io.js.

              Лично мне нынче по душе io.js. Все проекты в данный момент работают на версиях >=1.7.0.

              Попробуйте, ES6 очень сильно ускоряет и упрощает разработку. :)

              Сейчас, кстати, активно идет обсуждение обратного объединения Node.js и io.js, но с учетом нынешней политики разработки последнего, дабы изменить принцип разработки и релизов Node.js. Подробнее можете почитать здесь – github.com/jasnell/dev-policy/blob/master/convergence.md


              1. isden
                02.05.2015 23:59

                > Попробуйте, ES6 очень сильно ускоряет и упрощает разработку. :)

                Это я уже заметил :)
                Спасибо, попробую io.js как чуть времени свободного будет.


                1. Voronar Автор
                  03.05.2015 00:25
                  -3

                  to dannyzubarev: Я не использовал node-webkit и поэтому вопрос: зачем оно надо, если есть CEF?


                  1. isden
                    03.05.2015 00:27
                    +1

                    Что есть CEF? Гугление дает странные результаты, вроде «Child Evangelism Fellowship».


                    1. Voronar Автор
                      03.05.2015 00:51
                      -2

                      1. isden
                        03.05.2015 00:54

                        Я сходу не уловил, какое отношение оно имеет к server-side JS?


                        1. Voronar Автор
                          03.05.2015 09:32
                          -3

                          Может я не правильно понимаю, но какое отношение имеет node-webkit к server-side, если это вроде как тулза для десктопных приложений?


                          1. isden
                            03.05.2015 13:40

                            Ну мы же в этой ветке вроде про node/io в контексте server-side говорили?
                            А так — «NW.js is an app runtime based on Chromium and node.js»


  1. k12th
    02.05.2015 23:07

    А мы используем grunt-*. Потому что кроме скриптов надо еще тесты прогонять, jade/stylus компилять…


    1. Fesor
      03.05.2015 21:19
      +1

      А мы gulp.


      1. k12th
        04.05.2015 07:10
        -4

        Возьмите с полки пирожок.


  1. stas404
    03.05.2015 03:11
    +3

    Webpack.
    Простейший пример работы с es6-модулями (экспорт/импорт) под front-end со сборкой на webpack + babel-loader:
    github.com/rauschma/webpack-es6-demo


  1. tenbits
    03.05.2015 12:05

    А у нас совсем другой подход. Используются в системе `file accessor middlewares`: У статического сервера (если разрабатывается лишь front-end вэб приложение) или у обычного бэкэнда (разрабатываем на nodejs) есть плагины (или прослойки на чтение файлов). Например все `*.es6` на лету компилируются в ecmascript 5. За файловым расширением может быть зарегистрировано несколько прослоек: трансформировать все `if conditional comments`, a потом трансформировать в ecmascript 5.
    Плюсы:
    — Трансформации принимаются по шаблону имени файла, например только с расширением `es6`
    — Приложение и система сборки не зависит от содержимого самого файла,
    — «Совместное существование и легкий переход». Мы просто переименовываем `*.js` в `*.es6` и всё работает как обычно, учитывая что ес6 обратно совместим, но мы можем и переименовать в `*.coffee` и подправить содержимое.
    — Система кеширование файлов и file watchers позволяют только один раз трансформировать файл, а при изменение просто файл «перечитать».
    — Такой же подход используется одинаково для *.less, *.yml файлов — достаточно лишь установить плагин.

    Пример `babel` плагина: Loader.Babel


  1. Houston
    03.05.2015 13:40
    +2

    Зря вы глобально всё ставите. А что, если у вас будет два проекта, один на babel@x.x.x, а другой на babel@y.y.y? Все пакеты необходимо устанавливать локально, в папку проекта, и уже оттуда запускать. Для многих пакетов есть специальные CLI (command line interface) пакеты, которые уже можно ставить глобально, и они будут работать интерфейсом к локально установленным пакетам.
    Но ещё лучше использовать NPM scripts, скрипты, описанные в них, ищут исполняемые файлы локально в проекте. И наверняка приятнее написать

    npm start
    чем
    watchify src/main.js -t babelify -o build/main.js


    1. Voronar Автор
      03.05.2015 19:42

      Может быть с NPM scripts и лучше — это уже на усмотрение каждого. Я в статье не об удобствах пишу.


  1. Fesor
    03.05.2015 21:23
    -1

    я делаю так. Для инкремент билдов просто прогоняю все через babel с транспайлом системы модулей в формат system.js и использую полифил. Для продакшена же я обычно использую es6-module-transpiler с форматтером bundle, что бы не париться со всякими богомерзскими browserify которые там нафиг не сдались. Оно берет все модули, заворачивает все в замыкания и формирует бандл без всяких зависимостей и футпринтов от использования сборщиков аля r.js или browserify. Ну и да, все через gulp.

    Но в целом да, все это есть в документации к тому же babel, кроме момента с bundle.


    1. serf
      03.05.2015 22:15

      Может быть подробнее опишите?

      При таком подхоже есть возможность разбивать на несколько бандлов (или более двух)? То есть собственные модули апликухи в отдельный бандл, языковые ресурсы отдельно, и библиотечные отдельно (с browserify это делается с помощью опции/метода external).

      Чем browserify богомерзский кроме небольшого избыточного кода обертки модуля?


      1. k12th
        04.05.2015 07:14

        Ну в свете нативных ES6-модулей browserify действительно не так уж хорош.


        1. serf
          04.05.2015 08:43

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


          1. Fesor
            04.05.2015 09:25

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