详解前端任务构建利器Gulp.js使用指南


Posted in Javascript onApril 30, 2021

概述

在软件开发中,任务运行器的好处是不言而喻的。它们可以帮助自动运行常见的冗长的任务,让你可以专注于更重要的事情中,比如敲出很棒的代码。说的严肃点,自动运行一些比如图片压缩、代码压缩、单元测试以及更多的任务的技能,简直就是节省时间的利器。

对于很多前端开发者而言,时下使用最多的任务管理器就是Grunt了,一个可以让你在Gruntfile.js文件中使用JavaScript定义各种运行任务的工具。基本上,只要你了解JavaScript,创建一个Grunt任务是非常简单直接的事情。丰富的第三方插件比如jsHint,Sass还有Uglify等等,让Grunt成为最易扩展的工具之一。

对于多数人来讲,一直以来都选择Grunt作为任务运行器。不过最近,因为易于安装,拥有更加易读和管理的超级简单的配置文件,一个叫Gulp.js的工具吸引了大批人的眼球。

安装Gulp.js

Gulp.js跟Grunt一样,都是基于Node的任务运行工具。所以你必须安装Node来运行它。有几种不同的方法可以安装Gulp,取决于你的操作系统。在OS X中,我用nvm,这是TimCaswell写的用于管理多个Node.js版本的很不错的脚本工具。你也可以直接从Node.js官方网站下载二进制文件。如果你对Node还一无所知的话,那我建议你最好去Nettuts+series先熟悉一下Node.js。

我们可以用npm(Node包管理器)来快速安装Gulp。打开你的终端然后输入:

npm install -g gulp

这条指令,从npm的注册机制中获取gulp并全局安装到你的系统中,以便你可以直接在命令行中访问它。

安装好了gulp,下面我们开始在项目中来使用它。

使用Gulp.js创建你的项目

要在项目中使用Gulp,必须完成下面关键几点:

  • 安装两个依赖包
  • 安装任何你想使用的插件
  • 创建Gulp.js文件然后定义你打算运行的任务

请在项目的路径下完成以上几点,这样Gulp才能使用你的配置文件。

首先,安装依赖包:

npm install --save-dev gulp gulp-util

现在我们需要安装在配置文件中定义好的用来运行指定任务的Gulp插件。这些插件都是Node包,所以我们再次使用npm来安装它们。

npm install --save-dev gulp-uglify gulp-concat

我这里安装两个插件,让我可以使用Uglify.js压缩器来精简/压缩JavaScript代码并且将多个JS文件合并到一个文件中去。

注意,我这里用的—save-dev,这个指令让我只在当前项目中安装Gulp依赖包跟插件。这么做可以在package.json中的devDependencies列表中为每个依赖项生成对应的词条标识。就像下面展示的:

{
  "devDependencies": {
    "gulp-util": "~2.2.13",
    "gulp": "~3.5.0",
    "gulp-uglify": "~0.2.0",
    "gulp-concat": "~2.1.7"
  }
}

这样可以确保使用npm为项目安装任何依赖包和插件。如果在项目中没有package.json文件,那在命令行输入npm init或者干脆在编辑器中手动创建一个,写好对应的卷括号,然后保存命名为”package.json”。在命令行中输入npm指令来更新它。请注意,必须要使用卷括号,不然,当你试图使用—save-dev时,npm会抛出一个错误显示它不是一个合法的JSON文件。

虽然在本篇指南中我只用了两个插件,不过Gulp提供了超过200个插件来满足不同的功能需求,包括:

  • LiveReload(gulp-livereload)
  • JSHint(gulp-jshint)
  • Sass(gulp-sass)
  • CoffeeScript file compilation(gulp-coffee)

还有好多好多···

Gulpfile.js文件

跟Grunt一样,Gulp有一个叫做gulpfile.js的同名配置文件,里面定义了运行任务的所有的必须的插件。你要在项目的根目录下创建这个文件。

简单直白的语法,让gulp文件非常易读能懂:

var gulp    = require('gulp'),
gutil    = require('gulp-util'),
uglify  = require('gulp-uglify'),
concat  = require('gulp-concat');

上面代码简单告诉gulp需要引用哪些插件来完成既定的任务。

