CSS властивості
ГлавнаяGulpВідстеження файлів

Відстеження файлів

178

У цій частині ми розкриємо третій розділ gulpfile.js, який дозволить стежити за нашими файлами та запускати завдання при збереженні. Також, крім завдання мінімізації CSS, ми збираємося додати можливість компілювати Sass-файл замість застосування вихідного CSS, а потім відобразити повідомлення після успішного завершення.

Ви повинні знати, як вся ця робота або завдання відповідають пакетам Gulp, які нам потрібно завантажити в проект.

Для початку, ось моя поточна структура папок:

  • Build/
    • index.html
    • package .json
    • gulpfile.js
    • node_modules/
      • gulp/
      • gulp-minify-css/
    • main.css

Установка необхідних пакетів

Перейдіть до папки проекту і виконайте такі команди по одній, щоб встановити необхідні пакети:

<code>npm install--save-dev gulp-notify npm install--save-dev gulp-sass

Додавання завдання watch і автоматизація системи

Gulp пропонує об'єкт з ім'ям watch, який схожий на об'єкти src та dest. Ми можемо використовувати об'єкт watch і попросити Gulp слідкувати за цим завданням. Це означає, що Gulp буде стежити за файлом на випадок його модифікації.="javascript">gulp.watch('main.css', function(){ console.log('seen'); });

Остаточно gulpfile.js має виглядати так :

<code data-language="javascript">var gulp=require('gulp'); var minifyCss=require('gulp-minify-css'); gulp.task('mincss', function(){ return gulp.src('main.css') .pipe(minifyCss()) .pipe(gulp.dest('main')); }); gulp.watch('main.css', function(){ console.log('seen'); });

Тепер перейдіть до командного рядка і запустіть gulp mincss знову. Якщо все відбулося очікувано, то ви повинні побачити повідомлення «seen», як на малюнку нижче:

Об'єкт watch, як і раніше, стежитиме за будь-якими змінами зробленими у файлі main.css і відображатиме «seen» щоразу, поки ви не натиснете Ctrl + C для його зупинки. Круто!

Функція watch приймає два аргументи: файл(и) для стеження та виклик для дії. Другий аргумент може бути замиканням (анонімною функцією) або об'єктом JavaScript. Зверніть увагу, що за раз ми можемо додати кілька завдань у файл gulpfile.js. У нас може бути завдання script для керування JavaScript-файлами, завдання connectPHP для запуску сервера PHP і т.д. Це може ускладнити керування відстеженням. Допустимо, у нас є три файли для стеження, ми повинні написати:

<code data-language="javascript">gulp.watch(['file1.css', 'file2.txt', 'file3 .js'], function(){ console.log('seen'); });

Це чудово буде працювати, але в мене особисто є дві основні проблеми з такою практикою. По-перше, це виглядає брудно. Я маю писати повне ім'я файлу. По-друге, відображається одне повідомлення («seen») кожного разу, коли змінюється будь-який файл, тоді як я хотів би знати, коли змінювався конкретний файл. об'єкта paths, на кшталт наступного:

<code data-language="javascript">var paths={ css:['path/to/style1.css ', 'path/to/style2.css'], script:['path/to/script1.js', 'path/to/script2.js'] }; gulp.watch(paths.css, function(){ console.log('seen css changes'); }); gulp.watch(paths.script, function(){ console.log('seen javascript changes'); });

Це виглядає добре і дає нам можливість дізнатися, коли змінився CSS або JavaScript.

Іншою потужною штукою для повідомлень є другий аргумент. Оскільки ми можемо використовувати замикання як аргумент, уявіть, як ми передаємо ціле завдання. Отже, у нас є щось подібне:

<code data-language="javascript">gulp.watch(paths.css, ['mincss']);

Ви погодитеся зі мною, що це виглядає чистіше. Тепер, з усіма цими невеликими змінами, давайте застосуємо їх до Gulp-файлу і подивимося, як це виглядає загалом:

