前端工程化-gulp

250 阅读3分钟
组合任务
yarn init -yes
yarn add gulp --dev
// yarn gulp foo
exports.foo = done => {
    console.log('foo')
    done()
}
// yarn gulp default
exports.default = done => {
    console.log('default')
    done()
}
// yarn gulp bar
const gulp = require('gulp')
gulp.task('bar', done => {
    console.log('bar')
    done()
})
const { series, parallel } = require('gulp')
​
const task1 = done => {
    setTimeout(() => {
        console.log('task1')
        done()
    }, 1000)
}
​
const task2 = done => {
    setTimeout(() => {
        console.log('task2')
        done()
    }, 1000)
}
​
const task3 = done => {
    setTimeout(() => {
        console.log('task3')
        done()
    }, 1000)
}
​
exports.foo = series(task1, task2, task3)
exports.bar = parallel(task1, task2, task3)
异步任务
exports.callback = done => {
    console.log('callback')
    done()
}
​
exports.callback_error = done => {
    console.log('callback')
    done(new Error('task failed'))
}
​
exports.promise = done => {
    console.log('promise')
    return Promise.resolve()
}
​
exports.promise_error = done => {
    console.log('promise')
    return Promise.reject(new Error('task failed'))
}
​
const timeout = time => {
    return new Promise(resolve => {
        setTimeout(resolve, time)
    })
}
​
exports.async = async () => {
    await timeout(1000)
    console.log('async task')
}
​
const fs = require('fs')
exports.stream = () => {
    const readStream = fs.createReadStream('package.json')
    const writeStream = fs.createWriteStream('temp.txt')
    readStream.pipe(writeStream)
    return readStream
}
Gulp构建过程核心工作原理
const fs = require('fs')
const { Transform } = require('stream')
​
exports.default = () => {
    // 文件读取流
    const read = fs.createReadStream('normalize.css')
    // 文件写入流
    const write = fs.createWriteStream('normalize.min.css')
    // 核心转换过程实现
    // chunk => 读取流中读取到的内容(Bufffer)
    const transform = new Transform({
        transform: (chunk, encoding, callback) => {
            const input = chunk.toString()
            const outpit = input.replace(/\s+/g, '').replace('//*.+?*//g', '')
            callback(null, output)
        }
    })
    // 把读取出来的文件流导入写入文件流 /* */
    read.pipe(write)
    return read
}
文件操作API
yarn add gulp-clean-css gulp-rename --dev
const { src, dest } = require('gulp')
const cleanCss = require('gulp-clean-css') // 压缩css转换流
const rename = require(‘gulp-rename')  // 重命名
​
export default = () => {
  return src('src/*.css')
    .pipe(cleanCss())
    .pipe(rename({ extname: '.min.css' }))
    .pipe(dest('dist'))
}
样式编译
yarn add gulp-sass --dev
const { src, dest } = require('gulp')
const sass = require(‘gulp-sass') // 转换流const style = () =>{
  return src('src/assets/styles/*.scss', { base: 'src' }) // base根据文件目录输出
    .pipe(sass({ outputStyle: ’expanded' })) // 只会转换没有下划线开头的文件
    .pipe(dest('dist'))
}
​
module.exports = {
  style
}

运行yarn gulp style

脚本文件编译
yarn add gulp-babel @babel/core @babel-preset-env --dev
const babel = require(‘gulp-babel')
​
const script = () =>{
  return src('src/assets/scripts/*.js', { base: 'src' }) // base根据文件目录输出
    .pipe(babel({ presets: ['@babel/preset-env'] }))
    .pipe(dest('dist'))
}
​
module.exports = {
  style,
  script  
}

yarn gulp script

页面模板编译
yarn add gulp-swig --dev
const { src, dest, parallel } = require('gulp')
const swig = require(‘gulp-swig')
​
const data = [] // html的数据标记const page = () =>{
  return src('src/*.html', { base: 'src' }) // base根据文件目录输出
    .pipe(swig({ data }))
    .pipe(dest('dist'))
}
​
// 组合任务
const compile = parallel(style, script, page)
​
module.exports = {
  style,
  script,
  page,
  compile
}

yarn gulp page

yarn gulp compile

图片和字体文件转换
yarn add gulp-imagemin --dev
const imagemin = require(‘gulp-imagemin')
​
const image = () =>{
  return src('src/assets/images/**', { base: 'src' })
    .pipe(imagemin({ data }))
    .pipe(dest('dist'))
}
​
const font = () =>{
  return src('src/assets/font/**', { base: 'src' })
    .pipe(imagemin({ data }))
    .pipe(dest('dist'))
}
​
const compile = parallel(style, script, page, image, font)
​
module.exports = {
  compile,
  image,
  font
}

yarn gulp image

其他文件及文件清除
yarn add del --dev
const { src, dest, parallel, series } = require('gulp')
const imagemin = require(‘gulp-imagemin')const clean = () =>{
  return del(['dist'])
}
​
const build = series(clean, parallel(compile, extra))
​
module.exports = {
  compile,
  build
}

yarn gulp build

自动加载插件
yarn add gulp-load-plugins --dev
const { src, dest, parallel, series } = require('gulp')
const loadPlugins = require(‘gulp-load-plugins')
​
const plugins = loadPlugins()
​
const font = () =>{
  return src('src/assets/font/**', { base: 'src' })
    .pipe(plugins.imagemin({ data }))  // 可以不引入require,直接plugins.使用
    .pipe(dest('dist'))
}
​
const build = series(clean, parallel(compile, extra))
​
module.exports = {
  compile,
  build
}

yarn gulp build

开发服务器

// 自动热更新到浏览器

yarn add browser-sync --dev
const { src, dest, parallel, series, watch } = require('gulp')
const browserSync = require('browser-sync')
​
// 不使用files使用bs.reload
const style = () => {
  return src('src/assets/styles/*.scss', { base: 'src' })
    .pipe(plugins.sass({ outputStyle: 'expanded' }))
    .pipe(dest('temp'))
    .pipe(bs.reload({ stream: true })) // 改变文件自动更新浏览器
}
​
const serve = () => {
  watch('src/assets/styles/*.scss', style) // 修改文件自动更新
  watch('src/assets/scripts/*.js', script)
  watch('src/*.html', page)
  // watch('src/assets/images/**', image)
  // watch('src/assets/fonts/**', font)
  // watch('public/**', extra)
  watch([ // 减少构建次数
    'src/assets/images/**',
    'src/assets/fonts/**',
    'public/**'
  ], bs.reload)
​
  bs.init({
    notify: false, // 关闭右上角提示
    port: 2080, // 端口
    // open: false, // 自动打开浏览器
    // files: 'dist/**', // dist改变自动更新浏览器
    server: {
      baseDir: ['dist', 'src', 'public'], // src, public下文件开发阶段不需监听
      routes: {
        '/node_modules': 'node_modules' // 处理node_modules
      }
    }
  })
}
​
const compile = parallel(style, script, page)
const dev = series(compile, serve)
// 上线之前执行的任务
const build =  series(
  clean,
  parallel(
    compile,
    image,
    font,
    extra
  )
)
​
module.exports = {
  dev,
  compile,
  build
}
useRef文件引用处理
yarn add gulp-useref --dev
const { src, dest, parallel, series } = require('gulp')
​
// 处理html构建注释
const useref = () => {
  return src('dist/*.html', { base: 'dist' })
    .pipe(plugins.useref({ searchPath: ['dist', '.'] })) // .项目根目录(找node-modules)
    // html js css
    .pipe(plugins.if(/.js$/, plugins.uglify()))
    .pipe(plugins.if(/.css$/, plugins.cleanCss()))
    .pipe(plugins.if(/.html$/, plugins.htmlmin({
      collapseWhitespace: true,
      minifyCSS: true,
      minifyJS: true
    })))
    .pipe(dest('dist'))
}
​
​
// 上线之前执行的任务
const build =  series(
  clean,
  parallel(
    series(compile, useref),
    image,
    font,
    extra
  )
)
​
module.exports = {
  compile,
  build
}

yarn gulp build