下一步,我们需要定义Gulp运行的任务。我这里,定义两个:

  • 压缩图片
  • 精简JS文件

我们使用Gulp的方法task()来定义要运行的任务:

gulp.task('js', function () {
    gulp.src('./js/*.js')
        .pipe(uglify())
        .pipe(concat('all.js'))
        .pipe(gulp.dest('./js'));
});

看看上面的代码,用的是引用的插件组成的一个混合方法调用。第一个方法task(),使用一个名称代表当前任务(这里就叫'js'),还有一个匿名方法囊括了实际的操作。我们来拆解一下代码:

gulp.src('./js/*.js')

src()方法指定了要从哪里找到需要压缩的JS文件,并且将其转换成包含文档结构的数据流以传入后续运行的插件中。这是Node.jsStreams API中的一部分,也正是Gulp拥有简明API语法的原因之一。

.pipe(uglify())

pipe()方法从src()方法中获得传过来的数据流,然后传入指定的插件中。在当前例子中,插件uglify将接收数据流。

.pipe(concat('all.js'))

像uglify一样,插件concat通过pipe()接收传过来的数据流,然后将多个JS文件合并到'all.js'中。

.pipe(gulp.dest('./js'));

最后,使用Gulp的dest()方法,将all.js写到指定目录中,整个过程简介易读。

还有最后一个我们要做的事情,就是更改Gulp的默认运行任务为”js”。

gulp.task('default', function(){
    gulp.run('js'); 
});

返回到命令行,输入'gulp',Gulp找到了gulpfile.js文件,加载所有的依赖项跟插件,运行默认任务'js'。你可以在最后的运行结果,文件被压缩合并了

让我们更近一步吧。Gulp提供了另外一个方法叫watch(),它可以监视指定的资源变更。跟手动输入'gulp'运行任务不同,这个方法允许根据资源的改变自动运行任务。

gulp.watch('./js/*', function () {
     gulp.run('js');
});

当上面的代码运行的时候,Gulp会继续保持对指定资源的监视,一旦资源发生变更,就会再次运行'js'方法。这个功能很棒!

向Gulp.js过渡

当我刚听说Gulp的时候,我第一反应就是“又一个超棒的工具!”。Gulp.js确实拥有着吸引人的语法跟API,它让构建任务变得轻而易举。尽管插件没有Grunt丰富,但是它的插件库看起来已经在日趋增长,特别是现在拥有着对它感兴趣的这么多的开发者。

以上就是详解前端任务构建利器Gulp.js使用指南的详细内容,更多关于Gulp.js使用指南的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
一段利用WSH修改和查看IP配置的代码
May 11 Javascript
基于jquery的图片轮播 tab切换组件
Jul 19 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
Oct 15 Javascript
JavaScript 基本概念
Jan 20 Javascript
javascript实现图像循环明暗变化的方法
Feb 25 Javascript
基于node实现websocket协议
Apr 25 Javascript
JS异步加载的三种实现方式
Mar 16 Javascript
JS交互点击WKWebView中的图片实现预览效果
Jan 05 Javascript
Vue利用canvas实现移动端手写板的方法
May 03 Javascript
jQuery 导航自动跟随滚动的实现代码
May 30 jQuery
工作中常用到的ES6语法
Sep 04 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
Apr 23 Javascript
浅谈node.js中间件有哪些类型
Apr 29 #Javascript
JavaScript实现简单图片切换
何时使用Map来代替普通的JS对象
详解Js模块化的作用原理和方案
详解JavaScript中的执行上下文及调用堆栈
JavaScript实现淘宝商品图切换效果
JavaScript实现显示和隐藏图片
Apr 29 #Javascript
You might like
PHP+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
php递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
js字符串完全替换函数分享
2014/12/03 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
JS实现动态生成表格并提交表格数据向后端
2020/11/25 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
angularjs下ng-repeat点击元素改变样式的实现方法
2018/09/12 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
如何使用Python实现自动化水军评论
2019/06/26 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
Python使用lambda抛出异常实现方法解析
2020/08/20 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
eBay德国站:eBay.de
2017/09/14 全球购物
业务部门经理岗位职责
2014/02/23 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技