gulp构建工具的几个使用技巧

       这里并不讲什么 gulp 及其其插件的安装,此前的文章已经提到过了。这里主要用来记录一下,gulp构建工具的一些简单常用的用法。

最有用的Gulp插件汇总

1)假如我们想使用gulp压缩js文件并合并js文件,应如何操作呢?

使用gulp-uglify和gulp-concat插件,gulpfile.js 大致如下:

/**
 * Created by DreamBoy on 2016/8/19.
 */
var gulp = require('gulp');
var gutil = require('gulp-util');
var uglify = require('gulp-uglify');
var concat = require('gulp-concat');

gulp.task('concat', function() {
    // 你的默认的任务代码放在这
    gulp.src('./src/*.js')
        .pipe(uglify())
        .pipe(concat('all.min.js'))
        .pipe(gulp.dest('./build'));
});

gulp.task('default', ['concat']);

// 在命令行中运行 gulp
/*
默认的名为default的任务(task)将会被运行,在这里,这个任务并未做任何事情。
想要单独执行特定的任务(task),请输入gulp <task> <othertask>。
 */

       更加详细的用法可以参考:gulp教程之gulp-uglify


2)那如果我们想在编写网页时文件内容发生改变就自动实时的刷新浏览器,我们应该如何操作呢?

参考: 用gulp-livereload实现浏览器自动刷新页面

使用gulp-livereload插件,gulpfile.js大致如下:

/**
 * Created by DreamBoy on 2016/8/21.
 */
var gulp = require('gulp'),
    livereload = require('gulp-livereload');

gulp.task('watch', function() { //这里的watch,是自定义的,携程live或者别的也行
    var server = livereload();
    // app/**/*.* 的意思是 app 文件夹下的 任何文件夹 的 任何文件
    gulp.watch('app/**/*.*', function(file) {
        server.changed(file.path);
    });
});
       那么,这里需要强调的一个就是 gulp的watch函数,可以监听文件的变化。可想而知,通过这个函数,我们有更多自动化地操作,如 当文件内容发生变化时,就压缩该文件到指定目录呀(这个步骤可以认为是一个任务task)。这样监听文件变化后,我们就可以不用手动地去使用gulp命令压缩文件了。

3)如果我们想使用gulp编译sass文件呢?

使用gulp-sass插件,gulpfile.js大致如下:

/**
 * Created by DreamBoy on 2016/8/22.
 */
var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function() {
    return gulp.src('stylesheets/**/*.scss')
        .pipe(sass())
        .pipe(gulp.dest('dist/css'));
});
       这样执行 gulp sass 命令就可以直接编译sass文件到指定目录了。另外,这里我们又有一个需求了,我想在编写 sass文件的过程中保存文件就可以实时地进行编译文件成对应的css文件。那么其实这里就需要我们用到上述提到的 gulp.watch了。在原有的gulpfile.js中添加如下 gulp 的 task:

gulp.task('sass-watch', function() {
    gulp.watch('stylesheets/**/*.scss', ['sass']);
});
       这样执行 gulp sass-watch命令就可以监听对应文件夹下的sass文件的变化然后实时的编译sass文件了。

       那,我们还想在编译后,保留css文件的同时,又压缩该css文件呢?其实还是一样的思路。具体可以参考:使用Gulp进行Javascript以及css压缩合并 来实现。需要安装 css压缩 gulp-minify-css 和 重命名 gulp-rename。修改 gulpfile.js 如下:

/**
 * Created by DreamBoy on 2016/8/22.
 */
var gulp = require('gulp');
var sass = require('gulp-sass');

var minifycss = require('gulp-minify-css'); // CSS 文件的压缩
var rename = require('gulp-rename');

gulp.task('sass', function() {
    return gulp.src('stylesheets/**/*.scss')
        .pipe(sass())
        .pipe(gulp.dest('dist/css'))
        .pipe(rename({suffix: '.min'})) //rename压缩后的文件名
        .pipe(minifycss()) //执行压缩
        .pipe(gulp.dest('dist/css'));
});

gulp.task('sass-watch', function() {
    gulp.watch('stylesheets/**/*.scss', ['sass']);
});

注意:这里可能遇到一个错误:

解决Error: ENOENT: no such file or directory, scandir 'D:\IdeaWork\code-front-jet\node_modules\.npminstall\node-sass\3.7.0\node-sass\vendor'

