1. 安装 Node 环境

参考 http://www.cnblogs.com/zichi/p/4627728.html,注意一起安装 npm 工具,并把路径保存到环境变量中(安装过程中会有提醒)

安装完后,用如下命令测试:

  1. node -v
  2. npm -v

2. 全局安装 gulp

  1. npm install gulp -g

这里有个误区,全局安装某个包,并不是说在任意文件中都能将它 require 进来而不报错,而是将其集成到了命令行中,我们能在命令行中使用 gulp taskname 这样的命令。再举个栗子,全局安装了 vue-cli(npm install vue-cli -g),我们便可以在命令行中用 vue init webpack demo 这样的命令生成脚手架了。

安装完后可以用 gulp -v 命令查看版本号。

3. package.json

项目的根目录需要一个 package.json 文件,当然没有这个文件也是 ok 的,不过我们需要用 Node 安装 gulp 插件,最好还是有个 package.json 文件。

在命令行中敲如下命令便可生成 package.json 文件:

  1. npm init

4. 局部安装 gulp

全局安装完 gulp,还需要局部安装一次,因为接下去的 gulpfile.js 文件需要引入这个包,使用它自身的 task 等命令以及调用 gulp 插件。

  1. npm install gulp --save-dev

--save 会将配置保存到 package.json 文件中,而 -dev 会将配置保存到 devDependencies 项中,如果没有加 -dev 则默认保存到 dependencies 一项中。对于 devDependencies 和 dependencies,我的理解是 devDependencies 是开发过程中的依赖,gulp 这样的打包工具,很显然只是存在于开发过程中,而 dependencies 是上线后依然需要的依赖。比如对于一个 vue 项目,babel 插件是开发过程中的依赖,是 devDependencies ,而 axios 则是 dependencies,最后会被打包到线上。

安装完后可以用 gulp -v 命令查看版本号。

5. gulpfile.js

最后,在根目录创建 gulpfile.js 文件,然后敲入如下内容:

  1. var gulp = require('gulp');
  2. gulp.task('default', function() {
  3. // 任务放在这
  4. console.log('Hello world!');
  5. });

命令行 cd 到项目根目录,然后输入 gulp,便可以在控制台看到输出。如果 task 名称是 default,则输入 gulpgulp default 等效,如果是其他的名字,需要用 gulp taskname

6. API 参考

以下内容参考 Gulp:任务自动管理工具

src()

gulp 模块的 src 方法,用于产生数据流。它的参数表示所要处理的文件,这些指定的文件会转换成数据流。参数的写法一般有以下几种形式。

  • js/app.js:指定确切的文件名。
  • js/*.js:某个目录所有后缀名为 js 的文件。
  • js/**/*.js:某个目录及其所有子目录中的所有后缀名为 js 的文件。
  • !js/app.js:除了 js/app.js 以外的所有文件。
  • *.+(scss|sass):+ 号后面会跟着圆括号,里面的元素用 | 分割,匹配多个选项。这里将匹配 scss 和 sass 文件。

src 方法的参数还可以是一个数组,用来指定多个成员。

  1. gulp.src(['js/**/*.js', '!js/**/*.min.js'])

(2017.1.5 补充)这里需要注意的是,gulp.src 前不要忘记加上 return

加不加 return 似乎都能完成 task,比如下面这段编译 sass 的代码:

  1. // sass -> css
  2. gulp.task('css', function() { // 任务名
  3. gulp.src('a.scss') // 目标 sass 文件
  4. .pipe(plumber({errorHandler: notify.onError('Error: <%= error.message %>')}))
  5. .pipe(debug({title: '开始编译'}))
  6. .pipe(sass()) // sass -> css
  7. .pipe(gulp.dest('')) // 目标目录
  8. .pipe(browserSync.stream()); // broswer reload
  9. });

我们在命令行运行 gulp css,sass 编译成功,但是我们看命令行的输出:

  1. [15:00:36] Starting 'css'...
  2. [15:00:36] Finished 'css' after 20 ms
  3. [15:00:36] 开始编译 a.scss
  4. [15:00:36] 开始编译 1 item

是不是感觉不大对?按道理来说编译完了 sass 后,这个叫 css 的 task 才算 finished 吧?

我们试着加上 return:

  1. // sass -> css
  2. gulp.task('css', function() { // 任务名
  3. return gulp.src('a.scss') // 目标 sass 文件
  4. .pipe(plumber({errorHandler: notify.onError('Error: <%= error.message %>')}))
  5. .pipe(debug({title: '开始编译'}))
  6. .pipe(sass()) // sass -> css
  7. .pipe(gulp.dest('')) // 目标目录
  8. .pipe(browserSync.stream()); // broswer reload
  9. });

