Skip to content

nomadcoders-app/super-gulp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

17 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Super gulp

Main

πŸš€ Deploy Site

Learn Gulp by building an awesome development environment

Scripts

  • yarn: Install dependencies
  • yarn dev: Start live server for development
  • yarn build: Build this project
  • yarn deploy: Deploy this project

Learning Gulp

Scaffolding

Gulpλ₯Ό ν•™μŠ΅ν•˜κΈ° μœ„ν•΄ 일반적인 개발 ν™˜κ²½μ„ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€. Pug, SCSS 그리고 μ΅œμ‹  JS 문법을 μ‚¬μš©ν•˜λŠ” ν™˜κ²½μ—μ„œ λΈŒλΌμš°μ €μ—μ„œ ꡬ동될 수 μžˆλ„λ‘ gulp둜 λΉŒλ“œν•˜λŠ” 게 λͺ©μ μž…λ‹ˆλ‹€.

.
β”œβ”€β”€ .gitignore
β”œβ”€β”€ README.md
β”œβ”€β”€ package.json
β”œβ”€β”€ yarn.lock
└── src
    β”œβ”€β”€ index.pug
    β”œβ”€β”€ img
    β”‚   └── logo.png
    β”œβ”€β”€ js
    β”‚   β”œβ”€β”€ main.js
    β”‚   └── util.js
    β”œβ”€β”€ partials
    β”‚   β”œβ”€β”€ footer.pug
    β”‚   └── header.pug
    β”œβ”€β”€ scss
    β”‚   β”œβ”€β”€ _reset.scss
    β”‚   β”œβ”€β”€ _variables.scss
    β”‚   └── style.scss
    └── templates
        └── layout.pug

Configuring Babel for Gulp

gulp λͺ¨λ“ˆμ„ μ„€μΉ˜ν•˜κ³  gulp λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œ package.json의 scriptsλ₯Ό μΆ”κ°€ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

{
  "scripts": {
    "dev": "gulp dev",
    "build": "gulp build"
  },
}

gulp λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„  μΆ”κ°€λ‘œ gulpfile.js 파일이 ν•„μš”ν•©λ‹ˆλ‹€. gulpfile.jsμ—μ„œ import/export 문법을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ babel을 μ„€μΉ˜ν•©λ‹ˆλ‹€.

$ yarn add -D @babel/core @babel/register @babel/preset-env

그리고 gulpfile.babel.js둜 이름을 λ³€κ²½ν•©λ‹ˆλ‹€. μΆ”κ°€λ‘œ .babelrc을 μƒμ„±ν•©λ‹ˆλ‹€. 이둜써, gulpfileμ—μ„œ μ΅œμ‹  JS 문법을 μž‘μ„±ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Pug Compilation

scriptsμ—μ„œ μž‘μ„±ν•œ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ src 폴더 내에 ν•„μš”ν•œ νŒŒμΌμ„ μ»΄νŒŒμΌν•΄μ•Ό ν•©λ‹ˆλ‹€. dev λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜κ³  μ‹Άλ‹€λ©΄ gulp.babel.jsμ—μ„œ devλ₯Ό export ν•΄μ•Όν•©λ‹ˆλ‹€.

import gulp from 'gulp';

export const dev = console.log('scripts:dev');

그럼 λ¨Όμ € pug νŒŒμΌμ„ μ»΄νŒŒμΌν•˜κΈ° μœ„ν•΄ gulp-pugλ₯Ό μ„€μΉ˜ν•˜κ³  μ•„λž˜ λ‚΄μš©μ„ μž‘μ„±ν•©λ‹ˆλ‹€. μ΅œμƒμœ„ pug 파일 ν•˜λ‚˜λ§Œ λΉŒλ“œν•©λ‹ˆλ‹€.

import pug from 'gulp-pug';

const html = () => gulp.src('src/index.pug').pipe(pug()).pipe(gulp.dest('dist'));

export const dev = gulp.series(html);

