gulp

项目做好之后,gulp是提供压缩代码、编译sass和合并文件的工具。

前端的构建工具常见的有Grunt、Gulp、Webpack三种,Grunt比较老旧,功能少,更新少,插件少。gulp是一个自动化构建工具,主要用来设定程序自动处理静态资源的工作。简单的说,gulp就是用来打包项目的。

中文官网:https://www.gulpjs.com.cn/docs/

安装:

npm i gulp -g
gulp -v # 测试是否安装成功

安装gulp依赖包

npm i gulp --save-dev # 因为在上线后是不需要这个包的,所以将这个项目安装在开发依赖

注意:局部安装表示在当前项目要使用的gulp,在局部中还得在安装一次gulp

创建gulpfile.js文件

必须要以此命名!!!

注册任务

// 定义一个任务 - 定义一个函数
function fn(){
    console.log(123);
}
// 导出这个任务即可
exports.fn = fn // 任务名称是fn,执行的函数是fn

在命令行中执行这个任务:gulp fn

如果任务名称定义成default,那么在执行任务的时候就不用输入任务名称了,直接使用gulp就能执行:

// 定义一个任务 - 定义一个函数
function fn(){
    console.log(123);
}
// 导入任务
exports.default = fn // 任务名称是default,执行的函数是fn

同步任务

如果希望让多个任务按照顺序执行,需要用到gulp的series接口:

// 导入gulp,并将series方法解构出来
const {series} = require('gulp');
// 定义任务1
function print1(cb){
    console.log('this is print task first');
    cb()
}
// 定义任务2
function print2(cb){
    console.log('this is print task second');
    cb()
}
// 因为两个任务都没有实际的意义,所以需要加回调函数才行
// 将任务导出并按照排好的顺序执行
exports.default = series(print1, print2)

异步任务

如果要让两个任务是异步执行的,需要用到gulp的parallel接口:

// 导入gulp,并将parallel方法解构出来
const {parallel} = require('gulp');
// 定义任务1
function print1(cb){
    console.log('this is print task first');
    cb()
}
// 定义任务2
function print2(cb){
    console.log('this is print task second');
    cb()
}
// 将任务导出并按照排好的顺序执行
exports.default = parallel(print1, print2)

读取文件

将本地文件读取到gulp内存中,需要用到gulp的src接口:

语法:src(要读取的文件路径)

保存文件

将内存中数据输出到本地文件中,需要使用gulp的dest接口:

dest(输出文件的文件夹路径)

既然gulp的所有操作都是基于流的,就需要将上一步的结果流向下一个操作,中间需要用到管道:

管道

管道的方法是pipe,不需要解构,直接就能用:

语法:

上一步的操作
.pipe(下一步的操作)

编译sass

 需要依赖一个插件:gulp-sass

下载这个插件:npm i gulp-sass

导入列子:

