完整的Gulp安装及文件配置

什么是Gulp?
    gulp.js是基于流的自动化构建工具。

前置知识需求:
node.js的一些基础用法
npm的基础用法,如init、install、run等
了解gulp.js的Api(内容很少,掌握五个Api就可以了)
安装gulp的步骤流程:
    1、新建项目文件夹(例如D盘下新建hbPage文件夹),启用cmd
    2、进入项目文件,全局安装Gulp
    

npm install -g gulp


    3、创建package.json文件,执行下面代码
    

npm init


    4、在目录文件下创建gulpfile.js文件


插件的安装与gulpfile.js文件的配置
下面的文件配置就比较多了,我们来一一进行说明。(所有的配置项都是写在gulpfile.js文件中的)

关于gulp文件配置,因为在打包部署到服务器上线时,为了减少文件大小我们要对文件进行压缩。所以这里涉及到三个压缩插件(js、css、html)
    1、js文件压缩(gulp-gulify)
    

npm install --save-dev gulp-uglify


    2、css文件压缩(gulp-clean-css)
     

npm install --save-dev gulp-clean-css


    3、html文件压缩(gulp-minify-html)
     

npm install --save-dev gulp-minify-html


在编辑页面样式时,我们会用到 less 或者 sass 编译。(我这里使用的是less编译,两个编译文件根据个人喜好只需要使用其中一个即可)

    4、less 和 sass 编译(gulp-minify-html)(二者选择安装其一即可)
   

npm install --save-dev gulp-less


另外还要用到图片压缩插件。

     5、图片压缩(gulp-imagemin)
   

 npm install --save-dev gulp-imagemin


在编写代码时为了实现网页自动刷新我们使用 gulp-connect 插件,当前的流行的是前后端分离,所以为了跟后台做对接,实现跨域代理,这里也要使用一个跟 gulp-connect 配套使用的插件 http-proxy-middleware 。

    6、网页自动刷新(gulp-connect)
   

npm install --save-dev gulp-connect


    7、跨域代理(http-proxy-middleware)
   

 npm install --save-dev http-proxy-middleware

到这里基本上一般项目安装这些插件就可以了,当然还有一些其他的插件我也会在下面整理到,如果你需要用到的话也可以自行安装。

    8、重命名(gulp-rename)
   

npm install --save-dev gulp-rename


    9、自动加载插件(gulp-load-plugins)
       (然后我们要使用gulp-rename和gulp-ruby-sass这两个插件的时候,就可以使用plugins.rename和plugins.rubySass来代替了,也就是                    原始插件名去掉gulp-前缀,之后再转换为驼峰命名。)
   

npm install --save-dev gulp-load-plugins


    10、文件合并(gulp-concat) 
   

 npm install --save-dev gulp-concat

接下来开始讲解gulpfile相关文件的配置
本来只需要在gulpfile.js文件中配置就行,但是实际过程中我们在开发环境中是不需要进行文件的打包。在生产环境中是不需要进行网页自动刷新和跨域代理配置的。所以我们把开发环境和生产环境的配置区分开来,分别写一个配置文件。

讲一下到目前为止项目的目录结构是这样的:

创建gulp的config文件
我们在build文件夹中可以创建一个 gulpfile.config.js 文件,主要用途为保存项目的目录配置,如源文件存放的路径,打包后文件存放的路径等,可以进行灵活配置。同时将Config对应暴露出来供其他文件引用。 

gulpfile.config.js

var SRC_DIR = './src/';     // 源文件目录
var DIST_DIR = './dist/';   // 文件处理后存放的目录,也是打包存放文件的目录
var DIST_FILES = DIST_DIR + '**'; // 目标路径下的所有文件

var Config = {
    src: SRC_DIR,
    dist: DIST_DIR,
    dist_files: DIST_FILES,
    html: {
        src: SRC_DIR + '**/*.html',
        dist: DIST_DIR
    },
    assets: {
        src: SRC_DIR + 'assets/**/*',     // assets目录:./src/assets
        dist: DIST_DIR                    // assets文件build后存放的目录:./dist/assets
    },
    css: {
        src: SRC_DIR + 'css/**/*.css',    // CSS目录:./src/css/
        src_min: SRC_DIR + 'css',          // CSS压缩文件目录:./src/css/
        dist: DIST_DIR + 'css'            // CSS文件build后存放的目录:./dist/css
    },
    less: {
        src: SRC_DIR + 'less/**/*.less',  // less目录:./src/less/
        dist: DIST_DIR + 'css'            // less文件生成CSS后存放的目录:./dist/css
    },
    js: {
        src: SRC_DIR + 'js/**/*.js',      // JS目录:./src/js/
        src_min: SRC_DIR + 'js',      // JS目录:./src/js/
        dist: DIST_DIR + 'js',            // JS文件build后存放的目录:./dist/js
        build_name: 'build.js'            // 合并后的js的文件名
    },
    img: {
        src: SRC_DIR + 'images/**/*',     // images目录:./src/images/
        dist: DIST_DIR + 'images'         // images文件build后存放的目录:./dist/images
    }
};
module.exports = Config;


