# Gulp Timeout

# [Lecture] What is Browsersync?

BrowserSync 可是監聽文件的變化並讓瀏覽器實時地響應變化,並且支持多終端設備的調試,首先透過 npm 工具安裝:

# Install browser-sync plugin
$ npm install browser-sync --save-dev

接著修改 gulpfile.js 檔案,引入 browser-sync 套件並在 gulp.task('watch') 任務中初始化:

var gulp = require('gulp'),
    watch = require('gulp-watch'),
    postcss = require('gulp-postcss'),
    autoprefixer = require('autoprefixer'),
    cssvars = require('postcss-simple-vars'),
    nested = require('postcss-nested'),
    cssImport = require('postcss-import'),
    browserSync = require('browser-sync').create();

gulp.task('default', function() {
  console.log("Hooray - You Create a Gulp Task!");
});

gulp.task('html', function() {
  console.log("Imagine something useful being done to your HTML here.");
});

gulp.task('styles', function() {
  return gulp.src('./app/assets/styles/styles.css')
    .pipe(postcss([cssImport, cssvars, nested, autoprefixer]))
    .pipe(gulp.dest('./app/temp/styles'));
});

gulp.task('watch', function() {

  // 初始化 browserSync,設定根資料夾
  browserSync.init({
    notify: false,
    server: {
      baseDir: "app"
    }
  });

  // 每當 index.html 更動時,重新載入頁面
  watch('./app/index.html', function() {
      browserSync.reload();
  });

  watch('./app/assets/styles/**/*.css', function() {
      gulp.start('cssInject');
  });
});

// 實時注入 styles.css 文件
gulp.task('cssInject', ['styles'], function() {
  return gulp.src('./app/temp/styles/styles.css')
    .pipe(browserSync.stream());
});

# Organizing our Gulpfile.js File

在這一小節中要做的事情是將我們的 gulpfile.js 進行模組化,首先在根目錄下創建資料夾 ./gulp/tasks 並將代碼適當地寫入 styles.jswatch.js 中:

// File: styles.js
var gulp = require('gulp'),
    postcss = require('gulp-postcss'),
    autoprefixer = require('autoprefixer'),
    cssvars = require('postcss-simple-vars'),
    nested = require('postcss-nested'),
    cssImport = require('postcss-import');

gulp.task('styles', function() {
  return gulp.src('./app/assets/styles/styles.css')
    .pipe(postcss([cssImport, cssvars, nested, autoprefixer]))
    .pipe(gulp.dest('./app/temp/styles'));
});
// File: watch.js
var gulp = require('gulp'),
    watch = require('gulp-watch'),
    browserSync = require('browser-sync').create();

gulp.task('watch', function() {
  browserSync.init({
    notify: false,
    server: {
      baseDir: "app"
    }
  });

  watch('./app/index.html', function() {
      browserSync.reload();
  });

  watch('./app/assets/styles/**/*.css', function() {
      gulp.start('cssInject');
  });
});

gulp.task('cssInject', ['styles'], function() {
  return gulp.src('./app/temp/styles/styles.css')
    .pipe(browserSync.stream());
});

這樣一來我們只需要在 gulpfile.js 裡面將這些文件引入即可:

require('./gulp/tasks/styles');
require('./gulp/tasks/watch');

# [Lecture] Gulp Error Handling

在 Gulp 運行的過程中,可能會因為無法正確處理錯誤而中止 gulp watch 的運行,這部分可以添加錯誤的處理機制:

gulp.task('styles', function() {
  return gulp.src('./app/assets/styles/styles.css')
    .pipe(postcss([cssImport, cssvars, nested, autoprefixer]))
    .on('error', function(errorInfo) {
      console.log(errorInfo.toString);
      this.emit('end');
    })
    .pipe(gulp.dest('./app/temp/styles'));
});
Last Updated: 12/15/2020, 10:27:30 PM