学习下 gulp 的使用与原理

2021/01/17 gulp 共 1767 字,约 6 分钟

gulp 给予前端小伙伴利用 JS 操作本地文件系统的能力。原本需要手动执行的工作,如文件压缩,编译CSS,优化图片等等交由gulp自动化处理,让我们更加专注于代码本身,大大提升了生产力。熟悉 gulp 的使用与基本原理,可以为今后的工作提供不小助力。

gulp 的安装与使用

下载,安装等操作,请参考 gulp 官方文档

概念

  1. 任务(task) gulp 任务是一个异步函数, 可接收 callback 作为参数;或者返回 stream, promise, eventEmitter, child process, 或者 observable 类型的函数。
// task 
// 当不返回任何数据时,调用 cb 以表示任务已经完成
function task1(done){
    // do something
    done() // call done when the task is done
}

// 返回 stream
function output(){
    return gulp.src('./*.js').
        pipe(gulp.dest('./dist'))
}

// 更多示例查看官网
  1. 插件 插件可以赋予 gulp 更加强大的能力,在这里列举一些例子
    • gulp-ugligy
    • gulp-connect 可以开启本地服务器
    • gulp-sass
    • gulp-babel
    • gulp-autoprefixer
    • readable-stream …
  2. Demo
const gulp = require('gulp')
const babel = require('gulp-babel')
const del = require('del')
const uglify = require('gulp-uglify')
const {pipeline} = require('readable-stream')  // 方便操作 stream 

const less = require('gulp-less')
const base64 = require('gulp-base64')
const connect = require('gulp-connect')

const {series,parallel,watch} = gulp // 通过官网了解详情
const jsDest = 'src/**/*.js'
const cssDest = 'src/**/*.less'
const htmlDest = 'src/**/*.html'

function clean(){
    return del(['./dist'])
}

function jsTask(){
    return gulp.src(jsDest).
        pipe(
            babel({
                presets: ['@babel/env']
            })
        ). 
        pipe(uglify()).
        pipe(gulp.dest('./dist/static'))
}

function cssTask(){
    return gulp.src(cssDest).
        pipe(less()). 
        pipe(base64()).
        pipe(gulp.dest('./dist/static'))

}

function htmlTast(){
    return gulp.src(htmlDest).
        pipe(gulp.dest('./dist'))
}

function server(){
    return connect.server({
        port: 8800,
        root: 'dist',
        livereload: true  // 开启热刷新
    })
}

watch([jsDest], function(){
    return jsTask().pipe(connect.reload())
})

watch([cssDest], function(){
    return cssTask().pipe(connect.reload())
})

watch([htmlDest], function(){
    return htmlTast().pipe(connect.reload())
})

exports.default = series(clean, parallel(jsTask, cssTask, htmlTast), server)

提一句 connect.reload 当 js / html 文件改变是,会通过 websocket 向浏览器推送消息,当前应用通过 location.reload() 刷新页面; 对应 css 文件做了特殊处理,修改 css 文件的引用而无需重新加载页面就可以刷新 css。

文档信息

Search

    Table of Contents