解决:运行 npm rebuild node-sass

4)使用 gulp 编译 TypeScript

       这里需要我们使用 gulp-typescript 插件,定义gulpfile.js大致如下:

var gulp = require('gulp');
var ts = require('gulp-typescript');

gulp.task('tsc', function () {
    gulp.src('app/**/*.ts')
        .pipe(ts())
        .pipe(gulp.dest('wwwroot/app'));
});
        为了实现自动编译的功能,我们可以在原来的 gulpfile.js 文件中再添加一个 task,如:

gulp.task('tsc:w', ['tsc'], function () {
    gulp.watch('app/**/*.ts', ['tsc']);
});
       在项目中一般对应会有一个 TypeScript 的配置文件,那我们还需要读取这个文件的话,需要对上面这个tsc任务进行修改,先读取tsconfig.json文件,如:

var gulp = require('gulp');
var ts = require('gulp-typescript');
var tsProj = ts.createProject('tsconfig.json');

gulp.task('tsc', function () {
    var tsResult = gulp.src('app/**/*.ts')
        .pipe(ts(tsProj))
        .pipe(gulp.dest('wwwroot/app'));
});
       最终的gulpfile.js内容如下:

var gulp = require('gulp');
var ts = require('gulp-typescript');
var tsProj = ts.createProject('tsconfig.json');

gulp.task('tsc', function () {
    var tsResult = gulp.src('app/**/*.ts')
        .pipe(ts(tsProj))
        .pipe(gulp.dest('wwwroot/app'));
});

gulp.task('tsc:w', ['tsc'], function () {
    gulp.watch('app/**/*.ts', ['tsc']);
});

参考:在 VS 2015 中使用 Gulp 编译 TypeScript   官方:教你如何使用Gulp构建TypeScript

更详细的用法可以参考: gulp-typescript

这里加一段 关于 tsconfig.json 文件中参数的解释:

  • target:编译之后生成的JavaScript文件需要遵循的标准。有三个候选项:es3es5es2015
  • noImplicitAny:为false时,如果编译器无法根据变量的使用来判断类型时,将用any类型代替。为true时,将进行强类型检查,无法推断类型时,提示错误。
  • module:遵循的JavaScript模块规范。主要的候选项有:commonjsAMDes2015。为了后面与node.js保持一致,我们这里选用commonjs
  • removeComments:编译生成的JavaScript文件是否移除注释。
  • sourceMap:编译时是否生成对应的source map文件。这个文件主要用于前端调试。当前端js文件被压缩引用后,出错时可借助同名的source map文件查找源文件中错误位置。
  • outDir:编译输出JavaScript文件存放的文件夹。
  • includeexclude:编译时需要包含/剔除的文件夹。

5)当使用 TypeScript 中的引入模块,那么TypeScript文件会生成Node.js使用的CommonJS模块。此时将工程由Node.js环境移到浏览器环境里,是不能使用的。浏览器并不认识require函数。那么需要我们将所有模块捆绑成一个JavaScript文件。参考:TypeScript 官网中提到的 教你如何使用Gulp构建TypeScript 。

gulpfile.js 文件可以修改为如下:

/**
 * Created by Administrator on 2016/8/24 0024.
 */
/*var gulp = require('gulp');
var ts = require('gulp-typescript');
var tsProject = ts.createProject('tsconfig.json');

gulp.task('default', function() {
    return tsProject.src()
        .pipe(ts(tsProject))
        .js.pipe(gulp.dest('dist'));
});*/

/**
 *下面处理整合 由.ts文件编译来的 .js文件,这样在实际页面中才能引用这个js。
 * nodejs实现了 commonJS规范,可以使用 require和exports。但在实际浏览器环境中不可以使用require和exports。
 * 所以我们需要将所有模块捆绑成一个JavaScript文件。
 * 所幸,这正是Browserify要做的事情。 更方便的是,它支持Node.js的CommonJS模块,这也正是TypeScript默认生成的类型。
 * 也就是说TypeScript和Node.js的设置不需要改变就可以移植到浏览器里。
 *
 * 首先,安装Browserify,tsify和vinyl-source-stream。 tsify是Browserify的一个插件,
 * 就像gulp-typescript一样,它能够访问TypeScript编译器。
 * vinyl-source-stream会将Browserify的输出文件适配成gulp能够解析的格式,它叫做 vinyl。
 *
 * npm install --save-dev browserify tsify vinyl-source-stream
 */
