自动构建工具Gulp

简介: 自动构建工具Gulp

摘要:


  

gulp与grunt一样,都是自动构建工具。和grunt相比它更突出一个流的概念,任务是一个接一个执行的。今天就分享如何用gulp做自动化。


安装:


  

gulp也是基于node环境,所以安装gulp之前你需要安装node.js。


   npm install -g gulp


只要在命令窗口中执行上面一行命令就完成安装,这样安装的是全局安装。在项目中一般是通过package.json中的devDependencies属性来安装。如下:


{
    "name": "",
    "version": "0.0.0",
    "description": "",
    "main": "gulpfile.js",
    "dependencies": {},
    "devDependencies": {
        "gulp": "~3.5.6"
    },
    "license": "ISC"
}


执行npm install就会将gulp安装到当前项目中。


如何运行:


  

安装完gulp之后,需要新建一个gulpfile.js文件,一般是在项目的根目录,与package.json放在一块。那gulpfile.js文件里面到底写什么呢?当然是定义一些任务。如下:


var gulp = require('gulp');
gulp.task('default', function() {
  // 执行任务
});


然后在当前目录中通过命令窗口执行gulp,default里面的任务就会被执行。


配置参数:  



gulp.src(globs[, options])

  

加载文件,并将文件以流的方式传到插件中,如下:


gulp.src('client/templates/*.jade')
  .pipe(jade())
  .pipe(minify())
  .pipe(gulp.dest('build/minified_templates'));


gulp首先会加载client/templates/下的所有jade文件,然后分别传递给jade插件、minify插件,然后输出到build/minified_templates中。


globs

  

类型:String,Array

  

文件或者是路径,多个文件以数组的形式。

options

  

类型:Object

  

gulp通过options将配置参数传递给node


options.buffer

  

类型:bool

  

默认值: false

  

是否将文件以流的方式返回,false设置文件内容以流的方式读取,并且不缓存,对于大文件设置缓存将是非常有用的。


options.read

  

类型:bool

  

默认值:true  

  

设置是否读取文件,如果设置false将永远不读取文件


options.base

  

类型: String

  

设置输出文件的根目录,如下:


gulp.src('client/js/**/*.js') // Matches 'client/js/somedir/somefile.js' and resolves `base` to `client/js/`
  .pipe(minify())
  .pipe(gulp.dest('build'));  // Writes 'build/somedir/somefile.js'