<code data-language="javascript">var gulp=require('gulp') ; var minifyCss=require('gulp-minify-css'); var paths={ css:['main.css'], text:['test.txt'] }; gulp.task('mincss', function(){ return gulp.src('main.css') .pipe(minifyCss()) .pipe(gulp.dest('main')); }); gulp.watch(paths.css, ['mincss']);

Поки це все чудово, але уявіть, що у нас є кілька завдань для відстеження. Як ми запустимо їх із командного рядка? Допустимо, наступний випадок:

<code data-language="javascript">var gulp=require('gulp'); var minifyCss=require('gulp-minify-css'); var coffee=require('gulp-coffee'); var paths={ css:['main.css'], script:['script.coffee'] }; gulp.task('mincss', function(){ return gulp.src('main.css') .pipe(minifyCss()) .pipe(gulp.dest('main')); }); gulp.task('scripts', function(){ return gulp.src(paths.script) .pipe(coffee()) .pipe(gulp.dest('js')); }); gulp.watch(paths.css, ['mincss']); gulp.watch(paths.script, ['scripts']);

Під час запуску gulp mincss будуть відстежуватися файли CSS та CoffeeScript. Але при зміні файлу CoffeeScript він не буде відстежуватися, тільки файл CSS. У тому сенсі, що відстеження відбудеться лише, коли ви зміните свій CSS-файл. Те саме відбувається, коли ви вирішите відстежувати завдання scripts. Хоча це може бути іноді корисно з точки зору економії ресурсів.

Для зменшення проблеми ми повинні зібрати всі завдання в одну, яка викликається один раз і відстежує всі наші завдання одночасно:

<code data-language="javascript">var gulp=require('gulp'); var minifyCss=require('gulp-minify-css'); var coffee=require('gulp-coffee'); var paths={ css:['main.css'], script:['script.coffee'] }; gulp.task('mincss', function(){ return gulp.src('main.css') .pipe(minifyCss()) .pipe(gulp.dest('main')); }); gulp.task('scripts', function(){ return gulp.src(paths.script) .pipe(coffee()) .pipe(gulp.dest('js')); }); gulp.task('watcher',function(){ gulp.watch(paths.css, ['mincss']); gulp.watch(paths.script, ['scripts']); });

Тепер все, що вам потрібно зробити це запустити gulp watcher і всі ваші файли будуть відстежуватися одночасно. Будь-який файл, який ви зміните, буде компільовано.

Існує ще один спосіб, як зробити все простіше. Замість запуску gulp watcher ви можете просто запустити gulp, і він зробить всю роботу. Але прямо зараз у нашому випадку якщо ви введете gulp ви отримаєте таку помилку:

<code>[11:08:34] Task 'default' is not in your gulpfile [11:08:34] the documentation for proper gulpfile formatting

Gulp просить нас створити ще одне завдання з ім'ям default, яке необхідне для роботи.

Отже, що щодо завдання default? Це завдання бере всі завдання для запуску в єдиний об'єкт, включаючи наше завдання watcher. Тепер ми можемо змінити gulpfile.js на це:

<code data-language="javascript">var gulp=require('gulp'); var minifyCss=require('gulp-minify-css'); var coffee=require('gulp-coffee'); var paths={ css:['main.css'], script:['script.coffee'] }; gulp.task('mincss', function(){ return gulp.src('main.css') .pipe(minifyCss()) .pipe(gulp.dest('main')); }); gulp.task('scripts', function(){ return gulp.src(paths.script) .pipe(coffee()) .pipe(gulp.dest('js')); }); gulp.task('watcher',function(){ gulp.watch(paths.css, ['mincss']); gulp.watch(paths.script, ['scripts']); }); gulp.task('default', ['watcher', 'mincss', 'scripts']);

Автор та редактори

Автор: Ахмед Саліфу Аміду
Останнє змінення: 25.08.2016
Редактори: Влад Мержевич