构建工具-Gulp 相关知识
layout: layout
title: 『构建工具-Gulp』相关内容整理
date: 2017-04-26 22:15:46
tags: Gulp
categories: Tools
Gulp- 简介
Automate and enhance your workflow | 用自动化构建工具增强你的工作流程
Gulp 是什么?
gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成;
使用它,不仅可以很愉快的编写代码,而且大大提高我们的工作效率。
gulp是基于Nodejs的自动任务运行器,它能自动化地完成 javascript、coffee、sass、less、html/image、css 等文件的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定的这些步骤。在实现上,她借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入,使得在操作上非常简单。通过本文,我们将学习如何使用Gulp来改变开发流程,从而使开发更加快速高效。
gulp 和 grunt 非常类似,但相比于 grunt 的频繁 IO 操作,gulp 的流操作,能更快地更便捷地完成构建工作。
Gulp的核心概念?
流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而不用关心流的另一头数据的真正流向。流不但可以处理文件,还可以处理动态内存、网络数据等多种数据形式。
而gulp正是通过流和代码优于配置的策略来尽量简化任务编写的工作。这看起来有点“像jQuery”的方法,把动作串起来创建构建任务。早在Unix的初期,流就已经存在了。流在Node.js生态系统中也扮演了重要的角色,类似于*nix将几乎所有设备抽象为文件一样,Node将几乎所有IO操作都抽象成了stream的操作。因此用gulp编写任务也可看作是用Node.js编写任务。当使用流时,gulp去除了中间文件,只将最后的输出写入磁盘,整个过程因此变得更快。
Gulp的特点?
- 易于使用:
通过代码优于配置的策略,gulp 让简单的任务简单,复杂的任务可管理。 - 构建快速:
利用 Node.js 流的威力,你可以快速构建项目并减少频繁的 IO 操作。 - 易于学习:
通过最少的 API,掌握 gulp 毫不费力,构建工作尽在掌握:如同一系列流管道。 - 插件高质:
gulp 严格的插件指南确保插件如你期望的那样简洁高质得工作。
Gulp- 环境搭建
gulp
是基于 node
实现的,那么我们就需要先安装 node
。
Node是一个基于
Google V8 JavaScript
引擎建立的一个平台,可以利用它实现Web服务,做类似PHP的事。
npm install -g gulp # 全局安装gulp
gulp -v # 查看gulp是否安装成功
➜ ~ gulp -v
[20:17:32] CLI version 3.9.1
Gulp- 构建项目
使用Gulp来构建项目:
mkdir Gulp && cd Gulp && npm init -y && npm install gulp --save-dev
#使用npm初始化项目并且安装Gulp模块,能够看到如下的package.json文件中已经包含了Gulp的相关信息。
{
"name": "Gulp",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"gulp": "^3.9.1"
}
}
gulpfile.js文件的使用:
gulp也需要一个文件作为它的主文件,在gulp中这个文件叫做gulpfile.js。
创建gulpfile.js文件,与package.json文件一样放在项目根目录中,之后需要做的就是在gulpfile.js文件中定义任务了。
在gulpfile.js文件中写入以下内容:
var gulp = require('gulp');
gulp.task('default', function() {
console.log("Gulp OK!");
});
完成之后在Terminal
中运行gulp
命令,然后会看到刚才在task任务中要输出的内容.
➜ gulp
[00:35:29] Using gulpfile ~/WebStrom-Work/Gulp/gulpfile.js
[00:35:29] Starting 'default'...
Gulp OK!
[00:35:29] Finished 'default' after 141 μs
Gulp- API
gulp.src()
语法:
gulp.src(globs[, options])
输出(Emits)符合所提供的匹配模式(glob)或者匹配模式的数组(array of globs)的文件。 将返回一个 Vinyl files 的 stream 它可以被 piped 到别的插件中。
名称 | 类型 | 含义 |
---|---|---|
globs | String 或 Array | 所要读取的 glob 或者包含 globs 的数组。 |
options | Object | 通过 glob-stream 所传递给 node-glob 的参数。 |
gulp.dest()
语法:
gulp.dest(path[, options])
能被 pipe 进来,并且将会写文件。并且重新输出(emits)所有数据,因此你可以将它 pipe 到多个文件夹。如果某文件夹不存在,将会自动创建它。
path 类型: String or Function ,文件将被写入的路径(输出目录)。也可以传入一个函数,在函数中返回相应路径,这个函数也可以由 vinyl 文件实例 来提供。
options
类型: Object , 为一个可选的参数对象,通常我们不需要用到
gulp.task()
语法:
gulp.task(name[, deps], fn)
name
类型: String,任务的名字,如果你需要在命令行中运行你的某些任务,那么,请不要在名字中使用空格。deps
类型: Array,一个包含任务列表的数组,这些任务会在你当前任务运行之前完成。
gulp.task('mytask', ['array', 'of', 'task', 'names'], function() {
// 做一些事
});
注意: 你的任务是否在这些前置依赖的任务完成之前运行了?请一定要确保你所依赖的任务列表中的任务都使用了正确的异步执行方式:使用一个 callback,或者返回一个 promise 或 stream。
fn
该函数定义任务所要执行的一些操作。通常来说,它会是这种形式:gulp.src().pipe(someplugin())。
gulp.watch()
语法:
gulp.watch(glob[, opts], tasks)
gulp.watch()用来监视文件的变化,当文件发生变化后,我们可以利用它来执行相应的任务。
glob
类型: String or Array ,一个 glob 字符串,或者一个包含多个 glob 字符串的数组,用来指定具体监控哪些文件的变动。opts
类型: Object
传给 gaze 的参数。
cb(event)
类型: Function ,每次变动需要执行的 callback。
参考:Gulp-API
Gulp- 常用插件
压缩JS -> gulp-uglify:
安装 gulp-uglify:
npm install gulp-uglify --save-dev
示例代码:
var gulp = require('gulp');
var uglify = require('gulp-uglify');
gulp.task('javascript',function () { // javascript: 任务名称
gulp.src('./src/js/*.js') // src: 定位到需要压缩的js文件目录下
.pipe(uglify()) // 执行压缩文件
.pipe(gulp.dest('./dist/js')); // 输出到指定目录
});
API参考:gulp-uglify
压缩CSS -> gulp-minify-css:
安装 gulp-minify-css
:
npm install gulp-minify-css --save-dev
示例代码:
var gulp = require('gulp');
var minify = require('gulp-minify-css')
gulp.task('css',function () {
gulp.src('./src/css/*.css')
.pipe(minify())
.pipe(gulp.dest('./dist/css'));
});
API参考:gulp-minify-css
压缩图片 -> gulp-imagemin:
安装 gulp-imagemin
:
npm install gulp-imagemin --save-dev
示例代码:
var gulp = require('gulp');
var image = require('gulp-imagemin');
gulp.task('image',function () {
gulp.src('./src/images/*.*')
.pipe(imagemin())
.pipe(gulp.dest('./dist/images'));
});
API参考:gulp-imagemin
编译Less-> gulp-less:
安装 gulp-less
:
npm install gulp-less --save-dev
示例代码:
var gulp = require('gulp');
var less = require('gulp-less');
gulp.task('less',function () {
gulp.src('./src/less/*.*')
.pipe(less())
.pipe(gulp.dest('./dist/less'));
});
API参考:gulp-less
自动刷新-> gulp-livereload:
安装gulp-livereload
:
npm install gulp-livereload --save-dev
示例代码:
在每个gulp.task()方法中的gulp.src()方法后追加 .pipe(livereload()); 即可。
需要配合谷歌浏览器插件 LiveReload
插件来使用,实现自动刷新。
API参考:gulp-livereload
Google Chrome Plugin:LiveReload
完整gulpfile.js
文件:
var gulp = require('gulp'); // Gulp
var uglify = require('gulp-uglify'); // JavaScript
var minify = require('gulp-minify-css'); // CSS
var imagemin = require('gulp-imagemin'); // Images
var less = require('gulp-less'); // Less
var livereload = require('gulp-livereload') // LiveReload
// 执行所有任务
gulp.task('default', ['javascript','css','less','image']);
gulp.task('javascript',function () { // jsscript: 任务名称
gulp.src('./src/js/*.js') // src: 定位到需要压缩的js文件目录下
.pipe(uglify()) // 执行压缩文件
.pipe(gulp.dest('./dist/js')); // 输出到指定目录
});
gulp.task('css',function () {
gulp.src('./src/css/*.css')
.pipe(minify())
.pipe(gulp.dest('./dist/css'));
});
gulp.task('less',function () {
gulp.src('./src/less/*.*')
.pipe(less())
.pipe(gulp.dest('./dist/css'));
});
gulp.task('image',function () {
gulp.src('./src/images/*.*')
.pipe(imagemin())
.pipe(gulp.dest('./dist/images'));
});
Gulp- 参考资料
常见web项目目录:
在当前项目的根目录下执行tree
命令,即可看到项目的整个目录结构,如果没有tree
命令,在Mac系统下可以使用brew
进行安装:
➜ Glup tree ../Glup
../Glup
├── build # 项目构建脚本
├── src # 源码目录
│ ├── css # CSS文件
│ ├── fonts # 字体文件
│ ├── images # 图片文件
│ ├── js # js脚本文件
│ ├── less # less文件
│ └── sass # sass文件
├── dist # 编译出来的发布版本目录
│ ├── css
│ ├── fonts
│ ├── images
│ └── js
├── docs # 文档
├── test # 测试脚本
├── gulpfile.js # Gulp工具构建项目的主文件
├── node_modules # npm包存放目录
├── package-lock.json #npm5.0以上项目依赖文件
├── package.json # npm包管理配置文件
├── LICENSE # 授权协议
└── README.md # 项目说明文件
构建工具-Gulp 相关知识的更多相关文章
- 前端构建工具gulp使用
前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gulp中文文档 https://g ...
- 前端构建工具gulp
前端构建工具gulp使用 前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gul ...
- 前端构建工具gulp使用 (转)
http://www.cnblogs.com/starof/p/5194622.html 前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 ...
- (转载)前端构建工具gulp使用
前端构建工具gulp使用 前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gulp中 ...
- 怎么在项目中使用前端包管理器bower和构建工具gulp
下面以WeUI(微信官方网页开发样式库)介绍一下,怎么把WeUi引入到自己的项目中,我的开发环境Visual Studio 2012,当然了Visual Studio 2015对此已有了更好的支持(h ...
- 前端自动化构建工具gulp的使用总结
前端自动化构建工具gulp的使用总结 博主最近偶的空闲,在此对gulp的使用做一个总结,让小伙伴知道如何合理的使用gulp以及gulp的使用技巧. 谈到gulp,有人可能就会想到另外一个构建工具gru ...
- (转)前端构建工具gulp入门教程
前端构建工具gulp入门教程 老婆婆 1.8k 2013年12月30日 发布 推荐 10 推荐 收藏 83 收藏,20k 浏览 本文假设你之前没有用过任何任务脚本(task runner)和命令行工具 ...
- 前端构建工具 Gulp.js 上手实例
在软件开发中使用自动化构建工具的好处是显而易见的.通过工具自动化运行大量单调乏味.重复性的任务,比如图像压缩.文件合并.代码压缩.单元测试等等,可以为开发者节约大量的时间,使我们能够专注于真正重要的. ...
- 前端打包构建工具gulp快速入门
因为之前一直有人给我推荐gulp,说他这里好哪里好的.实际上对我来说够用就行.grunt熟悉以后实际上他的配置也不难,说到效率的话确实是个问题,尤其项目大了以后,目前位置遇到的项目都还可以忍受.不过不 ...
随机推荐
- ICEM-hollow
原视频下载地址: http://yunpan.cn/cumt7U7ufYfA3 访问密码 a46d
- fluent-动网格-动态层
模型算例来源:http://blog.sina.com.cn/s/blog_599d8faa0100w4uj.html 原视频下载地址:http://yunpan.cn/cujM2FxLuGdLK ...
- mitmproxy进行拦截
import requests from selenium import webdriver from lxml import etree import time class DiffSpider: ...
- vue element-UI 多个 select 回显成功,但是选中无反应
参考文章 vue开发(四)element的select下拉框设定初值后,不能重新选择的问题 参考文章 element模态框dialog中的select组件中选中无反应 原因 下拉框数据是循环别的接口得 ...
- Tomcat 管理监控工具
本文链接:https://blog.csdn.net/weixin_34364071/article/details/86753232 专注于Java领域优质技术号,欢迎关注 原创: 侯树成 Tomc ...
- 判断一个数组的长度用 Length 还是 SizeOf ?
最近发现一些代码, 甚至有一些专家代码, 在遍历数组时所用的数组长度竟然是 SizeOf(arr); 这不合适! 如果是一维数组.且元素大小是一个字节, 这样用看不出错误, 譬如: var arr ...
- Linux 限制IP——/etc/hosts.allow和/etc/hosts.deny文件【转】
就像是 限制特定IP来访 想法 看起来通常的做法是利用hosts的拒绝设置,而它的设置是针对某一个具体的进程,具体的服务,在这里就是sshd了 看起来设置一个网段使用的是 x.x.x.0/24 后面加 ...
- JDBC DataSource
What is DataSource? 作为 DriverManager 设施的替代项,DataSource 对象是获取连接的首选方法.实现DataSource 接口的对象通常在基于 Java(TM) ...
- SpringBoot启动嵌入式tomcat源码解读
一.SpringBoot自动拉起Tomcat SpringBoot框架是当前比较流行的java后端开发框架,与maven结合大大简化了开发人员项目搭建的步骤,我们知道SpringBoot的启动类启动后 ...
- 全面系统Python3入门+进阶-1-8 Python的前景
语言的热度. python在开发效率上有优势 大数据.人工智能 结束