创建gulp的dev文件
在build文件夹下创建gulpfile.dev.js文件,该文件放置的时开发环境下调用的任务,同时使用gulp-connect实现编写程序的时候浏览器自动刷新的功能。

gulpfile.dev.js

var gulp = require('gulp');
    autoprefixer = require('gulp-autoprefixer'); // 处理css中浏览器兼容的前缀
    less = require('gulp-less');                 //less编译
    rename = require('gulp-rename');             //重命名
    concat = require('gulp-concat');             //合并文件
    imagemin = require('gulp-imagemin');         //图片压缩

    connect = require('gulp-connect');           //浏览器自动刷新
    reload = connect.reload;                     //浏览器自动刷新
    proxy = require('http-proxy-middleware');    //跨域代理

var Config = require('./gulpfile.config.js');
//======= gulp dev 开发环境下 ===============
function dev() {
    /**
     * HTML处理
     */
    gulp.task('html:dev', function () {
        return gulp.src(Config.html.src).pipe(gulp.dest(Config.html.dist)).pipe(reload());
    });
    /**
     * assets文件夹下的所有文件处理
     */
    gulp.task('assets:dev', function () {
        return gulp.src(Config.assets.src).pipe(gulp.dest(Config.assets.dist)).pipe(reload());
    });
    /**
     * CSS样式处理
     */
    gulp.task('css:dev', function () {
        return gulp.src(Config.css.src).pipe(gulp.dest(Config.css.dist)).pipe(reload());
    });
    /**
     * less样式处理
     */
    gulp.task('less:dev', function () {
        return gulp.src(Config.less.src).pipe(less()).pipe(rename({
            suffix: '.min'
        })).pipe(gulp.dest(Config.css.src_min)).pipe(reload());
    });
    /**
     * js处理
     */
    gulp.task('js:dev', function () {
        return gulp.src(Config.js.src).pipe(gulp.dest(Config.js.dist)).pipe(reload());
    });
    /**
     * 图片处理
     */
    gulp.task('images:dev', function () {
        return gulp.src(Config.img.src).pipe(imagemin({
            optimizationLevel: 3
            , progressive: true
            , interlaced: true
        })).pipe(gulp.dest(Config.img.dist)).pipe(reload());
    });

    gulp.task('dev', ['html:dev', 'css:dev', 'less:dev', 'js:dev', 'assets:dev', 'images:dev'], function () {
        connect.server({
            root: ['./'],
            port:8090,
            livereload:true,
            middleware: function(connect, opt) {
                return [
                    proxy('/hb-controller',  {
                        target: 'http://192.168.1.7:8080',
                        changeOrigin:true
                    }),
                    /*proxy('/hb',  {
                        target: 'http://192.168.0.102:8080/hb-controller',
                        changeOrigin:true
                    }),*/
                    proxy('/otherServer', {
                        target: 'http://IP:Port',
                        changeOrigin:true
                    })
                ]
            }
        });
        // Watch .html files
        gulp.watch(Config.html.src, ['html:dev']);
        // Watch .css files
        gulp.watch(Config.css.src, ['css:dev']);
        // Watch .less files
        gulp.watch(Config.less.src, ['less:dev']);
        // Watch assets files
        gulp.watch(Config.assets.src, ['assets:dev']);
        // Watch .js files
        gulp.watch(Config.js.src, ['js:dev']);
        // Watch image files
        gulp.watch(Config.img.src, ['images:dev']);
    });
}
//======= gulp dev 开发环境下 ===============
module.exports = dev;

在该文件中创建了如html:dev、css:dev、less:dev等几个任务(具体任务实现了什么功能,聪明的你应该看得出来~),这几个任务被放置在dev函数中,并且将dev函数暴露出去。 
其中一个主要的gulp任务 dev(同时也是生产环境下没有的gulp任务),开启了一个gulp-connect服务器,同时监听各个资源文件的变化,当文件发生变化后通知浏览器进行重新刷新。 还有一个就是开启了跨域代理服务,方便跟后台做对接。

上面的 connect.server 中 middleware 配置的是代理信息,不懂得可以去查查跨域代理是怎样配置的。

