最近在开发几个网站,为了优化一下前端代码,就复习一下gulpjs,之前工作gulp用的版本比较老,但是今天看了新的版本,新的语法出了一下,但是为了时间,我决定使用之前gulp3的旧版本,后面发现自己环境的node的版本是最新的,所以不得让我来了解一下gulp的新版本,里面用到的最多就是commonjs的模块化,解释如下:

gulp4的官网地址: https://www.gulpjs.com.cn/

gulp3的官网地址: https://v3.gulpjs.com.cn/

下面代码了解新语法:

const { src, dest, watch, task, series, parallel } = require('gulp');//gulp的文件流API
const rename = require('gulp-rename');//文件重命名的插件
const uglify = require('gulp-uglify');//压缩JS文件的插件
const cleanCss = require('gulp-clean-css');//压缩CSS文件的插件
const connect = require('gulp-connect');//热更新的插件
const webserver = require('gulp-webserver');//热更新的插件
const clean = require('gulp-clean');//删除文件的插件
const fileInclude = require('gulp-file-include'); //公共代码复用的插件
const htmlmin = require('gulp-htmlmin');//压缩HTML文件的插件 //设置源文件和输出文件的目录配置
const path = {
'html' : './src/',
'css' : './src/css/',
'js' : './src/js/',
'lib' : './src/lib/',
'component' : './src/component/',
'html_dist' : './dist/',
'css_dist' : './dist/css/',
'js_dist' : './dist/js/',
'lib_dist' : './dist/lib/',
'component_dist' : './dist/component/'
}; //设置HTML压缩任务
task('html', function () {
var options = {
removeComments : true, //清除HTML中的注释
collapseWhitespace : true, //去除HTML中的空格
collapseBooleanAttributes : true, //省略布尔属性的值<input type="checkbox" checked="true"> 压缩后为 <input type="checkbox" checked>
removeEmptyAttributes : true, //删除所有空格作属性值<input type="checkbox" id=""> 压缩后为 <input type="checkbox">
removeScriptTypeAttributes : true, //删除<script>的type="text/javascript"
removeStyleLinkTypeAttributes : true, //删除<style>和<link>的type="text/css"
minifyJS : true, //压缩页面JS
minifyCSS : true //压缩页面CSS
};
return src(path.html + '*.html')
.pipe(htmlmin(options))
.pipe(dest(path.html_dist));
}) //设置CSS压缩任务
task('css', function () {
return src(path.css + '*.css')
.pipe(cleanCss())
.pipe(rename({
'suffix' : '.min'//添加后缀名
}))
.pipe(dest(path.css_dist));
}); //设置JS压缩任务
task('js', function () {
return src(path.js + '*.js')
.pipe(uglify())
.pipe(rename({
'suffix' : '.min'//添加后缀名
}))
.pipe(dest(path.js_dist));
}); //设置第三方依赖任务 => [无需合并和压缩等操作,直接输出到指定目录]
task('lib', function () {
return src(path.lib + '*.js')
.pipe(dest(path.lib_dist));
}) //设置公共代码复用的任务 => [相当于组件的封装]
task('fileInclude', function () {
return src(path.component + '*.html')
.pipe(fileInclude({
prefix : '@@',
basepath : '@file'
}))
.pipe(dest(path.component_dist));
}); //设置删除上一次创建的dist文件夹的任务 => [在打包之前,一般需要先清空原来的文件,保证当前文件是最新的]
task('clean', function () {
return src('dist', {
allowEmpty : true
}).pipe(clean());//清除dist目录
}); // 创建热加载任务
task('reload', function () {
return src('dist')
.pipe(connect.reload());
}) //设置实时监控任务[热加载]
task('watch', function () {
watch(path.html, series('html', 'reload'));//监控HTML任务
watch(path.css + '*.css', series('css', 'reload'));//监控CSS任务
watch(path.js + '*.js', series('js', 'reload'));//监控JS任务
watch(path.lib + '*.js', series('lib', 'reload'));//监控第三方JS任务
watch(path.component + '*.html', series('fileInclude', 'reload'));//监控复用代码文件的任务 => [相当于封装组件]
}); //设置后台服务任务【 ----- ️方式一 ️ ----- 】
// task('server', function (done) {
// connect.server({
// root : 'dist',//设置后台服务访问的默认目录
// port : 8888,//设置后台默认的访问端口
// livereload : true//开启热加载
// });
// done();//执行该服务
// }); //设置后台服务任务【 ----- ️方式二 ️ ----- 】
task('server', function () {
return src('dist')
.pipe(webserver({
host : 'localhost',//默认访问的地址【域名或者ip】
port : 8023,//默认访问的端口号
path : '/',//访问当前访问目录的根目录 例如:表示为 dist/
livereload : true,//开启热加载
directoryListing : false,//true 设置为false时,访问默认的index.html
fallback : 'index.html',//默认访问的入口文件 相对于设置的path路径来说
open : true,//是否自动打开浏览器
/**
*@desc 代理配置 如下:
* proxies: [
* {
* source: '/api', target: 'http://backend.api/api'
*
* }
* ]
*/
proxies : []//代理配置
}));
}) //执行所有任务 => [gulp3]
// task('default', series(
// 'clean',//删除上一次的文件夹,来保持当前为最新的数据
// parallel([ 'html', 'css', 'js', 'lib', 'fileInclude' ]),//并行执行所有任务
// 'server',//启动服务任务
// 'watch'//启动监视任务
// )); //执行所有任务 => [gulp4]
module.exports.default = series(
'clean',
parallel([ 'html', 'css', 'js', 'lib', 'fileInclude' ]),
'server',
'watch'
); /**
* @desc 总结 gulp4 的series() 和 parallel() 两个新方法
* 说明如下:
* 1. series(任务1,任务2,...) => 使任务按顺序执行,第一个任务完成,才会执行下一个任务,简单来说相当于一个队列。
* 2. parallel(任务1,任务2,...) => 以最大并发来运行的任务,任务同时执行。
*
* @desc 总结 gulp-connect() 和 gulp-webserver() 方法
* 说明如下:
* 1. gulp-connect() => 内部connect.server()返回的是一个对象,
* 所以不能直接返回,只能在处理完成之后,直接返回当前传入的参数,该参数为该函数本身。
* 2. gulp-webserver() => 该插件的特点是可以设置代理,当前处理的管道函数最后直接返回就好了,但是反应相对比较慢
*
* @desc 总结 gulp3【本章任务的处理方式哦】 和 gulp4 处理任务的方式:
* 1. gulp3 处理任务方式是:gulp.task(任务名,处理函数)
* 2. gulp4 处理任务方式是:module.exports.任务名 = 任务名(可以是一个匿名函数或者是函数名)
* 写法如下:
* const test = function(done) {
* done();
* };
* 或者
* function test(done) {
* done();
* }
* 最后执行方法:module.exports.test = test
* 后台执行命令为:gulp test
*/