这个时候命令行的编译输出符合我们预期了:

  1. [15:04:28] Starting 'css'...
  2. [15:04:28] 开始编译 a.scss
  3. [15:04:28] 开始编译 1 item
  4. [15:04:28] Finished 'css' after 54 ms

原来,不加 return 的话,task 和里面的 gulp 流是异步执行的,所以就会出现先 finished 再编译的情况。

那么不加 return 会有什么后果呢?比如 taskA 依赖 taskB 和 taskC

  1. gulp.task('taskA', ['taskB', 'taskC'], function() {
  2. // ...
  3. })

很显然,我们希望 taskB 和 taskC 两个任务完成后再去处理 taskA,如果 taskB 和 taskC 没有加 return,那么它 finished 的时候其实并不是任务真正完成的时候,这个时候去处理 taskA 可能会出现一些错误。

dest()

dest 方法将管道的输出写入文件,同时将这些输出继续输出,所以可以依次调用多次 dest 方法,将输出写入多个目录。如果有目录不存在,将会被新建。

dest 方法还可以接受第二个参数,表示配置对象。

  1. let gulp = require('gulp');
  2. let sass = require('gulp-sass');
  3. let minify = require('gulp-minify-css');
  4. let notify = require('gulp-notify');
  5. // 编译Sass
  6. gulp.task('sass', function() { // 任务名
  7. gulp.src('src/sass/a.scss') // 目标 sass 文件
  8. .pipe(sass({ style: 'compressed' })) // sass -> css
  9. .pipe(minify())
  10. .pipe(notify({message: '压缩完了'}))
  11. .pipe(gulp.dest('sass', {
  12. cwd: 'dist', // 实际目录 dist/sass/
  13. mode: '0644'
  14. })); // 目标目录
  15. });

配置对象有两个字段。cwd 字段指定写入路径的基准目录,默认是当前目录;mode 字段指定写入文件的权限,默认是 0777。

task()

task 方法用于定义具体的任务。它的第一个参数是任务名,第二个参数是任务函数(其实最多可以有三个参数,第二个参数可选,为指定依赖,可以看下面的例子)。

  1. gulp.task('greet', function () {
  2. console.log('Hello world!');
  3. });

task 方法还可以指定按顺序运行的一组任务。

  1. gulp.task('build', ['css', 'js', 'imgs']);

上面代码先指定 build 任务,它由 css、js、imgs 三个任务所组成,task 方法会并发执行这三个任务。注意,由于每个任务都是异步调用,所以没有办法保证 js 任务的开始运行的时间,正是 css 任务运行结束。

如果希望各个任务严格按次序运行,可以把前一个任务写成后一个任务的依赖模块。

  1. gulp.task('css', ['greet'], function () {
  2. // Deal with CSS here
  3. });

上面代码表明,css 任务依赖 greet 任务,所以 css 一定会在 greet 运行完成后再运行。

如果一个任务的名字为 default,就表明它是 “默认任务”,在命令行直接输入 gulp 命令,就会运行该任务。

  1. gulp.task('default', function () {
  2. // Your default task
  3. });
  4. // 或者
  5. gulp.task('default', ['styles', 'jshint', 'watch']);

执行的时候,直接使用 gulp,就会运行 styles、jshint、watch 三个任务。

watch()

watch 方法用于指定需要监视的文件。一旦这些文件发生变动,就运行指定任务。

  1. gulp.task('watch', function () {
  2. gulp.watch('templates/*.tmpl.html', ['build']);
  3. });

上面代码指定,一旦 templates 目录中的模板文件发生变化,就运行 build 任务。

watch 方法也可以用回调函数,代替指定的任务。

  1. gulp.watch('templates/*.tmpl.html', function (event) {
  2. console.log('Event type: ' + event.type);
  3. console.log('Event path: ' + event.path);
  4. });