src()λŠ” 파일 μ‹œμŠ€ν…œμœΌλ‘œλΆ€ν„° globs둜 μ„ νƒν•œ νŒŒμΌμ„ μ½μŠ΅λ‹ˆλ‹€. μ„ νƒν•œ νŒŒμΌμ€ pipe() λ©”μ„œλ“œλ₯Ό μ—°κ²°ν•˜μ—¬ λ³€ν˜•ν•©λ‹ˆλ‹€. pug νŒŒμΌμ„ μ»΄νŒŒμΌν•˜κΈ° μœ„ν•΄ gulp-pugλ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€. μ»΄νŒŒμΌν•œ κ²°κ³Όλ₯Ό dest()둜 μ›ν•˜λŠ” 폴더에 μ €μž₯ν•©λ‹ˆλ‹€.

λ‹€μ‹œ λΉŒλ“œκ°€ ν•„μš”ν•  λ•Œ dist 폴더λ₯Ό μ‚­μ œν•˜λ €λ©΄ del λͺ¨λ“ˆμ„ μ„€μΉ˜ν•˜κ³  μ•„λž˜ λ‚΄μš©μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

import del from 'del';

const clean = () => del('dist');

export const dev = gulp.series(
  gulp.parallel(clean),
  gulp.parallel(html),
);

역할에 따라 단계λ₯Ό λ‚˜λˆ„κΈ° μœ„ν•΄ parallel() λ©”μ„œλ“œλ‘œ μˆœμ„œλ₯Ό κ΅¬λΆ„ν–ˆμŠ΅λ‹ˆλ‹€.

Webserver and Watching Files

λΉŒλ“œ 결과물을 μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ gulp-webserverλ₯Ό μ„€μΉ˜ν•˜κ³  gulpfile에 μΆ”κ°€ν•©λ‹ˆλ‹€.

import webserver from 'gulp-webserver';

const ws = () => gulp.src('dist').pipe(webserver({ livereload: true }));

export const dev = gulp.series(
  gulp.parallel(clean),
  gulp.parallel(html),
  gulp.parallel(ws),
);

dev λͺ…λ Ήμ–΄λ₯Ό 톡해 μ„œλ²„λ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

파일 λ‚΄μš©μ„ λ³€κ²½ν–ˆμ„ λ•Œ μ•Œμ•„μ„œ λΉŒλ“œν•˜κ³  μ„œλ²„λ₯Ό μž¬μ‹œμž‘ν•  수 μžˆλ„λ‘ watch() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.

const watch = () => gulp.watch('src/**/*.pug', html);

export const dev = gulp.series(
  gulp.parallel(clean),
  gulp.parallel(html),
  gulp.parallel(ws, watch),
);

src 폴더 λ‚΄ λͺ¨λ“  pug νŒŒμΌμ— λŒ€ν•΄ 변경사항이 λ°œμƒν•œλ‹€λ©΄ pugλ₯Ό λ‹€μ‹œ μ‹€ν–‰ν•˜μ—¬ λΉŒλ“œν•©λ‹ˆλ‹€.

Image Optimization

gulp-image λͺ¨λ“ˆλ‘œ μ΅œμ ν™”ν•œ 이미지λ₯Ό λΉŒλ“œμ— 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

import image from 'gulp-image';

const img = () => gulp.src('src/img/*').pipe(image()).pipe(gulp.dest('dist/img'));

export const dev = gulp.series(
  gulp.parallel(clean),
  gulp.parallel(html, img),
  gulp.parallel(ws, watch),
);

SCSS Compilation

SCSSλ₯Ό λΉŒλ“œν•˜κΈ° μœ„ν•΄ gulp-sass(μΆ”κ°€λ‘œ sass도)λ₯Ό μ„€μΉ˜ν•˜κ³  μ•„λž˜ λ‚΄μš©μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

import dartSass from 'sass';
import gulpSass from 'gulp-sass';

const sass = gulpSass(dartSass);

const css = () =>
  gulp
    .src('src/scss/style.scss')
    .pipe(sass().on('error', sass.logError))
    .pipe(gulp.dest('dist/css'));

const watch = () => {
  gulp.watch('src/**/*.scss', css);
};

export const dev = gulp.series(
  gulp.parallel(clean),
  gulp.parallel(html, css, img),
  gulp.parallel(ws, watch),
);