const sass = require('gulp-sass') // 导入的gulp-sass其实是一个函数,调用就能进行编译
//解构导入gulp
const {src,dest} = require('gulp')
function compileSass(cb){
       //将sass读取出来才能进行编译
       //读取文件 - 使用gulp中的src方法
       src('./sass/test)
       //编译
       //先使用一根管子接过来进行处理 - pipe()
       .pipe(sass())
       //保存 - 使用管子接过来,使用dest()方法保存
       .pipe(dest('./css')) // dest方法接受的参数是一个文件夹路径,文件夹不存在会自动创建
       cb()
}

exports.default = compileSass

 

合并文件

依赖插件:gulp-concat

导入

const concat = require('gulp-concat')
// 重命名 - 插件:gulp-rename
const rename = require('gulp-rename')
定义任务
function concatFile(c){
    // 读取文件
    // src('./css/*.css') // *代表所有
    // 合并
    .pipe(concat('c.css'))
    // 重命名
    .pipe(rename({
        prefix:'--'
    }))
    // 保存
    .pipe(dest('./css'))
    c()
}
//导出任务
exports.default = concatFile
function concatJs(cb){
    src('./js/*.js')
    .pipe(concat('all.js'))
    .pipe(dest('./js'))
    cb()
}

exports.default = concatJs
  
 

压缩css - 插件:gulp-clean-css

下载:

导入:css案列

const cleanCss = require('gulp-clean-css')
// 定义任务
function compress(cb){
    src('./css/--c.css')
    .pipe(cleanCss())
    .pipe(rename({
        suffix:".min"
    }))
    .pipe(dest('./css'))
    cb()
}
// 导出任务
exports.default = compress

压缩html

插件:gulp-htmlmin

导入

const htmlmin = require('gulp-htmlmin')

function compressHtml(cb){
    src('./html/a.html')
    .pipe(htmlmin({ collapseWhitespace: true }))
    .pipe(rename({
        suffix:".min"
    }))
    .pipe(dest('./html'))
    cb()
}

exports.default = compressHtml

压缩js:gulp-uglify

const uglify = require('gulp-uglify')
function compressJs(cb){
    src('./js/all.js')
    .pipe(uglify())
    .pipe(rename({
        suffix:".min"
    }))
    .pipe(dest('./js'))
    cb()
}
exports.default = compressJs

给css加前缀:gulp-autoprefixer

给css加前缀,将一些不兼容的css属性添加前缀让各个浏览器兼容

注意:

需要配置的兼容哪些浏览器

{
   browsers:["last 5 version","iOS > 3","Firefox > 2"]
}

会出现一个提示,希望将这个配置写在package.json中:

"browsersList":[
   "last 2 version",
   "iOS > 7",
   "Fixefox > 20"
]

 

const autoprefixer = require('gulp-autoprefixer')
function addPre(cb){
    src('./css/test.css')
    .pipe(autoprefixer())
    .pipe(rename({
        prefix:'jianrong-'
    }))
    .pipe(dest('./css'))
    cb()
}

exports.default = addPre

es6转es5 - 插件有3个,只要插件:gulp-babel - 只要导入这个插件即可

const babel = require('gulp-babel')
function es6ToEs5(cb){
    src('./js/es6.js')
    .pipe(babel({
        presets: ['es2015'] // 必须要有这个参数,否则会报错
    }))
    .pipe(rename('es5.js'))
    .pipe(dest('./js'))
    cb()
}

exports.default = es6ToEs5

清空目标文件夹:gulp-clean

const clean = require('gulp-clean')
function cleanDir(cb){
    src('./sass')
    .pipe(clean())
    cb()    
}

exports.default = cleanDir

gulp-load-plugins:打包插件(里面包含了其他所有插件) - 代替的插件必须是下载好的

半自动化构建项目 - watch

const {src, dest, watch, series} = require('gulp')
const $ = require('gulp-load-plugins')()
function compressCss(cb){
    src('./src/css/index.css')
    .pipe($.cleanCss())
    .pipe($.rename({
        suffix:".min"
    }))
    .pipe(dest('./dist/css'))
    cb()
}
// 监视任务:监视文件发生变化的时候,就执行这个压缩任务
function watcher(cb){
    watch('./src/css/index.css',{ignoreInitial:false,delay:5000},compressCss)
    // watch这个方法可以调用多次
    // watch('./src/js*.js',uglifyJs)
    cb()
}
// 清空目标文件夹
function cleanDir(cb){
    src('./dist',{allowEmpty:true})// 允许为空
    .pipe($.clean())
    cb()
}
exports.default = series(cleanDir,watcher)

// 处理:编译sass、添加前缀、压缩

全自动化构建项目

每个任务都要添加即时更新

.pipe(connect.reload())

插件open:自动打开浏览器  npm i opan

// 解构gulp
const {src,dest,watch,series,parallel} = require('gulp');
const $ = require('gulp-load-plugins')();
const open = require('open')
// 定义任务
// css - 添加前缀、压缩
// js - es6~es5、压缩
// html - 压缩

function handlerCss(cb){
    src('./src/css/*.css')
    .pipe($.autoprefixer())
    .pipe($.cleanCss())
    .pipe($.rename({
        suffix:".min"
    }))
    .pipe(dest("./dist/css"))
    .pipe($.connect.reload())
    cb()
}

function handlerJs(cb){
    src('./src/js/*.js')
    .pipe($.babel({
        "presets":['es2015']
    }))
    .pipe($.uglify())
    .pipe($.rename({
        suffix:".min"
    }))
    .pipe(dest("./dist/js"))
    .pipe($.connect.reload())
    cb()
}

function handlerHtml(cb){
    src('./src/*.html')
    .pipe($.htmlmin({
        collapseWhitespace:true
    }))
    .pipe(dest('./dist'))
    .pipe($.connect.reload())
    cb()
}

function clear(cb){
    src('./dist',{
        allowEmpty:true
    })
    .pipe($.clean())
    cb()
}

// 全自动化构建项目:自动刷新浏览器 - gulp-connect
function server(cb){
    $.connect.server({
        root:'./dist',
        port:9527,
        livereload:true
    })
    watch('./src/*.html',{ignoreInitial:false},handlerHtml)
    watch('./src/css/*.css',{ignoreInitial:false},handlerCss)
    watch('./src/js/*.js',{ignoreInitial:false},handlerJs)
    
      setTimeout(function () {
          open("http://localhost:9527/index.html");
      },500)
// 自己计算机的服务器,访问:localhost
    cb()
}

// function openBrowser(cb){
    
//     cb()
// }
exports.default = series(clear,server)

 

 

 

posted @ 2021-02-24 20:09  技术活当赏  阅读(163)  评论(0)    收藏  举报