详解 Gulp4 和 Gulp3 的区别的更多相关文章

  1. 详解CALayer 和 UIView的区别和联系

    详解CALayer 和 UIView的区别和联系   前言 前面发了一篇iOS 面试的文章,在说到 UIView 和 CALayer 的区别和联系的时候,被喵神指出没有切中要点,所以这里就 CALay ...

  2. 详解path和classpath的区别

    详解path和classpath的区别 path的作用 path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行JAVA文件,但必须把完整的路径写出来,如C:\Progr ...

  3. 详解synchronized与Lock的区别与使用

    知识点 1.线程与进程 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程.关系是线程–>进程–>程序的大致组成结构.所以线程是程序执行流的最小单位 ...

  4. Java Thread(线程)案例详解sleep和wait的区别

    上次对Java Thread有了总体的概述与总结,当然大多都是理论上的,这次我将详解Thread中两个常用且容易疑惑的方法.并通过实例代码进行解疑... F区别 sleep()方法 sleep()使当 ...

  5. 详解python2 和 python3的区别

    看到这个题目大家可能猜到了我接下来要讲些什么,呵呵,对了,那就是列出这两个不同版本间的却别!搜索一下大家就会知道,python有两个主要的版本,python2 和 python3 ,但是python又 ...

  6. 详解python2 和 python3的区别-乾颐堂

    看到这个题目大家可能猜到了我接下来要讲些什么,呵呵,对了,那就是列出这两个不同版本间的却别!搜索一下大家就会知道,python有两个主要的版本,python2 和 python3 ,但是python又 ...

  7. MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...

  8. 详解SESSION与COOKIE的区别

    在PHP面试中 经常碰到请阐述session与cookie的区别与联系,以及如何修改两者的有效时间. 大家都知道,session是存储在服务器端的,cookie是存储在客户端的,session依赖于c ...

  9. ReentrantLock详解 以及与synchronized的区别

    ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁 ReentrantLock lock = new ReentrantLock(tr ...

  10. oracle 子查询详解 in和exists的区别

    sql允许多层嵌套,子查询是嵌套在其他查询中的查询.我们可以把子查询当做一张表来看到,即外层语句可以把内嵌的查询结果当做一张表使用. 子查询查询结果有三种情况 不返回查询记录.若子查询不返回记录则主查 ...

随机推荐

  1. Mysql综合实验2-LAMP+MHA+MYcat分库

    实验目标: 1.搭建主从半同步+GTID复制 2.搭建MHA主服务器高可用 3.Mycat实现分库:wordpress库和shopxo库 4.客户通过域名可以访问到wordpress和shopxo 实 ...

  2. python基础类型,字符串

    python基本类型小结 # str,可以用索引取值,但是不能通过索引改变值, # a = "123" a[0]=10,直接TypeError因为字符串是不可变类型 # list, ...

  3. Oracle部署,关于日志文件系统选择(硬盘格式化、挂载)

    之前部署过好多Oracle服务,采用的日志文件系统一直是ext3.但是我观察到很多人在格式化/挂载数据盘时,采用的日志文件系统类型有ext3.ext4.xfs等,这不禁让我发出疑问,哪个类型的数据处理 ...

  4. 配置MSTP功能示例

    组网需求 在一个复杂的网络中,网络规划者由于冗余备份的需要,一般都倾向于在设备之间部署多条物理链路,其中一条作主用链路,其他链路作备份.这样就难免会形成环形网络,若网络中存在环路,可能会引起广播风暴和 ...

  5. C#winform使用NOPI读取Excel读取图片

    需求:在Winform使用NOPI做导入时候,需要导入数据的同时导入图片. 虽然代码方面不适用(我好像也没仔细看过代码),但是感谢大佬给了灵感http://www.wjhsh.net/IT-Ramon ...

  6. Java锁的逻辑(结合对象头和ObjectMonitor)

    我们都知道在Java编程中多线程的同步使用synchronized关键字来标识,那么这个关键字在JVM底层到底是如何实现的呢. 我们先来思考一下如果我们自己实现的一个锁该怎么做呢: 首先肯定要有个标记 ...

  7. day25-Listener监听器

    Listener监听器 1.Listener监听器介绍 Listener监听器是JavaWeb三大组件之一.JavaWeb三大组件分别是:Servlet程序,Listener监听器,Filter过滤器 ...

  8. js- day03- 将数据变成柱形图

    柱形图的渲染 * {             margin: 0;             padding: 0;         }  .box {             display: fle ...

  9. 干电池升压3.3V芯片

    PW5100适用于一节干电池升压到3.3V,两节干电池升压3.3V的升压电路,PW5100干电池升压IC. 干电池1.5V和两节干电池3V升压到3.3V的测试数据 两节干电池输出500MA测试: PW ...

  10. Dart开发服务端,我是不是发烧(骚)了?

    前言 最近一段时间,我和我的团队开发了两个 APP. 客户端方面采用了 Flutter,方便跨平台. 服务端方面剑走偏锋,没有采用 php, pythod, java之类的,而是采用了与 Flutte ...