文章背景

在我之前的博客 start-mobile-front-end 有提到日常使用的项目开发简单的模板,后面整合了 可伸缩布局方案-lib-flexible 对模板进行了简单的修改,放在 html5-boilerplate 维护。

这里是把这套模板和 gulp 进行整合。

gulp 介绍

打开 gulp中文网 的源码,我们可以 title 是这样写的:

gulp.js - 基于流的自动化构建工具。 | gulp.js 中文网

而它的 description 写着:

Gulp.js 是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务。Gulp.js 是基于 Node.js 构建的,利用 Node.js 流的威力,你可以快速构建项目并减少频繁的 IO 操作。Gulp.js 源文件和你用来定义任务的 Gulp 文件都是通过 JavaScript(或者 CoffeeScript )源码来实现的。

这里不进行太多关于 gulp 的讨论,可以看一些别人的讨论和简介: 前端框架可以直接使用,为何需要nodejs/gulp等工具? , 使用Gulp构建网站小白教程 , gulp-book 看看官网以及网上一些其他教程。

正文

gulp的配置文件是 gulpfile.js ,我们手动添加这个文件,之后进行命令

npm init

初始化我们的项目,之后敲入

npm install --save-dev gulp

把gulp当做我们的开发依赖项。

在这套模板里面我们还用到的开发依赖项有以下几个:

模块 作用
jshint 检测js代码是否规范
uglify 压缩js文件
Less CSS预处理语言的
gulp-autoprefixer CSS浏览器兼容前缀自动补充
gulp-clean-css 压缩CSS文件
concat 文件的合并
rename 文件的重命名
browser-sync 构建本地服务器并带有刷新功能
run-sequence 任务能够按照顺序执行
del 删除文件

在我们的 gulpfile.js 开头都引入了:

var gulp = require('gulp'),

    jshint = require('gulp-jshint'),
    uglify = require('gulp-uglify'),

    concat = require('gulp-concat'),
    rename = require('gulp-rename'),

    autoprefix = require('gulp-autoprefixer'),
    less = require('gulp-less'),
    cleanCSS = require('gulp-clean-css'),

    browserSync = require('browser-sync'),

    runSequence = require('run-sequence'),

    del = require('del');

如图是我们的项目结构:

下面开始构建我们的 gulpfile.js 工程。

js代码规范验证

gulp.task('jshint', function() {
    gulp.src('./js/*.js')
        .pipe(jshint())
        .pipe(jshint.reporter('default'));
});  

当我们在控制台键入

gulp jshint

就会执行 jshint 这个任务,它主要进行的任务是检查所有 js 目录下的 js 文件代码书写是否规范

合并压缩js文件

gulp.task('scripts', function(callback) {
    // 这里可以引入其他js库
    gulp.src(['./js/common.js'])
        .pipe(concat('all.js'))
        .pipe(gulp.dest('./dist/js/'))
        .pipe(rename('all.min.js'))
        .pipe(uglify())
        .pipe(gulp.dest('./dist/js/'))
        .pipe(browserSync.reload({
            stream: true
        }));

    callback();
});

我们可以在

gulp.src(['./js/common.js'])

里面的数组按顺序填入我们想要进行合并压缩的js文件,然后把我们所有键入的js文件合并 concat 成 all.js 放入 dist/js 目录下,之后我们把它改名字 rename 为 all.min.js 并进行 uglify 压缩把它也放入 dist/js 目录下。最后通知浏览器进行刷新 browserSync.reload(后面会提到)

less 编译合并压缩

gulp.task('less', function(callback) {
    // 其余的样式文件都由style.less引入
    gulp.src(['./css/style.less'])
        .pipe(less())
        .pipe(autoprefix({
            browsers: ['last 2 versions'],
        }))
        .pipe(rename('all.css'))
        .pipe(gulp.dest('./dist/css/'))
        .pipe(rename('all.min.css'))
        .pipe(cleanCSS())
        .pipe(gulp.dest('./dist/css/'))
        .pipe(browserSync.reload({
            stream: true
        }));

    callback();
});

这个地方一般只会配置 css/style.less 文件,其他的css或者less文件都由它引入:

@import (inline) './normalize.css';

然后我们还进行了 autoprefix 的自动补全操作,cleanCSS 的压缩操作以及高速浏览器进行刷新 browserSync.reload (后面会提到)

浏览器自动刷新

gulp.task('browserSync', function() {
    browserSync({
        server: {
            baseDir: './'
        }
    })
});

这里就是配置浏览器自动刷新的任务,我们会监控一些文件的变化,然后进行 browserSync.reload 的操作

监控文件变化

gulp.task('watch', function() {
    gulp.watch('./js/*.js', function() {
        runSequence('jshint', 'scripts');
    });

    gulp.watch('./css/*.less', ['less']);

    gulp.watch('./*.html', browserSync.reload);
});

runSequence 让我们的任务可以按顺序执行。在检测到 js 文件夹下的文件变化的时候,会按顺序执行 jshintscript 操作,检测到 css 下的文件变化的时候会执行 less 操作(一般只有 style.less)。监控到根目录下的 html 文件变化的时候执行 browserSync.reload 操作

脚本控制

gulp.task('clean', function(callback) {
    del(['dist/css/', 'dist/js/']);
    callback();
});

gulp.task('build', ['clean'], function(callback) {
    runSequence(['less', 'scripts']);
});

gulp.task('default', function(callback) {
    runSequence('jshint', ['less', 'scripts', 'browserSync', 'watch'], callback);
});

我们在 package.json 中写入了:

"scripts": {
    "build": "gulp build",
    "clean": "gulp clean",
    "dev": "gulp"
},

配置了我们的脚本。

执行 build 的时候,主要生成我们合并压缩以后的 js 和 css 文件。 执行 clean 的时候,主要是想删除过往的版本先,再生成此次的最新代码文件(因为后期会考虑加入版本号) 执行 dev 的时候,代码着开发中,执行一系列的操作,然后在浏览器中键入

localhost:8080

有个本地服务器,修改文件的时候会自动刷新