Gulp 入门的更多相关文章

  1. Gulp入门教程(转载)

    本人转载自: Gulp入门教程

  2. (转)前端构建工具gulp入门教程

    前端构建工具gulp入门教程 老婆婆 1.8k 2013年12月30日 发布 推荐 10 推荐 收藏 83 收藏,20k 浏览 本文假设你之前没有用过任何任务脚本(task runner)和命令行工具 ...

  3. 《Gulp 入门指南》 : 使用 gulp 压缩 JS

    <Gulp 入门指南> : 使用 gulp 压缩 JS 请务必理解如下章节后阅读此章节: 安装 Node 和 gulp 访问论坛获取帮助 压缩 js 代码可降低 js 文件大小,提高页面打 ...

  4. Gulp入门与解惑

    Gulp简介 Gulp.js 是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务.Gulp.js是基于 Node.js构建的,利用Node.js流的威力,你可以快速构建项目. 安装 ...

  5. gulp 入门使用

      gulp 入门使用 使用场景 相信大家在传统的开发模式下 都是 html + css + js 然后静态文件不经过任何处理 部署到服务器,这样会有很多漏洞例如: 1.在网站上查看F12 就可以看到 ...

  6. 【转】Gulp入门基础教程

    Gulp入门基础教程 原文在此 前言最近流行前端构建工具,苦于之前使用Grunt,代码很难阅读,现在出了Gulp, 真是摆脱了痛苦.发现了一篇很好的Gulp英文教程,整理翻译给大家看看. 为什么使用G ...

  7. gulp入门与一些基本设置

    这里是gulp入门的一些操作,实现了编译sass文件.压缩.合并.添加版本号等基本功能. 友情提示,如果npm出现无法下载可以安装 cnpm.在安装完Nodejs 后 npm install cnpm ...

  8. gulp入门演练

    一直想学习下gulp看了蛮多资料,然后总是感觉是是而非,突然开窍了,把自己学会的过程给大家分享下,入门超级简单的 gulp安装 安装gulp 如果参数-g 表示全局安装 $ npm install g ...

  9. 前端小白的gulp入门

    gulp新手入门 全局安装 cnpm install -g gulp 本地安装cnpm install gulp -D 如果项目没有package.json,记得npm init 安装插件cnpm i ...

  10. gulp入门学习教程(入门学习记录)

    前言 最近在通过教学视频学习angularjs,其中有gulp的教学部分,对其的介绍为可以对文件进行合并,压缩,格式化,监听,测试,检查等操作时,看到前三种功能我的心理思想是,网上有很多在线压缩,在线 ...

随机推荐

  1. php内核分析(一)-sapi_module_struct

    这里阅读的php版本为PHP-7.1.0 RC3,阅读代码的平台为linux 首先是寻找php的入口,php有很多种模式,apache,php-fpm, cli模式,我要入手的话,只能先从最简单的cl ...

  2. 【转译】加入ZigBee联盟,共画物联网的未来

    Zigbee联盟是物联网全球革命的领导者,创造了随心控制的时代.Zigbee简化了无线产品的整合.加快了市场化,同时让那些希望引入高能效的无线控制的厂商,降低了成本和风险.我们的联盟成员在开放的全球环 ...

  3. openresty 前端开发入门三之JSON篇

    这章主要介绍一下,lua怎么返回一个json字符串,怎么把一个table转成json字符串,又怎么把一个json字符串转成json 其实很简答,直接使用cjson库的encode.decode方法即可 ...

  4. Python 基础之二用户交互input

    Input是个内建函数: >>> input <built-in function input> >>>   具体用法:接收用户输入的内容,输入的字符串 ...

  5. 修改nginx配置文件解决dx2.5下载附件停止不动的问题

    在下载论坛附件的时候,总是停止在某个字数数不动 如下图 后来查看log发现 如下图 权限拒绝 发现后nginx的配置文件的启动者有关系 改了下 user 为 root 居然好了

  6. ERDAS 2014安装破解及汉化图文教程

    关于ERDAS 2014 的安装破解及其汉化过程: 说明:汉化只是之针对英语能力不能正常满足使用软件的朋友们.如果英语过专八,完全没有必要汉化!在此之前查了好多关于ERDAS汉化的文档,可惜只是简单的 ...

  7. jquery的选择器

    一.基本选择器 1.$("#id") id选择器,返回单个元素 2.$(".class") class选择器,返回集合元素 3.$("element& ...

  8. 移动Web利器transformjs入门

    简介 在过去的两年,越来越多的同事.朋友和其他不认识的童鞋进行移动web开发的时候,都使用了transformjs,所有必要介绍一下,让更多的人受益,提高编程效率,并享受编程乐趣.(当然transfo ...

  9. css3 transition属性

    最近打算学习css3知识,觉得css3写出来的效果好炫好酷,之前一直想要学习来着.可能之前的决心,毅力,耐心不够,所以想要重整起来,放下浮躁的心态,一步一个脚印,踏踏实实的来学习. 首先学习的是css ...

  10. arcgis api for js共享干货系列之二自定义Navigation控件样式风格

    arcgis api for js默认的Navigation控件样式风格如下图: 这样的风格不能说不好,各有各的爱好,审美观,这里也不是重点,这里的重点是如何自定义一套自己喜欢的样式风格呢:自己自定义 ...