Gulp

99 阅读2分钟

gulp构建是基于内存实现的,支持同时执行多个任务,效率较高,使用方式更直观易懂,插件生态也很完善

  • 安装gulp

yarn add gulp # or npm install gulp

  • 安装gulp-load-plugins(加载插件)

  • gulp-sass(编译scss文件),

  • gulp-babel,@babel/core,@babel/preset-env(编译js),

  • gulp-swig(编译html),

  • gulp-imagemin(编译图片,字体)

  • browser-sync(服务器)

  • gulp-useref(引用文件)

  • gulp-ifdel(清除文件)

  • yarn add gulp-load-plugins gulp-sassgulp-babel @babel/core @babel/preset-envgulp-swiggulp-imagemin browser-sync gulp-useref del --dev

    // 实现这个项目的构建任务 const {src, dest, parallel, series,watch} = require('gulp')

    const del = require('del')

    const gulpLoadPlugins = require('gulp-load-plugins')

    const browserSync = require('browser-sync')

    const plugins = gulpLoadPlugins()

    const bs = browserSync.create()

    // const sass = require('gulp-sass')

    // const babel = require('gulp-babel')

    // const swig = require('gulp-swig')

    // const imagemin = require('gulp-imagemin')

    const data = {

    menus: [

    {

    name: 'Home',

    icon: 'aperture',

    link: 'index.html'

      },     
    

    {
    name: 'Features',

    link: 'features.html'

      },    
    

    {

    name: 'About',

    link: 'about.html'

      },   
    

    {

    name: 'Contact',

    link: '#',

    children: [

        { 
    
           name: 'Twitter',
    
            link: 'https://twitter.com/w_zce'
    
          }, 
    
         { 
    
           name: 'About', 
    
           link: 'https://weibo.com/zceme' 
    
         },  
    
        {     
    
        name: 'divider'  
    
        },    
    
     {          
    
          name: 'About', 
    
           link: 'https://github.com/zce' 
    
         }  
    
      ]   
    

    }

    ],

    pkg: require('./package.json'), 
    

    date: new Date()

    }

    //文件清除

    const clean =() => {

    return del('dist','temp')

    }

    //样式编译

    const style = () => {

    return src('src/assets/styles/*.scss',{base:'src'})

    .pipe(plugins.sass({outputStyle:'expanded'}))

    .pipe(dest('temp'))

    .pipe(bs.reload({stream:true}))}
    

    // 脚本编译

    const script = () => {

    return src('src/assets/scripts/*.js', {base:'src'})

    .pipe(plugins.babel({presets:['@babel/preset-env']}))
    
    .pipe(dest('temp'))
    
    .pipe(bs.reload({stream:true}))}
    

    //页面模板编译

    const page = () =>{

    return src('src/*.html',{base:'src'})

    .pipe(plugins.swig({data})) 
    

    .pipe(dest('temp'))

    .pipe(bs.reload({stream:true}))}
    

    //图片编译

    const image = () => {

    return src('src/assets/images/**',{base:'src'})

    .pipe(plugins.imagemin()) 
    

    .pipe(dest('dist'))}

    //字体编译

    const fonts = () => {

    return src('src/assets/fonts/**',{base:'src'})

    .pipe(plugins.imagemin())

    .pipe(dest('dist'))}
    

    //其他文件

    const extra = () => {

    return src('public/**',{base:'public'})

    .pipe(dest('dist'))}

    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/*.scss',fonts)

    // watch('public/**',extra)

    watch([

    'src/assets/images/**',

    'src/assets/fonts/*.scss',

    'public/**'],bs.reload)

    bs.init({

    notify:false,

      // files:'dist/**', 
    
       server:{  
    
          baseDir:['temp','src','public'],
    
            routes:{     
    
           '/node_modules':'node_modules'
    
            }     
    

    }

    })}

    const useref = () => { return src('temp/*.html',{base:'temp'})

    .pipe(plugins.useref({searchPath:['temp', '.']})) 
    

    //html css js

    .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 compile = parallel(style,script,page)

    const build = series(clean,parallel(series(compile,useref),image,fonts,extra))

    const develop = series(compile,serve)

    module.exports = { build, develop, clean}