Мы начинаем использовать синтаксис ES6, значительно более продвинутый относительно "старого" ES5. Все браузеры и JS окружения хорошо понимают ES5, но не ES6. Поэтому мы будем использовать инструмент, называемый Babel, чтобы преобразовать файлы ES6 в ES5 формат. Чтобы запустить Babel, мы будем использовать Gulp - менеджер задач. Это похоже на создание задач, расположенных в scripts
файла package.json
, но написание задач в JS файле проще и понятнее чем в JSON, поэтому установим Gulp и плагин Babel для него.
- Запустите
yarn add --dev gulp
- Запустите
yarn add --dev gulp-babel
- Запустите
yarn add --dev babel-preset-latest
- Запустите
yarn add --dev del
(для задачиclean
- очистки, как вы увидете ниже) - В
package.json
добавьте полеbabel
для конфигурации Babel. Укажем, что хотим использовать новейшую конфигурацию Babel, следующим образом:
"babel": {
"presets": [
"latest"
]
},
Примечание: Файл .babelrc
в корне проекта так же может быть использован вместо свойства babel
в package.json
. Но поскольку корневая директория вашего проекта, с течением времени, будет все больше и больше раздуваться, лучше храните конфигурацию Babel в package.json
, до тех пор, пока она не станет слишком большой.
- Переместите файл
index.js
в директориюsrc
. Там вы будете писать ES6 код. А папкаlib
будет местом, куда ваш код будет компилироваться в ES5. Gulp и Babel позаботятся о ее создании. Уберите предыдущий, относящийся кcolor
, код изindex.js
, и замените его на нечто простое, например:
const str = 'ES6';
console.log(`Hello ${str}`);
Здесь мы использовали шаблонную строку - возможость ES6 внедрять с помощью ${}
переменные прямо в строки, без использования конкантенации. Обратите внимание, что шаблонные строки пишутся в `обратных кавычках`
- Создайте
gulpfile.js
, содержащий:
const gulp = require('gulp');
const babel = require('gulp-babel');
const del = require('del');
const exec = require('child_process').exec;
const paths = {
allSrcJs: 'src/**/*.js',
libDir: 'lib',
};
gulp.task('clean', () => {
return del(paths.libDir);
});
gulp.task('build', ['clean'], () => {
return gulp.src(paths.allSrcJs)
.pipe(babel())
.pipe(gulp.dest(paths.libDir));
});
gulp.task('main', ['build'], (callback) => {
exec(`node ${paths.libDir}`, (error, stdout) => {
console.log(stdout);
return callback(error);
});
});
gulp.task('watch', () => {
gulp.watch(paths.allSrcJs, ['main']);
});
gulp.task('default', ['watch', 'main']);
Давайте приостановимся и разберемся.
Gulp, сам по себе, имеет довольно понятный API. Он определяет задачи gulp.task
, которые могут брать файы из gulp.src
, применять к ним цепочки обработчиков - .pipe()
(как babel()
в нашем случае), и сохранять новые файлы в gulp.dest
. Так же он может отслеживать (gulp.watch
) изменения в файловой системе. Одни задачи Gulp могут предварять запуск других, если указать их в массиве (как ['build']
) в качестве второго аргумента в gulp.task
. В документации все изложено более основательно.
Сначала мы определили объект paths
, что бы хранить в одном месте все нужные пути и использовать принцип "не повторяйся" (DRY).
Затем мы определили пять задач: build
(создать), clean
(очистить), main
(основная), watch
(наблюдать), and default
(по умолчанию).
build
вызывает Babel, чтобы преобразовать все исходные файлы изsrc
, и записывает результат вlib
.clean
- задача, которая просто удаляет всю нашу автоматически сгенерированную директориюlib
перед каждымbuild
. Как правило, полезно избавляться от старых скомпилированых файлов (которые могут остаться после переименования или удаления чего-то вsrc
) для того, чтобы быть уверенным, что директорияlib
всегда синхронна сsrc
, даже еслиbuild
не завершился успешно, а вы этого не заметили. Мы используем пакетdel
, чтобы удалять файлы путем, наиболее подходящим для задач Gulp (это рекомендованый для Gulp способ)main
- аналогично запускуnode .
из предыдущией части, за исключением того, что теперь мы используемlib/index.js
. Мы можем просто писатьnode lib
, потому что по умолчанию Node найдет и запуститindex.js
из указанной папки (мы используем переменнуюlibDir
, чтобы соответствовать принципу DRY).require('child_process').exec
иexec
- это функции самого Node, вызывающие консольные команды. Мы перенаправимstdout
вconsole.log()
и возвратим возможную ошибку через функцию обратного вызова (callback), которая передается вgulp.task
в качестве аргумента. Не переживайте, если эта команда не совсем ясна для вас, помните, что эта задача просто запускаетnode lib
.watch
запускает задчуmain
, когда происходят изменения файловой системы для указанных файлов.default
- это специальная задача, которая запускается, если вы просто вызываетеgulp
из CLI (коммандной строки). В нашем случае, мы хотим сначала запуститьmain
(один раз), а затемwatch
.
Примечание: Возможно вы удивились тому, что мы используем синтаксис ES6 в этом Gulp файле, хотя он не транспилируется в ES5 со помощью Babel. Это потому, что мы используем версию Node, которая поддерживает возможности ES6 из коробки (убедитесь, что вы используете версию Node > 6.5.0, запустив node -v
).
Отлично! Посмотрим как это работает.
-
В
package.json
, замените скриптstart
на:"start": "gulp"
. -
Запустите
yarn start
. Должно выйти "Hello ES6" и запуститься автоматическое отслеживание изменений. Попробуйте ввести неверный код вsrc/index.js
и увидите после сохранения, как Gulp автоматически указывает на ошибку. -
Добавьте
/lib/
в.gitignore
Следующий раздел: 4 - Использование ES6 классов
Назад в предыдущий разделили Содержание.