gulp.src('client/js/**/*.js', { 
  .pipe(gulp.dest('build'));  // Writes 'build/js/somedir/somefile.jbase: 'client' })
  .pipe(minify())s'


gulp.dest(path[, options])


  

输出文件,可以输出到不同目录下,如果目录不存在就创建,如下:


gulp.src('./client/templates/*.jade')
  .pipe(jade())
  .pipe(gulp.dest('./build/templates'))
  .pipe(minify())
  .pipe(gulp.dest('./build/minified_templates'));


path

  

类型: String,Function

  

设置输出文件的路径


options.cwd

  

类型: String

  

默认值: process.cwd()

  

输出的文件夹,只有当路径为相对路径时才起作用


options.mode

  

类型:String

  

默认值:0777

  

设置输出文件的权限


gulp.task(name[, deps], fn)



定义一个任务,如下:


gulp.task('somename', function() {
  // Do stuff
});


name


任务名,调用任务是只需要gulp.run(任务名)


deps

  

类型:Array

  

执行当前任务所需要依赖的任务,被依赖的任务会在当前任务执行之前执行。注意异步任务


fn

  

需要执行的任务都定义在此处


异步执行任务:


使用回调函数


// run a command in a shell
var exec = require('child_process').exec;
gulp.task('jekyll', function(cb) {
  // build Jekyll
  exec('jekyll build', function(err) {
    if (err) return cb(err); // return error
    cb(); // finished task
  });
});


返回一个文件流
gulp.task('somename', function() {
  var stream = gulp.src('client/**/*.js')
    .pipe(minify())
    .pipe(gulp.dest('build'));
  return stream;
});


使用promise


var Q = require('q');
gulp.task('somename', function() {
  var deferred = Q.defer();
  // do async stuff
  setTimeout(function() {
    deferred.resolve();
  }, 1);
  return deferred.promise;
});


注意任务依赖关系,下面是一个例子:


var gulp = require('gulp');
// takes in a callback so the engine knows when it'll be done
gulp.task('one', function(cb) {
    // do stuff -- async or otherwise
    cb(err); // if err is not null and not undefined, the run will stop, and note that it failed
});
// identifies a dependent task must be complete before this one begins
gulp.task('two', ['one'], function() {
    // task 'one' is done now
});
gulp.task('default', ['one', 'two']);


gulp.watch(glob [, opts], tasks) or gulp.watch(glob [, opts, cb])



监听文件,当文件发生变化时,定义的任务将会被执行。如下当js文件发生改变时会触发change事件。


var watcher = gulp.watch('js/**/*.js', ['uglify','reload']);
watcher.on('change', function(event) {
  console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
});
或者:
gulp.watch('js/**/*.js', function(event) {
  console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
});


实例:



下面是一个简单的例子,实现js、css的压缩合并。


package.json安装模块


{
    "name": "",
    "version": "0.0.0",
    "description": "",
    "main": "gulpfile.js",
    "dependencies": {},
    "devDependencies": {
        "gulp": "~3.5.6",
        "gulp-minify-css": "~0.3.0",
        "gulp-uglify": "^1.0.0",
        "gulp-concat": "~2.0.0",
        "gulp-rename": "^1.0.0"
    },
    "license": "ISC"
}


gulpfile.js


var gulp = require('gulp');
// 加载模块
var
    minifycss = require('gulp-minify-css'), // CSS压缩
    uglify = require('gulp-uglify'),        // js压缩
    concat = require('gulp-concat'),        // 合并文件
    rename = require('gulp-rename');        // 重命名
// 合并、压缩、重命名css
gulp.task('min-styles', function() {
  gulp.src(['./static/css/*.css'])
    .pipe(concat('all.css'))
    .pipe(gulp.dest('./static/build/css/'))
    .pipe(rename({ suffix: '.min' }))
    .pipe(minifycss())
    .pipe(gulp.dest('./static/build/css'));
});
// 合并,压缩js文件
gulp.task('min-javascripts', function() {
  gulp.src('./static/js/*.js')
    .pipe(concat('all.js'))
    .pipe(gulp.dest('./static/build/js'))
    .pipe(rename({ suffix: '.min' }))
    .pipe(uglify())
    .pipe(gulp.dest('./static/build/js'));
});
// 定义develop任务发布或者运行时使用
gulp.task('develop',function(){
  gulp.run('min-styles','min-javascripts');
});
// gulp命令默认启动的就是default
gulp.task('default', function() {
  // 监听.css文件,一旦有变化,立刻调用min-styles任务执行
  gulp.watch('./css/*.css', ['min-styles']);
  gulp.run('develop');
});


相关文章
|
算法 Java 大数据
我的Java秋招面经大合集(包含BAT头条网易等公司)
​ 阿里面经 阿里中间件研发面经 蚂蚁金服研发面经 岗位是研发工程师,直接找蚂蚁金服的大佬进行内推。 我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。 然后我也参加了蚂蚁金服中间件部门的面试,经历了三次面试,但是没有走流程,所以面试中止了。
|
7天前
|
JSON API 数据格式
OpenCode入门使用教程
本教程介绍如何通过安装OpenCode并配置Canopy Wave API来使用开源模型。首先全局安装OpenCode,然后设置API密钥并创建配置文件,最后在控制台中连接模型并开始交互。
3178 7
|
13天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
3天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
|
15天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
2240 18
|
7天前
|
人工智能 前端开发 Docker
Huobao Drama 开源短剧生成平台:从剧本到视频
Huobao Drama 是一个基于 Go + Vue3 的开源 AI 短剧自动化生成平台,支持剧本解析、角色与分镜生成、图生视频及剪辑合成,覆盖短剧生产全链路。内置角色管理、分镜设计、视频合成、任务追踪等功能,支持本地部署与多模型接入(如 OpenAI、Ollama、火山等),搭配 FFmpeg 实现高效视频处理,适用于短剧工作流验证与自建 AI 创作后台。
1123 5
|
6天前
|
人工智能 运维 前端开发
Claude Code 30k+ star官方插件,小白也能写专业级代码
Superpowers是Claude Code官方插件,由核心开发者Jesse打造,上线3个月获3万star。它集成brainstorming、TDD、系统化调试等专业开发流程,让AI写代码更规范高效。开源免费,安装简单,实测显著提升开发质量与效率,值得开发者尝试。
|
17天前
|
人工智能 测试技术 开发者
AI Coding后端开发实战:解锁AI辅助编程新范式
本文系统阐述了AI时代开发者如何高效协作AI Coding工具,强调破除认知误区、构建个人上下文管理体系,并精准判断AI输出质量。通过实战流程与案例,助力开发者实现从编码到架构思维的跃迁,成为人机协同的“超级开发者”。
1268 102