# Gulp Essentials

# [Lecture] Gulp Introduction

# Gulp Overview

Gulp 是基於 node.js 的一款開源 建構工具(Build Tool)工作執行器(Task Runners),可以幫助我們在開發流程中自動化完成許多工作。在安裝 Gulp 時首先要進行 gulp-cli 工具的全局安裝與基於專案的 gulp 安裝:

# Install Gulp globally
$ npm install gulp-cli --global

# Install Gulp in project
$ npm install gulp --save-dev

注意此時的參數 --save-dev 將會將套件安裝在專案的 devDependencies 下,而參數 --save 則會將套件安裝在專案的 dependencies 下,後者通常放置的是運行在瀏覽器中必須的套件。使用 Gulp 之前必須在根目錄下創建 gulpfile.js 配置文件,一個典型的配置文件如下:

var gulp = require('gulp');

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.");
});

# Plugin: gulp-watch

除此之外,Gulp 還能夠透過 gulp-watch 插件來監聽檔案的變化來觸發任務,首先透過 npm 工具安裝 gulp-watch

# Install gulp-watch plugin
$ npm install gulp-watch --save-dev

接著設定 gulpfile.js 配置文件,以下範例將會監聽 index.html 文件與 stlyes 文件夾下的 CSS 文件:

var gulp = require('gulp'),
    watch = require('gulp-watch');

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() {
  console.log("Imagine Sass or PostCSS tasks running here.");
});

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

# [Lecture] Gulp and PostCSS

# What is a CSS Workflow?

接下來的內容將討論三件事:

  1. Postprocessors

# 1. Autoprefixer

在 CSS 表中,有些屬性尚未被瀏覽器採用,因此必須透過 Autoprefixer 來替我們自動加上 CSS 供應商前綴(Vender Prefixes),比如我們只要編寫:

.item {
  columns: 300px 2;
}

透過 Autoprefixer 可以轉換成:

.item {
  -webkit-columns: 300px 2;
     -moz-columns: 300px 2;
          columns: 300px 2;
}

# 2. Preprocessors

除此之外,通常也會使用 Sass、Less 或 Stylus…等 CSS 預處理器(CSS Preprocessors) 來方便我們進行 CSS 開發,比如:

【CSS Variables】

$mainBlue: #2f5572;

. item {
  color: $mainBlue;
  border: 1px solid $mainBlue;
}

【Nested CSS】

.feature-box a {
  display: block;
  padding: 15px;
}

.feature-box a {
  padding: 10px;
  line-height: 1.7;
}
.feature-box {
  a {
    display: block;
    padding: 15px;
  }
  p {
    padding: 10px;
    line-height: 1.7;
  }
}

# 3. Postprocessors

CSS 後處理器(CSS Postprocessors) 如 PostCSS 則可以替我們將 CSS 檔案進行打包。

# Important Gulp/Node Terms

在 Gulp 中,有三個重要的概念:

  • gulp.src()
  • gulp.dest()
  • pipe()

其中 gulp.src() 放入來源檔案透過 pipe() 處理之後,由 gulp.dest() 指定目標位置。

# Hand-on: Write Code to Setup CSS workflow

首先改寫一下 gulpfile.js 檔案中的 gulp.task() 部分,下面的程式碼會使得每次修改並儲存 ./app/assets/styles/styles.css 檔案時,在 ./app/temp/styles 檔案夾中生成對應的檔案:

gulp.task('styles', function() {
  return gulp.src('./app/assets/styles/styles.css')
    .pipe(gulp.dest('./app/temp/styles'));
});

接下來,我們先透過 npm 安裝 gulp-postcssautoprefixerpostcss-simple-varspostcss-nested 插件:

# Install gulp-postcss plugin
$ npm install gulp-postcss --save-dev

# Install autoprefixer
$ npm install autoprefixer --save-dev

# Install postcss-simple-vars
$ npm install postcss-simple-vars --save-dev

# Install postcss-nested
$ npm install postcss-nested --save-dev

並修改 gulpfire.js 引入 gulp-postcssautoprefixerpostcss-simple-varspostcss-nested 插件,注意 gulp-postcss 中要使用陣列傳遞內容:

var gulp = require('gulp'),
    watch = require('gulp-watch'),
    postcss = require('gulp-postcss'),
    autoprefixer = require('autoprefixer'),
    cssvars = require('postcss-simple-vars'),
    nested = require('postcss-nested');

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([cssvars, nested, autoprefixer]))
  	.pipe(gulp.dest('./app/temp/styles'));
});

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

修改 ./app/assets/styles/styles.css 檔案並儲存:

$mainBlue: #2f5572;

body {
  color: $mainBlue;
  padding: 10px;
  margin: 10px;
  columns: 300px 2;
}

.box {
  a {
  	display: block;
  	padding: 10px;
  }
}
Last Updated: 12/15/2020, 10:27:30 PM