前端工程构建之谈:gulp3要不要升级到Gulp4
关于升级还是不升级,这是一个哲学问题。
gulp4的语法更加现代,支持ES6的大部分写法,使用exports的方式去暴露任务组合,更加灵活和便捷。
gulp4同时也提供了很多强大的API,例如parallel()和series()。此外,gulp4不再支持同步任务,所以可以看到编写任务的时候也不再推荐使用.task()方法去编写,而是独立定义一个函数方法,然后用return去返回一个回调函数的结果。例如一个处理的css的任务,定义如下。
function minHeaderCss() {
// 这是一个回调函数的返回对象,本身也是异步的
return src([
'./static/css/header.css',
'./static/css/boot.css',
'./static/css/wrap.css',
'./static/css/feedback.css',
'./static/css/pronemove.css'
])
.pipe(minCss())
.pipe(concat('main_header.min.css'))
.pipe(dest('./static/css/min/'));
}
parallel()是并行执行多个任务(task),一个任务的错误将整个任务组合都结束,但是其他并行的任务可能执行完,也可能执行完。
series()是顺序执行,任何一个任务出错,所有后续任务都停止,有点单线程的感觉。
这两个方法都可以从gulp里面获得,如下。
const { series, parallel } = require('gulp');
只需要将需要执行的任务添加到series()或者parallel()里面即可:
const { series, parallel } = require('gulp');
function javascript(cb) {
// body omitted
cb();
}
function css(cb) {
// body omitted
cb();
}
exports.build = series(javascript, css);
exports.buildParallel = parallel(javascript, css)
如果想执行build任务组合,那么在命令行中执行如下语句:
gulp build
至于使用哪种方式,还是要是否构建过程很漫长。如果构建的步骤多,任务重,时间又长,肯定有限考虑使用parallel()来并行构建任务组合。
不同的任务组合还可以进行二次组合,可以对一些适合顺序执行的任务使用series(),对一些适合并行的任务使用parallel()。例如一些需要babel编译的Sass和js的任务使用parallel(),一个比较完整的构建脚本如下所示:
const {src, dest, watch, series, parallel, connect} = require('gulp');
const babel=require('gulp-babel');
const revAll = require('gulp-rev-all');
const cssver = require('gulp-make-css-url-version');
const del = require('del');
const htmlmin = require('gulp-htmlmin');
// 可以使用ES6 => 语法来编写任务
const babelCss = () => src(['./css/**/*.css'])
.pipe(cssver())
.pipe(cleancss({compatibility: 'ie7', format: 'keep-breaks', keepSpecialComments :'*'}))
.pipe(dest('./dist/css/'))
.pipe(connect.reload());
function babelJs() {
return src(['./js/**/*.js'])
.pipe(babel({presets: ['@babel/env']}))
.pipe(uglify({
mangle:true,
compress:true})
.pipe(dest('./dist/js/'))
.pipe(revAll.manifestFile())
.pipe(dest('./dist/rev/'));
}
function clean() {
return del('./dist');
}
function babelHtml() {
return src(['./app/tpl/*.html'])
.pipe(htmlmin({
removeComments: true,
collapseWhitespace: true
}))
.pipe(dest('./dist/html/'));
}
// 嵌套使用series和parallel
export.build = exports.build = series(clean,parallel(babelJs, babelCss),babelHtml);
这还是一个简易的构建脚本,还缺少一个watch,监听项目中css、js、html文件的变化,一旦发生变化就触发对应的方法。gulp服务一直运行着,实时刷新。
我个人认为,如果是长期维护的项目,还是可以考虑拥抱gulp4,毕竟Gulp4的强大,是真香!
前端工程构建之谈:gulp3要不要升级到Gulp4的更多相关文章
- fis3前端工程构建配置入门教程
一.前言 fis3是百度推出的一款前端工程构建工具,类似的还有webpack,gulp等工具:无论大家有没有使用过,从事前端行业应该都略知一二了,所以对于此类工具用干嘛的我这里就不做重复了. 其实对于 ...
- 前端工程构建工具FIS3
FIS3 是面向前端的工程构建工具.解决前端工程中性能优化.资源加载(异步.同步.按需.预加载.依赖管理.合并.内嵌).模块化开发.自动化工具.开发规范.代码部署等问题. 一.安装 全局安装fis3 ...
- 前端工程构建工具之Yeoman
一.Yeoman 简介 通常在开发新项目时我们都需要配置工程环境,开发目录,需要下载一些库.框架文件(如 jQuery.Backbone 等),配置编译环境(Less.Sass.Coffeescrip ...
- 前端工程构建工具——Yeoman
一.Yeoman 简介 通常在开发新项目时我们都需要配置工程环境,开发目录,需要下载一些库.框架文件(如 jQuery.Backbone 等),配置编译环境(Less.Sass.Coffeescrip ...
- 前端资源构建-Grunt环境搭建
前端资源构建-Grunt 随着前端开发的复杂度越来越高,前端页面动辄上几十个js,十几个html页面.用户打开一个页面需要加载一堆的css,js,html文件,对于有大量用户的web应用来说,既消耗服 ...
- [转]gulp构建前端工程
摘要: Gulp 是一个自动化工具,前端开发者可以使用它来处理常见任务: 搭建web服务器 文件保存时自动重载浏览器 使用预处理器如Sass.LESS 优化资源,比如压缩CSS.JavaScript. ...
- 前端工程的构建工具对比 Gulp vs Grunt
1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Java项目而出现的Maven.Node催生了一批自动化工 ...
- 绝对精品推荐做前端的看下:Web前端开发体会十日谈
20151208感悟: 前端人的角度来看的话,感觉像是阅读一个大牛前端的全部武功的一个秘籍说明,里面的思想高价值蛋白真是太多太多,推荐看. Web前端开发体会十日谈 一直想写这篇“十日谈”,聊聊我对W ...
- 前端自动化构建工具gulp的使用总结
前端自动化构建工具gulp的使用总结 博主最近偶的空闲,在此对gulp的使用做一个总结,让小伙伴知道如何合理的使用gulp以及gulp的使用技巧. 谈到gulp,有人可能就会想到另外一个构建工具gru ...
随机推荐
- python序列(七)序列操作的常用内置函数
1.len(列表):返回:列表中的元素个数,同样适用于元组.字典.集合.字符串等. max(列表).min(列表):返回列表中的最大或最小元素同样适用于元组.字典.集合.range对象等. sum(列 ...
- 在 xunit 测试项目中使用依赖注入
在 xunit 测试项目中使用依赖注入 Intro 之前写过几篇 xunit 依赖注入的文章,今天这篇文章将结合我在 .NET Conf 上的分享,更加系统的分享一下在测试中的应用案例. 之所以想分享 ...
- java中远程调用接口springboot
package com.kakarote.crm.utils; import cn.hutool.core.util.ObjectUtil; import org.apache.http.client ...
- Lombok注解-@SneakyThrows
@SneakyThrows注解的用途得从java的异常设计体系说起. java中我们常见的2类异常. 1.普通Exception类,也就是我们常说的受检异常或者Checked Exception. 2 ...
- postgre sql递归查询
WITH RECURSIVE r AS (SELECT * FROM [表] WHERE id = xxxunion ALLSELECT [表].* FROM [表], r WHERE [表]. ...
- [LeetCode]234. Palindrome Linked List判断回文链表
重点是: 1.快慢指针找到链表的中点.快指针一次走两步,慢指针一次走一步,分清奇偶数情况. 2.反转链表.pre代表已经反转好的,每次将当前节点指向pre /* 快慢指针得到链表中间,然后用206题方 ...
- [leetcode]39combinationsum回溯法找几个数的和为目标值
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Given a set of can ...
- VIM操作快捷键
i:插入光标前一个字符I:插入行首a:插入光标后一个字符A:插入行末o:向下新开一行,插入行首O:向上新开一行,插入行首M:光标移到中间行L:光标移动到屏幕最后一行行首G:移动到指定行{:按段移动,上 ...
- JS function 是函数也是对象, 浅谈原型链
JS function 是函数也是对象, 浅谈原型链 JS 唯一支持的继承方式是通过原型链继承, 理解好原型链非常重要, 我记录下我的理解 1. 前言 new 出来的实例有 _proto_ 属性, 并 ...
- vue中的插值操作
mustache语法 1.将data的文本数据插入至html语句中,使用mustache语法. v-once指令 2.在某些情况下,我们不希望界面随意的跟随改变,这个时候我们可以使用v-once的指令 ...