前端构建工具gulp入门教程
一.安装Node
直接去nodejs官网,点击绿色的 下载按钮,他会根据系统信息选择对应版本(.msi)文件,然后和安装qq一样,为了查看node 是否正确安装,node -v 查看版本号 以及npm -v 版本号
二.npm 介绍
npm(node package manager) nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等)
命令提示符执行:
npm install <name> [-g] [--save-dev]
:node插件名称。例:npm install gulp-less –save-dev -g :全局安装。将会安装在C:\Users\Administrator\AppData\Roaming\npm,并且写入系统环境变量;
非全局安装:将会安装在当前定位目录;
全局安装可以通过命令行在任何地方调用它,本地安装将安装在定位目录的node_modules文件夹下,通过require()调用;–save :将保存配置信息至package.json(package.json是nodejs项目配置文件);
-dev :保存至package.json的devDependencies节点,不指定-dev将保存至dependencies节点
配置文件package.json是为了方便下载相关的包,只需要在有这个文件的文件夹下面执行“npm install”(如果安装了cnpm就用“cnpm install”),则会根据package.json下载所有需要的包。【注:我用demo中的package文件在另外一台电脑上面直接安装,打“gulp watch”的时候出现了很多错误】
三.选装cnpm
3.1、说明:因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事。来自官网:“这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。”;
3.2、官方网址:http://npm.taobao.org;
3.3、安装:命令提示符执行npm install cnpm -g –registry=https://registry.npm.taobao.org; 注意:安装完后最好查看其版本号cnpm -v或关闭命令提示符重新打开,安装完直接使用有可能会出现错误;
注:cnpm跟npm用法完全一致,只是在执行命令时将npm改为cnpm(以下操作将以cnpm代替npm)。
四.全局安装gulp
cnpm install gulp -g
如果在某个工程文件夹中提示错误,就手动在安装gulp
查看是否正确安装,gulp -v 有版本号就right
五.新建package.json文件
在命令窗口输入指令“cnpm init”。如果在Git Bash打这个指令,会报“No gulpfile found”的错误。
5.1、说明:package.json是基于nodejs项目必不可少的配置文件,它是存放在项目根目录的普通json文件;
5.2、它是这样一个json文件(注意:json文件内是不能写注释的,复制下列内容请删除注释):
{
"name": "test", //项目名称(必须)
"version": "1.0.0", //项目版本(必须)
"description": "This is for study gulp project !", //项目描述(必须)
"homepage": "", //项目主页
"repository": { //项目资源库
"type": "git",
"url": "https://git.oschina.net/xxxx"
},
"author": { //项目作者信息
"name": "surging",
"email": "surging2@qq.com"
},
"license": "ISC", //项目许可协议
"devDependencies": { //项目依赖的插件
"gulp": "^3.8.11",
"gulp-less": "^3.0.0"
}
}
六.新建gulpfile.js文件
gulpfile.js是gulp项目的配置文件,里面是task的配置。简易代码如下:
var gulp = require('gulp');
gulp.task('default', function() {
// 将你的默认的任务代码放在这
});
七.本地安装gulp
cnpm install gulp --save-dev
到这你也许会问 为什么全局安装 项目还需要安装,因为全局安装gulp为了执行gulp任务,而本地安装gulp是为了调用gulp插件功能.
8.插件与功能
eg:1
现在我们创建一个Gulp任务来压缩JavaScript文件。首先创建一个名为gulpfile.js的文件,这是定义Gulp任务的地方,它可以通过gulp命令来运行,接着把下面的代码放到gulpfile.js文件里面。
var gulp = require('gulp'),
uglify = require('gulp-uglify');
gulp.task('minify', function () {
gulp.src('js/app.js')
.pipe(uglify())
.pipe(gulp.dest('build'))
});
然后在npm里面运行npm install -–save-dev gulp-uglify来安装gulp-uglify,最后通过运行gulp minify来执行任务。假设js目录下有个app.js文件,那么一个新的app.js将被创建在编译目录下,它包含了js/app.js的压缩内容。想一想,到底发生了什么?
我们只在gulpfile.js里做了一点事情。首先,我们加载gulp和gulp-uglify模块:
var gulp = require('gulp'),
uglify = require('gulp-uglify');
然后,我们定义了一个叫minify的任务,它执行时会调用函数,这个函数会作为第二个参数:
gulp.task('minify', function () {
});
最后,也是难点所在,我们需要定义任务应该做什么:
gulp.src('js/app.js')
.pipe(uglify())
.pipe(gulp.dest('build'))
1)全局配置config
可以将需要在gulpfile中引用的参数,放到这里,包括一些路径,功能的开关等。例如:
//全局配置文件
module.exports = {
name : '.....',
devPath : '.....', //项目根路径,根路径下可以包含多个项目
prodPath : '....', //生产路径根路径
sassPath : '.....', //SASS包含文件路径
rmHtmlWhitespace : false,//html中是否去除空格
server : {
port : 8088
}
};
注意下这里使用了module.exports,这是nodejs的语法。在gulpfile中将会用require引用config。
//加载项目配置
var config = require('./config');
2)监控gulp.watch
这个是gulp自带的,就是当你的文件改动了后,就做相应的task。还有一个插件 gulp-watch 。
监控sass中的文件变化,一有变化就做sass的编译。“*”与“”这种语法可以参考《 Gulp:任务自动管理工具 》
gulp.task('watch', function() {
livereload.listen();
gulp.watch('**.html', ['html']);
gulp.watch('./sass/*.scss', ['sass']);
gulp.watch('./css/*.css', ['css']);
gulp.watch('./js/*.js', ['js']);
});
监控了四个地方的修改,js、html、css和sass,并且有做了自动刷新 livereload 。这个是通过gulp- livereload来实现的。
firefox货chrome要分别安装插件才可运行。chrom插件如下:
安装完后会在浏览器中出现个小按钮,,注意是黑色的时候才是在执行中。还有就是要在相应的task中加相应的代码:
.pipe(livereload())
3)sass编译与css压缩
通过sass编写css,能更模块化,多人协作比较方便。安装 gulp-sass 。“ gulpPlumber() ”是引用了gulp-plumber,任务错误中断自动重传。
gulp.task('sass', function() {
gulp.src('./sass/*.scss')
.pipe(plumber())
.pipe(sass())
.pipe(gulp.dest('./css'))
.pipe(livereload());
});
gulp-cssnano ,压缩CSS代码。
gulp.task('css', ['sass'], function() {
//先删除dist中的css,有时候会不更新
gulp.src('./dist/css/*.css')
.pipe(rimraf({force: true}));
gulp.src('./css/*.css')
.pipe(cssnano())
.pipe(gulp.dest('./dist/css'))
.pipe(livereload());
});
4)js压缩与模块化合并
使用 gulp-uglify 做js的压缩。 gulpRimraf()用来删除文件夹,引用自 ]gulp-rimraf 。
模块化合并使用 webpack-stream 。
gulp.task('js', function() {
//先删除dist中的css,有时候会不更新
gulp.src('./dist/js/*.js')
.pipe(rimraf({force: true}));
gulp.src('./js/*.js')
.pipe(plumber())
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(uglify())
.pipe(gulp.dest('./dist/js'))
.pipe(livereload());
});
上面的jshint是用来分析代码的,例如分号没写。通过打指令“ gulp-jshint ” 。
5)image图片无损压缩
通过 gulp-image 压缩的图片,有时候能牙70%以上,非常给力。
gulp.task('image', function(){
gulp.src('./img/*.+(jpg|png|gif|svg)')
.pipe(imagemin())
.pipe(gulp.dest('./dist/img'));
});
6)html压缩
经过 gulp-htmlmin 压缩过的html可以缩小很多,可以看到都挤到了一起,有很多参数可以选择,比如去除空格等。
gulp.task('html', function() {
gulp.src('*.html')
.pipe(htmlmin({collapseWhitespace: true}))
.pipe(gulp.dest('./dist'))
.pipe(livereload());
});
7)fontmin字体压缩
网上有很多webfont,例如国外的 Font Awesome ,国内的 iconfont 。都能做出漂亮的自定义字体。
与西文字体不同,由于字符集过大,中文字体无法享受 webfont 带来的便利。为了让中文字体也乘上这道风,我们需要对其进行min。使用指令gulp-fontmin。
gulp.task('font', function() {
gulp.src('font/*.+(eot|svg|ttf|woff)')
.pipe(fontmin({
text: '人晒'
}))
.pipe(gulp.dest('dist/font'));
});
配置的两个字“人晒”与没配置的“国”,明显有区别。
8)启动一个本地调试服务器
通过 gulp-connect ,可以做个server。如果你用notpad++这种开发页面,那这个指令会很有用。
gulp.task('server', function(){
var option = {
root : config.devPath,
port : config.server.port
};
if(config.server.root){
option.root = config.server.root;
}
connect.server(option);
});
上面的localhost可以改成本机的IP地址,手机与电脑在同一个网段的话,就可以直接用手机调试了。
9.执行定义的一些任务
gulp minify
运行上文的列子 等等