May 5, 2015

Berkenalan dengan Sass + Gulp

Sass adalah tools yang biasa digunakan oleh para front-end developer masa kini untuk membuat CSS yang mudah untuk dikembangkan, dirawat serta dimodifikasi. Dalam istilah teknisnya, Sass tergolong kedalam preprocessor CSS (baca: mengapa kita butuh preprocessor CSS). Dengan Sass, kita dapat menggunakan beberapa fungsi yang memudahkan kita untuk membuat CSS.

Program Sass pada awalnya ditulis dalam bahasa Ruby, sehingga untuk menggunakannya kita harus menginstal Ruby pada komputer kita. Namun saat ini kita dapat menggunakan Sass tanpa harus menginstal Ruby. Pada artikel ini, saya akan menjelaskan bagaimana cara menggunakan Sass dengan Gulp. Gulp sendiri adalah program task runner yang berbasis NodeJS. Pada Gulp terdapat plugin untuk Sass (gulp-sass) yang kinerjanya jauh lebih cepat dibandingkan dengan Sass yang dijalankan dengan Ruby.

Sebelum mengikuti artikel ini lebih lanjut, unduh dan instal terlebih dahulu NodeJS sesuai dengan spesifikasi komputer kamu.

Instalasi gulp dan gulp-sass

Untuk menginstal Gulp, sebelumnya cd ke direktori tempat menyimpan projek html kamu. Setelah itu, masukkan perintah di bawah ini pada terminal kamu (mungkin butuh akses root):

  
npm install --save-dev gulp

Pasang gulp-sass dengan memasukkan perintah ini:

  
npm install --save-dev gulp-sass

Setelah proses pengunduhan selesai, gulp-sass akan terinstal pada folder node_modules.

Membuat folder scss dan css

Buat folder scss dan css di dalam folder projek kamu. Pada folder scss, buatlah file berekstensi .scss yang digunakan untuk menuliskan kode-kode Sass. File CSS yang dihasilkan dari program Sass nantinya akan tersimpan pada folder css.

Membuat gulpfile.js

Buat file gulpfile.js pada folder projek kamu, lalu buka file tersebut pada aplikasi text editor yang kamu miliki. Salin kode di bawah ini ke dalam gulpfile.js.

  
var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    gulp.src('./scss/*.scss') // direktori tempat menyimpan file sass
    .pipe(sass())
    .pipe(gulp.dest('./css')); // direktori tempat menyimpan file css
});

gulp.task('watch', function() {
    gulp.watch('./scss/*.scss', // direktori tempat menyimpan file sass 
    ['sass']);
});

gulp.task('default', ['watch']);

Pada kode diatas, kita membuat dua task. Task ‘sass’ digunakan untuk menjalankan program sass, sedangkan task ‘watch’ digunakan untuk melihat setiap kali ada perubahan pada kode sass yang kita buat. Jadi apabila kita membuat perubahan pada kode sass, task watch akan membuat ulang file css yang baru.

Jalankan gulp

Masukkan perintah gulp untuk menjalankan program Gulp dengan konfigurasi yang sudah kita atur sebelumnya pada file gulpfile.js. Berikut tampilan terminal saat menjalankan program Gulp:

[19:04:21] Using gulpfile ~/Projects/contoh/gulpfile.js
[19:04:21] Starting 'watch'...
[19:04:21] Finished 'watch' after 7.78 ms
[19:04:21] Starting 'default'...
[19:04:21] Finished 'default' after 9.02 μs

Variabel

Saat program Gulp berjalan, tulis sintaks dibawah ini pada file .scss.

$dark-blue: #0A276C;

body {
  color: $dark-blue;
}

Pada kode di atas, kita mendeklarasikan variabel $dark-blue yang menyimpan nilai warna dalam format hex. Variabel tersebut kita gunakan untuk mengisi atribut color pada tag body.

Saat kamu menyimpan file di atas, program Gulp akan menerjemahkan sintaks Sass dan membuat file CSS pada folder css. Contoh keluarannya akan seperti di bawah ini.

body {
  color: #0A276C; }

Semua style yang menggunakan variabel $dark-blue akan diubah secara otomatis sesuai dengan nilai atau string yang dimasukkan pada variabel tersebut.

Nesting

Selain variabel, kita juga dapat menggunakan sistem nesting untuk menulis selector. Hal ini dapat memudahkan kita untuk menulis style dengan bentuk yang sama dengan hierarki tag HTML yang kita buat. Di bawah ini adalah contoh penggunaannya.

  
nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  li { display: inline-block; }

  a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
  }
}