创建gulp的prod文件
在build文件夹下创建gulpfile.prod.js文件,用于放置生产环境下运行的任务。其中在生产环境下,我们并不需要使用到什么浏览器自动刷新的功能,只要进行如压缩CSS、JS文件等操作即可。 

gulpfile.prod.js

var gulp = require('gulp');
    minifyHtml = require("gulp-minify-html");    // html压缩
    autoprefixer = require('gulp-autoprefixer'); // 处理css中浏览器兼容的前缀  
    rename = require('gulp-rename');            //重命名
    cleanCss = require("gulp-clean-css");          // css的层级压缩合并
    less = require('gulp-less');                //less编译
    uglify = require('gulp-uglify');            //js压缩
    concat = require('gulp-concat');            //合并文件
    imagemin = require('gulp-imagemin');        //图片压缩

var Config = require('./gulpfile.config.js');
//======= gulp build 打包资源 ===============
function prod() {
    /**
     * HTML处理
     */
    gulp.task('html', function () {
        return gulp.src(Config.html.src).pipe(minifyHtml()).pipe(gulp.dest(Config.html.dist));
    });
    /**
     * assets文件夹下的所有文件处理
     */
    gulp.task('assets', function () {
        return gulp.src(Config.assets.src).pipe(gulp.dest(Config.assets.dist));
    });
    /**
     * CSS样式处理
     */
    gulp.task('css', function () {
        return gulp.src(Config.css.src).pipe(autoprefixer('last 2 version')).pipe(cleanCss()).pipe(gulp.dest(Config.css.dist));
    });
    /**
     * less样式处理
     */
    gulp.task('less', function () {
        return gulp.src(Config.less.src).pipe(autoprefixer('last 2 version')).pipe(less()).pipe(gulp.dest(Config.css.dist)).pipe(rename({
            suffix: '.min'
        })).pipe(cleanCss()).pipe(gulp.dest(Config.css.dist));
    });
    /**
     * js处理
     */
    gulp.task('js', function () {
        return gulp.src(Config.js.src).pipe(gulp.dest(Config.js.dist)).pipe(rename({
            suffix: '.min'
        })).pipe(uglify()).pipe(gulp.dest(Config.js.dist));
    });
    /**
     * 合并所有js文件并做压缩处理
     */
    gulp.task('js-concat', function () {
        return gulp.src(Config.js.src).pipe(concat(Config.js.build_name)).pipe(gulp.dest(Config.js.dist)).pipe(uglify()).pipe(gulp.dest(Config.js.dist));
    });
    /**
     * 图片处理
     */
    gulp.task('images', function () {
        return gulp.src(Config.img.src).pipe(imagemin({
            optimizationLevel: 3
            , progressive: true
            , interlaced: true
        })).pipe(gulp.dest(Config.img.dist));
    });
    gulp.task('build', ['html', 'css', 'less', 'js', 'assets', 'images']);
}
module.exports = prod;

同样在gulpfile.prod.js文件中将所有的任务放置在了prod函数中,同时暴露该函数供外部调用。 


调用dev和prod方法
在真正的gulp配置文件gulpfile.js中,引入gulpfile.dev.js和gulpfile.prod.js文件,并调用dev和prod方法,这样对应环境下的各个任务即被创建出来了。

gulpfile.js

var prod = require('./build/gulpfile.prod.js');
var dev = require('./build/gulpfile.dev.js');
prod();
dev();

运行gulp
这个时候,我们可以使用gulp dev命令进行开发模式,此时会监听项目src中文件的变化,执行对应的任务,与此同时会通知浏览器进行刷新,及时响应。 而使用gulp build命令则可以针对生产环境的要求打包资源文件,用于生产。

定义脚本scripts
编写 package.json 文件中公的 scripts 。


"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "start": "gulp dev",
  "dev": "gulp dev",
  "clean": "rimraf dist",
  "build": "rimraf dist && gulp build"
},


其中,主要的有: 
1. 定义了start脚本,用于执行gulp dev命令; 
2. 定义了dev脚本,同样用于执行gulp dev命令; 
3. 定义了clean脚本,用于执行rimraf dist命令(删除dist目录下的所有文件); 
4. 定义了build脚本,用于执行rimraf dist命令,还有gulp build命令,实际上就是先删除dist目录下的所有文件,然后再打包生成各资源文件。 
  需要rimraf,我们必须先进行全局安装:

npm install rimraf -g


  这样我们在实际使用过程中: 
1. 使用npm start命令将对应执行gulp dev命令; 
2. 使用npm run dev命令将对应执行gulp dev命令; 
3. 使用npm run clean命令将删除所有生成后的文件; 
4. 使用npm run build命令可以先删除生成后的文件,再重新打包生成。

猜你喜欢

转载自blog.csdn.net/black2Girl/article/details/83990688