gulp学习初体验

花了一天的时间,把gulp的一些基本用法过了一遍。总算对其有了些了解。记录下学习中的不解,也算对这次的学习一个总结。

首先介绍一下gulp,gulp是一个前端构建工具,利用它可以在项目开发过程中自动化执行任务。有赖于其强大的插件系统,我们可以利用gulp完成很多任务,例如执行JSHint,编译stylus,更新版本号等。

安装gulp:

全局安装:

npm install -g gulp

项目安装:

npm install --save-dev gulp

—save-dev 安装包将在开发环境下安装,版本信息写入package.json的devDependencies下。

gulp任务都定义在gulpfile.js中,可以在终端运行gulp命令来执行。

gulp任务

加载gulp模块

var gulp = require('gulp');

其他gulp插件的加载也是一样。

下面是一段编译stylus的gulp task代码,用来简单解释一下gulp的工作流程。

gulp.task('stylus', function(){
  gulp.src('./assets/stylus/style.styl')
      .pipe(stylus())
      .pipe(gulp.dest('./assets/stylesheets'));
});

gulp.task(taskName, excutor)用来定义任务。需要任务名和执行函数两个参数。执行函数也可以是多个任务。

gulp.task(‘build’, [‘task’, ‘anotherTask’]);

但是这些任务不是顺序执行的。要保证一个任务先于另一个执行可以:

gulp.task('taskTwo', ['taskOne'], function () {
   // taskTwo
});

taskTwo 会在 taskOne执行完后再执行。

gulp.src()函数用来匹配文件,创建一个对象流来代表这些文件,之后的操作都是以这些文件为对象进行操作。pipe顾名思义就是管道的意思, stylus()返回修改后的文件对象放入流中,这些输出的文件随着管道被输入到gulp.dest()函数中并保持下来。

最后不要忘记在文件头部加载gulp-stylus模块。

运行gulp

终端执行 $ gulp 会报错,因为gulp默认会执行default 任务。需要在gulpfile.js内定义此任务

gulp.task('default', function(){
  //deal with default task
})

如果要运行指定任务

$ gulp taskName

watching files

用gulp来监听文件的修改状态非常方便。我们来定义一个watch任务看一下

gulp.task('watch', function(){
  gulp.watch('./assets/stylus/*.styl', ['stylus']);
});

现在当改变styl文件时就会执行stylus任务。

当然仅仅是watch是不够的,我们还希望在文件修改的同时浏览器能同步更新。browserSync插件就可以做到。当改变代码的时候,BrowserSync会重新加载页面,如果是css文件,会直接添加进css中,页面并不需要再次刷新。这样我们修改前端代码时就不需要每次都手动刷新浏览器。

gulp.task('browser-sync', function(){
  browserSync.init(null, {
    proxy: 'http://localhost:3000',
    files: ['assets/stylesheets/*.css'],
    browser: 'google-chrome',
    port: 7000,
    reloadOnRestart: false
  });
});
gulp.task('default', ['browser-sync']);

gulp运行时会默认执行browser-sync任务。启动browserSync,监听css文件的改变并在chrome中加载更新的部分。

proxy: vhost url
files: 监听改变的文件
port: browser侦测改变的端口

browserSync主要监听浏览器端的改变,要监听更新服务端需要用到nodemon

gulp.task('nodemon', function(){
  return nodemon({
    script: 'bin/www',
    ext: 'js'
  }).on('start', function(){

  });
});

项目开发是基于express, 这段代码会执行bin/www文件运行服务端,并监听js文件的改变,每次改变重启服务。