// 修改 gulpfile.js 如下:
var gulp = require('gulp');
var browserify = require('browserify');
var source = require('vinyl-source-stream');
var tsify = require('tsify');

var paths = {
    pages: ['src/*.html']
};

gulp.task('copy-html', function() {
    return gulp.src(paths.pages)
        .pipe(gulp.dest('dist'));
});

gulp.task('default', ['copy-html'], function() {
    return browserify({
        basedir: '.',
        debug: true, // debug: true。 这会让 tsify在输出文件里生成source maps。 source maps允许我们在浏览器中直接调试TypeScript源码,而不是在合并后的JavaScript文件上调试。
        entries: ['src/main.ts'],
        cache: {},
        packageCache: {}
    })
        .plugin(tsify)
        .bundle()
        .pipe(source('bundle.js'))
        .pipe(gulp.dest('dist'));
});

          

       针对 TypeScript,那我们同时想生成压缩后的 bundle.js 文件呢?实时监测.ts文件变化,然后进行上述操作呢?gulpfile.js 内容修改如下:

/**
 * Created by Administrator on 2016/8/24 0024.
 */
// npm install --save-dev gulp gulp-typescript

    // 1. 编译 TypeScript文件 为JavaScript文件,并把所有模块捆绑成一个JavaScript文件 bundle.js
// npm install --save-dev browserify tsify vinyl-source-stream

    // 2. 压缩上述生成的文件,并生成 单独的sourcemap文件
// npm install --save-dev gulp-uglify vinyl-buffer gulp-sourcemaps

    // 3. 监听 .ts文件的变化实时进行上述的操作 —— 启动Gulp并保持运行状态,当你保存文件时自动编译。
    // 帮你进入到编辑-保存-刷新浏览器的循环中。
// npm install --save-dev watchify gulp-util


var gulp = require("gulp");
// browserify watchify
var browserify = require("browserify");
var source = require('vinyl-source-stream');
var watchify = require("watchify");
var tsify = require("tsify");
var gutil = require("gulp-util");

// uglify
var uglify = require('gulp-uglify');
var sourcemaps = require('gulp-sourcemaps');
var buffer = require('vinyl-buffer');

var paths = {
    pages: ['src/*.html']
};

var watchedBrowserify = watchify(browserify({
    basedir: '.',
    debug: true,
    entries: ['src/main.ts'],
    cache: {},
    packageCache: {}
}).plugin(tsify));

gulp.task("copy-html", function () {
    return gulp.src(paths.pages)
        .pipe(gulp.dest("dist"));
});

function bundle() {
    return watchedBrowserify
        .bundle()
        /*.pipe(source('bundle.js'))
        .pipe(gulp.dest("dist"));*/

        // 添加 uglify 压缩功能
        .pipe(source('bundle.js'))
        .pipe(buffer())
        .pipe(sourcemaps.init({loadMaps: true}))  // 这些调用让我们可以使用单独的sourcemap文件,而不是之前的内嵌的sourcemaps
        .pipe(uglify())
        .pipe(sourcemaps.write('./'))
        .pipe(gulp.dest("dist"));
}

gulp.task("default", ["copy-html"], bundle);
watchedBrowserify.on("update", bundle); // 每次TypeScript文件改变时Browserify会执行bundle函数
watchedBrowserify.on("log", gutil.log); // 将日志打印到控制台


 

6)使用gulp-compass编译compass,gulpfile.js如下:

var gulp = require('gulp'),
	compass = require('gulp-compass'),
	mincss = require('gulp-minify-css');

gulp.task('css', function() {
	// 编译CSS
	// 压缩CSS
	gulp.src('./sass/*.scss')
		.pipe(compass({
			config_file: './config.rb',
			css: 'stylesheets',
			sass: 'sass'
		}))
		.pipe(mincss())
		.pipe(gulp.dest('stylesheets'));
});

gulp.task('watch', function() {
	gulp.watch('./sass/*.scss', ['css']);
});

gulp.task('default', ['watch'], function() {
	// 将你的默认的任务代码放在这
	console.log('task default');
});





后续持续更新 ......


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值