SCSS 파일의 변경사항도 μΆ”μ ν•˜κΈ° μœ„ν•΄ watch에 μΆ”κ°€ν•΄λ‘‘λ‹ˆλ‹€.

CSS에 λŒ€ν•΄ λΈŒλΌμš°μ € ν˜Έν™˜μ„±μ„ 높이기 μœ„ν•΄ gulp-autoprefixerλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. λ™μ‹œμ— CSS 파일 압좕을 μœ„ν•΄ gulp-cssoλ₯Ό μ„€μΉ˜ν•˜κ³  μ•„λž˜ λ‚΄μš©μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

import autoprefixer from 'gulp-autoprefixer';
import csso from 'gulp-csso';

const css = () =>
  gulp
    .src('src/scss/style.scss')
    .pipe(sass().on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(csso())
    .pipe(gulp.dest('dist/css'));

autoprefixerλŠ” browserslistλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. 이 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜κ³  .browserslistrc νŒŒμΌμ— μž‘μ„±ν•˜μ—¬ 지원 λ²”μœ„λ₯Ό 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

Babel Support

import/export 문법과 λ”λΆˆμ–΄ μ΅œμ‹  JS 문법에 λŒ€ν•΄ λΈŒλΌμš°μ € ν˜Έν™˜μ„±μ„ 높이기 μœ„ν•΄μ„œ gulp-bro, babelify, uglifyifyλ₯Ό μ„€μΉ˜ν•˜κ³  λ‹€μŒ λ‚΄μš©μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

import browserify from 'gulp-bro';
import babelify from 'babelify';

const js = () =>
  gulp
    .src('src/js/main.js')
    .pipe(
      browserify({
        debug: process.env.NODE_ENV === 'development',
        transform: [
          babelify.configure({ presets: ['@babel/preset-env'] }),
          ['uglifyify', { global: true }],
        ],
      }),
    )
    .pipe(gulp.dest('dist/js'));

const watch = () => {
  gulp.watch('src/**/*.js', js);
};

export const dev = gulp.series(
  gulp.parallel(clean),
  gulp.parallel(html, css, js, img),
  gulp.parallel(ws, watch),
);
  • browserifyλŠ” λΈŒλΌμš°μ €κ°€ require 문법을 이해할 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
  • babelifyλŠ” browserify용 transform으둜 μ΅œμ‹  JS 문법이 λŒ€λΆ€λΆ„μ˜ λΈŒλΌμš°μ €μ— μ‹€ν–‰ κ°€λŠ₯ν•˜λ„λ‘ νŠΈλžœμŠ€νŒŒμΌλ§ν•©λ‹ˆλ‹€.
  • uglifyifyλŠ” μ½”λ“œλ₯Ό μ••μΆ•ν•˜μ—¬ μš©λŸ‰μ„ μ€„μž…λ‹ˆλ‹€.

개발 λͺ¨λ“œμΌ 경우, debug μ˜΅μ…˜μ„ μΆ”κ°€ν•˜μ—¬ SourceMap 파일이 μƒμ„±λ˜λ„λ‘ ν•˜μ—¬ 개발 ν™˜κ²½μ—μ„œ 디버그λ₯Ό μš©μ΄ν•˜κ²Œ ν•©λ‹ˆλ‹€.

Deploying

gulp-gh-pages둜 ν”„λ‘œμ νŠΈλ₯Ό λ°°ν¬ν•©λ‹ˆλ‹€.

import pages from 'gulp-gh-pages';

const clean = () => del(['dist', '.publish']);

const publish = () => gulp.src('dist/**/*').pipe(pages());

const prepare = gulp.parallel(clean);
const assets = gulp.parallel(html, css, js, img);
const live = gulp.parallel(ws, watch);

export const build = gulp.series(prepare, assets);
export const dev = gulp.series(build, live);
export const deploy = gulp.series(build, publish, clean);

package.json에 scripts:deployλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. gh-pages둜 λ°°ν¬ν•˜κ³  μƒμ„±λœ dist 폴더와 .publish 폴더λ₯Ό μ •λ¦¬ν•©λ‹ˆλ‹€.