Contoh di atas menunjukkan bahwa kita dapat menulis selector ul, li, dan a di dalam selector nav. Tentu saja kita juga bisa menulis selector di dalam selector ul, li, atau a. Meskipun kita dapat membuat nested selector sedalam dan sebanyak mungkin, namun hal ini dapat menyebabkan kode Sass akan sulit di-maintain. Di bawah ini adalah CSS yang merupakan hasil penerjemahan sintaks Sass:

  
nav ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

nav li {
  display: inline-block;
}

nav a {
  display: block;
  padding: 6px 12px;
  text-decoration: none;
}

Import

Mungkin kamu telah mengenal fungsi @import yang terdapat pada CSS. Pada Sass terdapat pula fungsi @import dan kegunaannya pun sama, yaitu untuk memisahkan beberapa bagian dari kode CSS menjadi file dengan ukuran yang lebih kecil sehingga lebih mudah dibaca dan di-maintain. Pada CSS, semakin banyak fungsi @import akan menyebabkan semakin banyak HTTP request yang terjadi pada aplikasi web. Tentu saja hal ini akan menghabiskan kuota bandwith server atau hosting kamu. Pada Sass, semua file yang diinisialisasi menggunakan @import digabungkan dengan file yang memanggil fungsi @import. Sehingga kita dapat memperoleh satu file CSS saja untuk digunakan pada production.

Sebagai contoh, misalkan kita memiliki dua file Sass, _reset.scss dan base.scss. Kita ingin mengimpor _reset.scss ke dalam base.scss.

  
// _reset.scss

html,
body,
ul,
ol {
   margin: 0;
  padding: 0;
}
  
/* base.scss */

@import 'reset';

body {
  font: 100% Helvetica, sans-serif;
  background-color: #efefef;
}

Pada contoh di atas, kita menggunakan @import 'reset' pada base.scss. Oleh program Sass, kode pada _reset.scss dapat digabungkan dengan kode pada base.scss sehingga menjadi seperti di bawah ini:

  
html, body, ul, ol {
  margin: 0;
  padding: 0;
}

body {
  font: 100% Helvetica, sans-serif;
  background-color: #efefef;
}

Mixin

Sass memiliki fungsi @mixin yang penggunaannya mirip dengan function seperti pada bahasa pemograman. Karena sifatnya seperti function, kita dapat mengunakannya berulang-ulang pada kode Sass yang kita miliki sesuai kebutuhan. Di bawah ini adalah contoh penggunaannya untuk membuat border-radius yang biasanya membutuhkan banyak penulisan vendor prefixes.

  
@mixin border-radius($radius) {
  -webkit-border-radius: $radius;
     -moz-border-radius: $radius;
      -ms-border-radius: $radius;
          border-radius: $radius;
}

.box { @include border-radius(10px); }

Hasil CSS akan terlihat seperti di bawah ini:

  
.box {
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  -ms-border-radius: 10px;
  border-radius: 10px;
}

Extend

Dengan @extend, kita dapat membagikan suatu set dari properti CSS dari satu selector ke selector yang lain. Berikut adalah contoh penggunaannya:

  
.message {
  border: 1px solid #ccc;
  padding: 10px;
  color: #333;
}

.success {
  @extend .message;
  border-color: green;
}

.error {
  @extend .message;
  border-color: red;
}

.warning {
  @extend .message;
  border-color: yellow;
}

Pada contoh di atas, selector .success, .error dan .warning akan memiliki style yang sama dengan selector .message. Hasilnya akan seperti di bawah ini:

  
.message, .success, .error, .warning {
  border: 1px solid #cccccc;
  padding: 10px;
  color: #333;
}

.success {
  border-color: green;
}

.error {
  border-color: red;
}

.warning {
  border-color: yellow;
}

Operator

Kita juga dapat melakukan operasi matematika seperti +, -, *, /, dan % pada Sass. Contoh penggunaannya dapat dilihat di bawah ini.

  
.container { width: 100%; }

article[role="main"] {
  float: left;
  width: 600px / 960px * 100%;
}

aside[role="complimentary"] {
  float: right;
  width: 300px / 960px * 100%;
}

CSS yang dihasilkan akan terlihat seperti di bawah ini.

  
.container {
  width: 100%;
}

article[role="main"] {
  float: left;
  width: 62.5%;
}

aside[role="complimentary"] {
  float: right;
  width: 31.25%;
}

Penutup

Contoh-contoh penggunaan Sass yang terdapat pada artikel ini saya ambil dari situs asli Sass. Meskipun begitu, masih banyak lagi fungsi-fungsi pada Sass yang belum dijelaskan dalam artikel ini. Untuk mengetahui lebih lanjut tentang Sass, kamu dapat melihat dokumentasi lengkap Sass di sini.