欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

宁皓网 Gulp 自动化任务


Gulp,可以去执行你事先设计好的任务,这些任务就是你平时在做前端开发的时候需要重复去执行的动作。它可以让我们为前端项目创建一个本地的服务器,然后去监视一些文件的变化,当这些文件发生变化以后,就去执行一些指定的任务,比如去把几个文件合并到一块,压缩一下,去把 Sass 或者 Less 编译成 CSS,再把处理之后的文件放到一个指定的地方。

Gulp 的任务要放到一个叫 Gulpfile.js 的文件里面。你可以通过插件去扩展 Gulp 的功能,不同的插件可以去做不同的事情。Gulp 与 Grunt 做的事差不多,你可以为项目选择其中的一个。

来自 https://ninghao.net/course/2000#info


1)介绍

在我们的工作流程里,应该尽量减少重复的工作,借助像 grunt 或者 gulp 之类的工具,很多任务都可以自动去执行,比如一些跟文件相关的操作。在这个课程里,我们就去学习一下怎么样使用 gulp ...

你可以用它创建一个开发用的服务器,然后去监视一些文件的变化,发生变化以后,就去执行事先设计好的任务。比如去把 Sass 或者 Less 编译成 CSS,去合并 JavaScript ,再最小化一下合并之后的 JS 文件, 然后你可以把处理好的文件放到一个你指定的地方 ... 最后再自动刷新一下浏览器,这样就可以立即看到修改之后的结果 ...

来自  https://ninghao.net/video/2001#info

准备

2)安装 gulp 命令行工具

gulp 是基于 node 开发的,所以,我们可以使用 npm 这个 nodejs 的包管理工具去安装它。要使用 npm,你需要先去安装一下 nodejs,在这里,你可以找到安装 nodejs 的方法。安装好以后,我们可以打开命令行工具,osx 用户可以使用终端工具,windows 用户可以找到 node bash 这个工具。

gulp 需要先在全局范围里面安装一下,这样我们就可以在命令行下面,使用 gulp 这个命令了。然后在项目里面也需要去安装一下 gulp 。在全局范围里安装 gulp ,可以这样。这里我用的是 osx 的终端工具。输入 npm install ,就是要去安装点什么,这里加上一个 -g 参数,表示我们要在全局范围里面安装东西。后面再加上要安装的东西的名字。这里就是 gulp ...

npm install -g gulp

执行这个命令可以需要管理员的权限,如果安装遇到问题的话,可以在命令的前面加上一个 sudo ... 回车 ... 去执行一下。

完成以后,输入 gulp --help ... 会返回一些帮助的信息,说明我们已经成功的安装了 gulp 这个命令行工具。

来自  https://ninghao.net/video/2002#info


3)初始化项目


我们先去给要创建的前端的项目创建一个目录。在命令行的下面创建目录用的是 mkdir 这个命令,windows 上应该使用 md 命令。后面加上目录的名字 ... 输入 ninghao ..

mkdir ninghao-gulp

创建好以后,再进入到这个目录的下面,可以使用 cd 命令。

cd ninghao-gulp

npm,需要一个叫 package.json 的文件来管理依赖,可以手工去创建这个文件,也可以使用 npm init 这个命令。 输入 npm init ...

npm init

这行命令会问我们一些问题。name,指定一下项目的名称,默认会用这个项目目录的名字,按下回车。version 就是这个项目的版本,输入 0.0.1 ...

description,是这个项目的描述,Gulp course by ninghao.net ... entry point ,没有 ... 回车 ... test command,测试命令,也没有 ... 再回车 ... 这个项目的 git 版本库,也还没有,回车 ... keywords ,关键词。回车 ... author ,作者,输入 wanghao ... license ... 项目的许可协议,暂时也不用管,再按一下回车。

最后这里会出现一个要创建的 package.json 文件的内容,没有问题的话,可以再按一下回车。

查看一下这个目录里的东西 ... ls ,windows 用户可以使用 dir 命令 ... 你会看到一个 package.json 文件。这就是刚才使用 npm init 命令创建的文件。 下面,我们可以使用编辑器打开这个目录 ... 这里我用的是 atom 这个编辑器。 在命令行下面,可以输入 atom . 表示用 atom 这个编辑器打开当前的目录。

找到 package.json ... 现在你看到的就是一个 json 格式的文件,里面的内容其实就是描述了一下我们的项目,比如项目的名字,作者,描述等等。我们的项目需要的 nodejs 模块,可以在这个文件里列出来 ... 下面,我们再去在项目里面安装一下需要的 gulp 这个模块。

回到命令行工具 .. 输入 npm install gulp ... 注意这回我们没有使用 -g 这个参数 ... 这样就可以把模块直接安装到项目下面。 这里我们可以再加上一个 --save-dev 选项,这样会把要安装的东西,添加到 package.json 这个文件里面。

npm install gulp --save-dev

回到用编辑器打开的项目。这里你会发现在项目下面, 多了一个叫 node_modules 的目录 ... 在这个目录的下面,你会看到刚才安装的 gulp 这个模块。再打开这个 package.json 文件 ... 你会看到这个文件里,会多了一个依赖 ... 这里会有 gulp ... 这个 dev 表示在开发的时候依赖的东西。

现在,我们可以删除掉 node_modules 这个目录 ... 然后用一行命令,可以安装所有的,在 package.json 文件里面列出来的依赖的东西。

回到命令行,删除目录可以使用 rm 命令。 先加上一个 sudo ,rm 再加上 -rf , 后面是要删除的东西,node_modules ... 现在, 这个 node_modules 就让我们删除掉了。

想要下载项目所有的依赖的模块,可以执行一下 npm install ...

你会发现,被删除掉的 node_modules 目录又出现在了这里,它的下面,会有一个 gulp 模块,因为我们在 package.json 里面说明了一下,项目需要用到 gulp 模块,这样在执行 npm install 的时候,就会去把它安装到项目下面。

来自  https://ninghao.net/video/2003#info


4)创建任务 - gulpfile.js


要使用 gulp 去处理文件,需要在项目下面,去创建一个叫 gulpfile.js 的文件,在这个文件里,我们可以去添加要执行的任务。先用编辑器打开项目的目录,然后在项目的根目录下面,去创建这个 gulpfile.js ...

首先我们要去把需要的 gulp 模块包含进来,可以使用 require 这个方法,在这个方法里,指定一下要包含进来的模块,这里就是 gulp ,这个方法会返回一个对象,我们可以去给这个对象起个名字 ... 可以叫它 gulp ...

var gulp = require('gulp');

这样,我们就可以使用 gulp 对象的方法去做一些事情了。在这里要添加一个任务,用的是 task 这个方法。输入 gulp.task() ... 这里方法里面有两个参数,一个是要添加的这个任务的名字 ... 第二个参数就是这个任务要做的事情。 这个任务可以叫做 hello ... 然后再用一个匿名函数 ... 在这个函数里,用一个 console.log ... 在控制台上输出一点文字 ...

gulp.task('hello', function () {
console.log('您好');
});

现在, 我们就可以在命令行下面,去执行 gulp 的 hello 这个任务了 ... 保存一下 ... 回到命令行工具 ... 进入到项目所在的目录以后 ... 输入 gulp ,后面加上要执行的任务 ... hello ...

这里你会看到,输出了 您好,这两个字 ... 这就是 hello 这个任务要做的事儿。

在后面的视频里我们会继续去使用 task 这个方法去创建任务。另外,我们可以为项目去添加一些默认要执行的任务,回到编辑器 ... 另起一行再去创建一个任务。

gulp.task() ... 这个任务的名字是 default ,表示这是默认的任务,然后在第二个参数里面,去指定一下默认要执行的任务的列表 ... 这个参数是一个数组 ... 数组里的每个项目就是默认要执行的任务。 这里我们把在上面定义的 hello 这个任务添加到这里。

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

保存 ... 回到命令行 ... 这回我们可以直接输入 gulp .. 然后回车 ... 这样,gulp 会去执行所有在默认里面添加的任务。 因为我刚才添加了一个 hello 任务到这个默认的任务里面,所以,这里会显示 您好,这两个字。

来自  https://ninghao.net/video/2004


基础

5)gulp 基础


在这一章里我们来理解一下 gulp 的两个主要的功能,读取想要处理的文件,把处理好的文件放到指定的地方。 gulp 的 src 这个方法可以给我们找出想要处理的文件 ... 然后通过 .pipe 去处理这些找出来的文件 ... .pipe 可以理解成管道,每个管道里面,你可以指定它的功能,去处理文件 ... 最后,我们可以使用 gulp 的 dest 方法,把处理好的文件放到指定的地方 ...


来自  https://ninghao.net/video/2005#info

6)复制单个文件


我们先看一下怎么样用 gulp 去把一个文件复制到另一个地方,打开 gulpfile.js ... 在这里先去创建一个对象,你可以随便去命名它 ... 这时我叫它 gulp ,让它等于 require('gulp'); 这样这个 gulp 对象就拥有了 gulp 提供的所有属性还有方法了。

然后用 gulp 的 task 方法,去创建一个任务,这个任务要做的事就是把我们项目里的 index.html 这个文件,复制到一个叫 dist 的目录里面,这个 dist 目录表示的是 distribution .. 意思就是,正式发行的东西 ...

先给这个任务起个名字 ... 可以叫它 copy-index ... 再用一个匿名函数 ... 在这里,先用一个 return ... 大部分的 gulp 任务,首先要做的就是去读取要处理的文件 ... 读取文件用的是 src 这个方法 ... gulp.src ... 在这个方法里,指定一下要读取的文件 ... 这里就是 index.html ... 因为我们要把它复制到一个指定的地方 ...

找到要处理的文件以后,再用一个 pipe ... 你可以把这个 pipe 想像成是一个管道, 把文件读取进来,放到一个管道里,在这个管道里面,你可以使用 gulp 的插件去处理读取进来的文件 ... 因为这里我们只是简单的把文件放到一个指定的地方,所以不需要使用插件,可以使用 gulp 的 dest 这个方法 ... 在这个方法里,指定一下文件要存储到的那个位置 ...

这样我们就创建好了这个把单个文件复制到指定位置的任务,名字是 copy-index .. 下面,我们再到命令行工具上面去执行一下这个任务 ... 打开命令行工具 .. 这里我用的是终端工具,Windows 用户可以使用命令提示符,或者 powershell ...

先确定当前的位置是在项目的目录里面 ... 然后输入 gulp ... 后面加上任务的名字 ... copy-index ... 回车 ... 会出现一些提示,使用的 gulpfile 的位置 ,开始执行的任务 ... 还有任务结束所花的时间 ...

再看一下我们的项目 ... 你会发现,项目的目录里面,会多了一个 dist 目录 ... 在这个目录的下面,会有一个文件叫做 index.html ... 这就是我们在执行 copy-index 这个任务的时候,把项目根目录下的 index.html 复制过来的 ...

来自  https://ninghao.net/video/2006#info


7)复制多个文件

在我的项目里面,有一个 images 目录 ... 这里有三张图片 ... 01,02 都是 .jpg 格式的图片 ... 03 是一个 .png 格式的图片 .. 另外这个目录下面还有一个叫 icons 的目录,在这个目录的下面,还有几个小图标 ... 下面,我们去创建一个任务,把 images 目录里的文件复制到 dist 这个目录的下面 ...

打开项目的 gulpfile.js ... 先去创建一个任务 ... 用的是 gulp 的 task 方法 ... 先给任务起个名字... 这里我叫它 images ... 然后再用一个匿名函数 ... 在它里面,先用一个 return ... 然后再去读取要处理的文件 ... 用的是 gulp 的 src 方法 ... 指定一下要处理的文件 ... 输入 images/*.jpg ... 意思就是 images 这个目录里面的所有的 .jpg 格式的图片 .. 这个 * 号表示的就是任何东西 .. *.jpg 意思就是,不管图片的文件名是什么,只要它是 .jpg 格式的就行 ..

这个 src 方法里面指定的要读取的表示文件的东西,叫做 glob ... 我这里这个 glob 就是 images/*.jpg ..

后面接着再去处理这些文件,用一个 pipe ... 在这个管道里面,我们要做的就是把读取过来的这些文件复制到一个指定的位置 ... 用的是 gulp 的 dest 方法 ... 指定一下目标目录 ... 放到 dist 下面的 images 这个目录里面 ...

保存 ... 再去到命令行工具里执行一下这个任务 ... 输入 gulp images ... 回车 ...

完成以后,你会看到,在项目的 dist 这个目录里面,会创建一个叫 images 的目录 ... 在这个目录里面,有两张图片 ... 都是 .jpg 格式的图片 ... 它们都是从项目根目录下的 images 这个目录里面复制过来的 ...

在这个目录里面,这张 png 格式的图片,还有 icons 里面的小图标,并没有复制到 dist 下面的 images 目录里面 ... 因为我们写的 glob 只匹配 images 目录下的所有的 .jpg 格式的图片 ... 在下面的视频里我们再详细的介绍一下 glob 的写法。

来自  https://ninghao.net/video/2007#info

8)globs

如果你想把 images 目录下面的所有的图像文件都复制到 dist 下面的 images 目录里面,在这个 src 方法的 glob 里面,可以指定多个扩展名 .. 现在是 *.png ... 我们可以这样 ... *. 后面加上一组花括号 ... 在这个花括号里面,指定多个扩展名 ... png ... 逗号 jpg ... 注意逗号的后面不要使用空格 ...

'images/*.{png,jpg}'

这个 glob 表示的就是,直接在 images 目录下面的所有的 png 还有 jpg 格式的图像文件 ... 保存 ... 再去执行一下这个任务 .. 现在,这个 dist 下面的 images 里面的东西,就是直接在项目的 images 目录下面的所有的 jpg 还有 png 格式的文件 ..

在这里,我们也可以不去指定扩展名 ... 直接用一个星号 ... 

gulp.task('images',function(){

    return gulp.src('images/*/*').pipe(gulp.dest('dist/images'));

});

这样它会表示在 images 目录下面的所有的东西,也就是这里会把 images 目录下面的这个 icons 目录也包含进来,但是不会包含 icons 这个目录里面的东西 ...

如果你打算把 icons 里面的东西也包含进来,可以用一个 */ 表示一个级别的目录 ... 后面再加上一个 * 号,就表示,images 目录里面的所有的东西,包括 images 里面的二级目录里的所有的东西。

gulp.task('images',function(){

    return gulp.src('images/*/*').pipe(gulp.dest('dist/images'));

});


要是在 icons 下面还有一个级别的目录,你可以再加上一个 */,

gulp.task('images',function(){

    return gulp.src('images/*/*/*').pipe(gulp.dest('dist/images'));

});


或者你不在乎目录级别的话,可以使用两个 ** ,表示所有的东西 ...

gulp.task('images',function(){

    return gulp.src('images/**/*').pipe(gulp.dest('dist/images'));

});

或者

gulp.task('images',function(){

    return gulp.src('images/**').pipe(gulp.dest('dist/images'));

});

也可以 


保存 ... 再去执行一下这个任务 ... 这样会把项目里面的 images 这个目录里面的所有的东西,包含所有的子目录还有子目录里的文件,全部都复制到 dist 下面的 images 这个目录里面。

来自  https://ninghao.net/video/2008#info


9)多个 globs

有些任务你可能需要用到多个 glob,这样我们就可以用一个数组,数组里的每个项目表示的就是用来匹配文件的 glob ... 比如我们的项目里有两个目录,xml 还有 json ... 每个目录下面都有一些文件 ... 我们想创建一个任务,需要用到这两个目录里面的东西。在这个任务里,我们就可以使用多个 glob ...

先去创建一个任务 ... gulp.task ... 这个任务可以叫它 data ... 再用一个匿名函数 ... return ... gulp.src 去读取文件 ... 在这里,我们可以使用多个 glob ... 用一组方括号,表示一个数组 ... 这个数组里有两个项目,一个是表示 xml 目录里的文件的 glob ... 'xml/*.xml' ... 逗号分隔开 ... 另一个项目是表示 json 目录里面的所有文件的 glob .. 'json/*.json' ..

把这些文件复制到 dist 目录下面的 data 这个目录的下面 ... 保存 ... 然后再到命令行工具里面去执行这个任务 ... 输入 gulp data .. 回车 ...

回到项目 ... 在 dist 这个目录的下面,会有一个 data 目录 ... 在这个目录里面的文件就是项目的 xml 还有 json 目录下面的所有的文件 ...

来自 https://ninghao.net/video/2009#info


10)排除


我们把一些文件包含到要处理的文件列表里面,在这些文件里面,可能有些特定的文件,你不想包含进来,创建一个 glob 描述这些要排除掉的文件,在 glob 的前面,加上一个叹号就可以了。

比如在我的项目里面, json 这个目录的下面,有一些 secret 开头的文件,我不想把它们也复制到 dist 下面的 data 这个目录的里面。打开 gulpfile.js ... 在这个 data 任务里面 ... 我们用到了多个 glob ... 在这个数组里,可以再加上一个 glob ,描述一下要排除的文件 ...

用一个逗号分隔一下 ... 要排除的是 json 目录下面的 secret- 开头的文件 ... json/secret-*.json ... 在它的前面,再加上一个 ! 号,表示这是要排除掉的文件 ...

保存 .. 回到命令行再去执行一下这个任务 ...

打开项目 ... 在 dist 下面的 data 这个目录里面,会包含 xml 还有 json 目录下面的文件 ... 但是不包含 json 目录下面的所有的用 secret 开头的 json 文件 ... 因为我们排除掉了这些文件。

来自 https://ninghao.net/video/2010#info


11)主任务


在创建 gulp 任务的时候,我们可以去给任务指定它依赖的其它的任务。比如,这里我们创建了三个任务,index,images,data ... 我们想再创建一个叫 build 的任务 ... 这个任务依赖这里的这三个任务 ...

输入 gulp.task ,使用 gulp 的 task 这个方法去创建任务 ... 同样先给这个任务起个名字 ... 叫做 build .. 再把这个方法的第二个参数设置成一个数组 ... 这个数组里的项目就是这个任务所依赖的任务 ... 输入一组方括号 .. 再把它需要的三个任务,作为这个数组的三个项目 ...

我们可以继续去设计这个任务要作的事情,用一个匿名函数 ... 可以让它在控制台上输出点文字 ... 这样在执行 build 任务的时候,会先去执行它依赖的三个任务,最后再执行它本身要做的任务。

保存 ... 打开命令行工具 ... 输入 gulp build ... 回车 ...

注意这里会同时去执行 build 需要的三个任务,并不是先执行一个,等待完成以后再去执行一个,这些依赖的任务是同时执行的 ... 等它们都完成以后,才会执行 build 本身要做的任务,这里就是在控制台上,输出 编译成功 这几个字儿。

来自  https://ninghao.net/video/2011#info


12)文件有变化时自动执行任务


使用 gulp 的 watch 这个方法,我们可以去监视一些文件,当这些文件发生变化的时候,立即去执行一些指定的任务。先打开 gulpfile.js ... 再去创建一个任务 ... gulp.task ... 这个任务可以叫做 watch ... 再用一个匿名函数 ... 在它里面,再用 gulp 的 watch 方法去做点事情。

输入 gulp.watch() ... 先指定一下要监视的文件 ... 比如去监视 index.html 这个文件 ... 逗号分隔一下 ... 再把要执行的任务列表放到这里 ... 这个任务列表要放到一个数组里,所以先输入一组方括号 .. 要执行的任务是 copy-index ...

它的意思就是,我们在执行 watch 任务的时候,去监视 index.html 这个文件的变化,当这个文件发生变化以后,就去自动执行 copy-index 这个任务。

下面,我们再用类似的方法,去添加两个 watch ...

保存 ... 回到命令行工具 ... 先去执行一下刚才创建的 watch 这个任务 ... gulp watch ... 这样 gulp 就会去监视文件的变化了 ... 你会看到这个任务并没有立即结束 ... 它会一直运行 ... 直到我们手工退出这个任务 ... 退出可以按一上 ctrl + C ...

再回到项目 .. 打开 index.html 这个文件 ... 随便修改一个地方 ... 然后保存一下 ... 回到命令行 ... 你会看到 gulp 执行了 copy-index 这个任务,因为 index.html 这个文件发生了变化 ...

每次保存被监视的文件,都会去执行指定的任务列表。回到项目,打开 dist 下面的 index.html .. 你会看到修改之后的 index.html 已经被复制到了这个目录的下面 ...

来自  https://ninghao.net/video/2012#info


插件

13)插件


Gulp 提供了一个很好的接口,但是它本身并不会做太多的事情。除了可以读取文件,可以监视文件的变化 ,可以把文件放到指定的位置 ...

我们可以使用插件来扩展 Gulp 的功能 ... 这些插件可以去执行特定的任务 .. 比如你可以去编译 Sass 或者 Less 文件 .. 可以把几个文件合并以一块儿,压缩,然后再重命名一下 ... 你可以优化图像的尺寸, 还可以创建一个本地开发的服务器,当指定的文件发生变化以后,可以自动去刷新浏览器查看文件的变化 ...

在这个地址,你可以查看 gulp 可用的插件 ... 根据自己的需求,去搜索相应的关键词 ... 你应该会找到合适的插件来解决你遇到的问题 ...

http://gulpjs.com/plugins/

使用这些插件的方法都比较类似 ... 先在项目里使用 npm 去安装插件 ... 然后在 gulpfile.js 文件的顶部,把插件包含进来,并且给它起个名字 ... 这样我们就可以在创建的任务里面,去使用这些插件来处理文件了。

来自  https://ninghao.net/video/2013#info


14)编译 Sass:gulp-sass


想要使用 Gulp 去把 Sass 编译成 CSS ,我们可以使用 gulp sass 这个插件。先在我们的项目里去安装一下这个插件,打开命令行工具,进入到项目所在的目录。然后输入 npm install gulp-sass ... 可以把这个 gulp-sass 放到项目的开发依赖里面,加上一个 --save-dev ..

sudo npm install gulp-sass --save-dev

完成以后,回到项目 ... 在 node_modules 这里,你会看到刚才安装的 gulp-sass 插件 ... 另外,在项目的 package.json 这个文件里面, devDependencies 这里,也会有这个 gulp-sass ...

在我的项目里面,stylesheets 这个目录的下面,有一个 sass 文件,就是这个 style.scss ... 下面,我们可以使用 gulp-sass 这个插件,把这个目录里面的 sass 文件编译成 css ,再放到 dist 目录下面的 css 这个目录的下面。

打开 gulpfile.js ... 在这个文件里面,我们首先要把 gulp-sass 这个插件包含进来 ... var sass 等于 ... require ... 再指定一下这个插件的名字 ... gulp-sass .. 这样我们就可以使用 sass 这个方法去处理文件了 ...

在下面,再去创建一个任务 ... gulp.task ... 这个任务可以叫它 sass ... 再用一个匿名函数 ... return gulp.src ... 先去指定要处理的文件 ... 这里就是 stylesheets 这个目录里面的所有的 scss 格式的文件 ... 注意这里我用了一个 **/ 它会包含目录下面的所有级别的子目录 ..

接着用一个 pipe .. 在这个管道里,我们可以使用 sass 插件去处理读取进来的文件 ... 这里输入 sass() ... 这个名字是我们在上面包含 gulp-sass 这个插件的时候起的 ... 如果你用的是其它的名字,在这里,你也需要修改成对应的名字 ..

再用一个 pipe ,我们去输出处理好的文件 ... 也就是编译好的 sass ... 这里使用 gulp 的 dest 方法 ... 在这个方法里指定一下存储这些处理好的文件的路径 ... 放到 dist 目录下面的 css 这个目录里面。

保存 ... 打开命令行工具 ... 去执行一下这个任务 ... 输入 gulp sass ... 回车 ... 完成以后再回到项目 .. 打开 dist 下面的 css 这个目录 ... 在这里,你会看到编译好的 sass ... 就是这个 style.css ...

来自 https://ninghao.net/video/2014


15)编译 Less:gulp-less


在上一个视频里,我们用 gulp-sass 插件,把 sass 文件编译成了 css。如果你想把 less 编译成 css ,可以使用 gulp-less 这个插件 ... 先去安装这个插件,打开命令行 .. 输入 sudo npm install gulp-less ... 再加上一个 --save-dev ...

sudo npm install gulp-less --save-dev

完成以后回到项目 ... 打开 stylesheets 这个目录,在这里我们去创建一个 less 文件 ... 可以把这个 sass 文件重命名一下 ... 修改一下文件的扩展名 ... 改成 .less ... 然后用 Less 的语法去改造一下这个文件 ... less 里面,定义变量用的是 @ 这个符号 ... less 里同样有 lighten 这个函数,用法也是一样的 .. . 不过这里我们得改一下变量的形式 ... 把 $ 换成 @ .. 保存 ...

再打开 gulpfile.js ... 先把 gulp-less 这个插件包含进来 ... 修改一下 .. 再改一下这里的这个名字 ... 把 sass 换成 less ... 把 Less 编译成 CSS 跟把 Sass 编译成 css 这个任务是差不多的,只不过我们需要使用不同的插件。先改一下任务的名字 ... sass 换成 less ... 要读取进来的文件是 stylesheets 目录下面的所有的 less 文件 ... *.scss 改成 *.less ...

然后用 gulp-less 这个插件去处理这些文件 ... sass 换成 less ... 保存 ... 回到命令行 ... 执行一下 less 这个任务 ... 输入 gulp less ..

成功以后,回到项目 ... 打开 dist ... css 这个目录 ... 在这里你可以找到编译好的 less ... style.css ...

https://www.npmjs.org/package/gulp-less

来自  https://ninghao.net/video/2015#info

16)创建本地服务器:gulp-connect


在做前端开发的时候,可能也需要把项目放到本地的服务器上去运行。gulp-connect 这个插件可以很容易创建一个本地的服务器去运行我们的项目。

先去安装一下这个插件。打开命令行工具 .. 输入 sudo npm install gulp-connect ... 加上一个 --save-dev,把这个插件放到开发依赖里面。

完成以后回到项目 ... 打开 gulpfile.js ... 先在文件的顶部这里,去包含一下这个 gulp-connect 插件 ... 给它起个名字 .. 可以叫它 connect ...

var connect = require('gulp-connect');

下面,我们可以去创建一个本地服务器,去运行项目的 dist 目录下面的静态文件 ... 先创建一个任务 .. 用 gulp 的 task .. 这个任务叫它 server .. 再用一个匿名函数 ... 在这个函数里面,可以使用 connect 的 server 这个方法去创建这个服务器 ...

gulp.task('server', function () {
connect.server();
});

在这个方法里面,可以去做一些设置,比如服务器的主机名,端口号,服务器的根目录等等 .. 给它一个对象 .. 然后设置一下 root 这个选项 ... 它的值就是服务器的根目录 ... 这里我们设置成 dist 这个目录 ..

connect.server({root: 'dist'});

保存 ... 打开命令行工具 ... 去执行一下这个任务 .. 输入 gulp server ... 这里会提示 Server startedhttp://localhost:8080 ... 这个 localhost:8080 就是服务器的地址 ... 默认的端口号是 8080 ,你也可以通过 port 这个选项自己去指定这个端口号, ...

下面可以打开一个浏览器 ... 输入 localhost:8080 .. 回车 .. 这里显示的就是服务器根目录下面的 dist 目录下面的静态文件 ...


来自 https://ninghao.net/video/2016


17)实时预览


当某些文件发生变化以后,可以实时的去刷新一下浏览器,这样我们就不需要每次修改文件以后,再去手工刷新浏览器查看变化了。

打开 gulpfile.js ... 找到创建服务器的这个任务 .. 在这里,可以先把 server 方法里面的 livereload 这个选项的值设置成 true .. 意思就是启用实时刷新的功能。

connect.server({root: 'dist', livereload: true});

然后,我们可以配置一下,当什么样的文件发生变化的时候,去自动刷新浏览器 .. 比如我们想让浏览器在 index.html 这个文件发生变化以后,去刷新一下 ...

在这个 copy-index 任务里面,把文件复制到目的地以后,再执行一下刷新 ... 在后面加上一个 .pipe 管道 .. 这个管道干的事就是去刷新浏览器 ... 可以使用 connect 的 reload 这个方法 ..

gulp.task('copy-index', function () {
return gulp.src('index.html')
.pipe(gulp.dest('dist'))
.pipe(connect.reload());
});

因为在下面的 watch 这个任务里面,我们已经监视了 index.html 这个文件的变化,一旦发生变化,就去执行 copy-index 这个任务,这个任务现在要做的事就是去把 index.html 复制到 dist 这个目录的下面,然后再刷新一下浏览器 ..

最后我们可以再去创建一个默认的任务 ... 输入 gulp.task ... 任务的名字是 default ... 这个任务依赖 server ... 还有 watch 这两个任务 ...

gulp.task('default', ['server', 'watch']);

保存 ... 打开命令行工具 .. 先停止一下服务器 ... ctrl + C ... 然后再执行 gulp ... 这样会起动服务器,并且开始监视文件的变化 ..

打开浏览器,刷新一下 ... 再回到项目 ... 打开根目录下面的 index.html ... 这里我们可以修改一下这个文件 ... 然后保存一下 ... 你会发现,在浏览器上,会实时的显示出文件的变化 ...

来自  https://ninghao.net/video/2017#info


18)合并文件:gulp-concat


使用 gulp-concat 这个插件,我们可以把几个文件合并到一块儿。先去安装一下这个插件 ... 打开命令行工具 ... 输入 sudo npm install gulp-concat --save-dev ...

完成以后再回到我们的项目 ... 在 javascripts 这个目录的下面,有两个 js 文件, jquery.js 还有 modernizr.js ... 我们可以使用 gulp-concat 这个插件,把这两个 js 文件合并到一块儿,然后放到 dist 目录下面的 js 这个目录的里面。

打开 gulpfile.js ... 先在文件的顶部,把 gulp-concat 这个插件包含进来 ...

var concat = require('gulp-concat');

然后再创建一个任务 ... 用 gulp 的 task 方法 ... 任务的名字可以叫它 scripts .. 再用一个匿名函数去设计一下这个任务要干的事儿 ... 先用 gulp 的 src 方法,去读取要处理的文件 ... 这里我们找出 javasciprts 目录下面的两个 js 文件 ...

先给这个方法一个数组 ... 然后指定一下 jquery 的位置 .. 逗号分隔一下 ... 再找到 modernizr 的位置 ... 再用一个 .pipe 管道 ... 在这个管道里面,可以使用 concat 去把读取过来的文件合并到一块儿 ... 在这个 concat 里面,可以指定一下合并以后,这个文件的名字 ... 我们叫它 vendor.js ..

接着再用一个 .pipe 去把合并好的文件放到一个指定的位置上 ... 用 gulp 的 dest ... 放在 dist 目录下面的 js 这个目录里面。

gulp.task('scripts', function () {
return gulp.src('javascripts/**/*.js')
.pipe(concat('vendor.js'))
.pipe(gulp.dest('dist/js'));
});

保存 ... 找到命令行工具,去执行一下这个任务 ... 输入 gulp scripts ... 完成以后,再回到项目 .. 打开 dist .. js 这个目录,这个目录下面的 vendor.js 就是合并好的文件 ...

https://www.npmjs.org/package/gulp-concat

来自  https://ninghao.net/video/2018


19)最小化 js 文件:gulp-uglify


把几个 js 文件合并到一块儿,接下来我们可以再去压缩一下这个 js 文件 ... 或者叫最小化 js 文件,这个动作英文是 minify ... 完成这个任务可以使用 gulp-uglify 这个插件 ... 先打开命令行工具,去为项目安装这个插件 ... sudo npm install gulp-uglify ... 再把它放到 package.json 文件的开发依赖里在 .. 加上一个 --save-dev ...

sudo npm install gulp-uglify --save-dev

完成以后回到项目 ... 先在文件的顶部去包含这个插件 ... 起个名字叫做 uglify ...

var uglify = require('gulp-uglify');

下面我们用这个插件提供的功能去压缩一下合并之后的这个 js 文件 ... 这里我们不需要去创建新的任务,可以直接在这个 scripts 任务里面,加上一个 .pipe 管道 ... 放到 concat 之后 ... 在这个管道里面,使用 uglify 去压缩一下传过来的文件 ...

gulp.task('scripts', function () {
return gulp.src(['javascripts/jquery.js', 'javascripts/modernizr.js'])
.pipe(concat('vendor.js'))
.pipe(uglify())
.pipe(gulp.dest('dist/js'));
});

保存,回到命令行工具 ... 去执行一下这个 scripts 任务 ... 输入 gulp scripts ... 完成以后,再回到项目 ... 打开 dist ... js ... vendor.js ... 你会发现这个文件就是经过最小化处理之后的 js 文件 ...

https://www.npmjs.org/package/gulp-uglify

来自  https://ninghao.net/video/2019#info


20)重命名文件:gulp-rename


在把处理好的文件存放到指定的位置之前,我们可以先去重新命名一下它。可以使用 gulp-rename 这个插件。先去安装一下 ... sudo npm install gulp-rename --save-dev ..

然后回到项目 ... 打开 gulpfile.js .. 在文件的顶部,去包含一下这个插件 ... 可以叫它 rename ...

var rename = require('gulp-rename');

在这个 scripts 任务里面,我们先把 js 文件使用 concat 插件合并到了一块,又用 uglify 压缩了一下,最后再输出到 dist 下面的 js 这个目录里面。这里我们可以让 scripts 这个任务,在合并文件以后,输出合并之后的文件,然后再压缩一下,再用 gulp-rename 插件去重命名一下压缩以后的文件,再把压缩之后的文件输出到 dist 下面的 js 目录里面。

在 concat 这个管道的下面,再添加一下管道,去输出这个合并以后的文件 ...

然后在 uglify 压缩的管道的下面,添加一个新的 .pipe 管道,在这个管道里面,我们可以使用 rename 去重新命名一下文件 ... 这个压缩之后的文件可以命名为 vendor.min.js ...

保存 ... 回到命令行工具,再去执行一下 scripts 这个任务 .. 输入 gulp scripts ... 完成以后,回到项目 .. 打开 dist ... js ... 你会发现这个目录的下面有两个 js 文件 ... vendor.js .. 是合并以后的 js 文件 ... vendor.min.js 是合并,压缩,然后重命名的 js 文件。

https://www.npmjs.org/package/gulp-rename

来自 https://ninghao.net/video/2020#info


21)最小化 css 文件:gulp-minify-css


之前我们介绍过压缩 js 文件用的是 gulp-uglify 插件,想去最小化 css 文件,可以使用 gulp-minify-css .. 先去安装一下它 .. 打开命令行 ... 输入 sudo npm install gulp-minify-css --save-dev ... 完成以后回到项目 ...

打开 gulpfile.js ... 在文件的顶部去包含这个插件 ... 起个名字 .. 叫做 minifyCSS ...

var minifyCSS = require('gulp-minify-css');

在之前我们创建过一个编译 less 的任务 ... 在这个任务里面,我们可以用一下这个压缩 css 的插件 ... 在编译 less 这个管道的下面,再去添加一个管道 .. 在这个管道里面,可以使用 minifyCSS 去处理文件 ...

如果你愿意,也可以先把编译好的没有经过压缩的 css 输出到指定的地方,然后再把压缩好的 css 重命名一下,再输出到一个指定的地方。 先保存一下 ...

我们可以再看一下要编译的 less 文件 ... 在 stylesheets 这个目录的下面,有一个 less 文件 ... 注意这个文件里面,用到了注释 ...

回到命令行工具 .. 去执行一下 less 这个任务 .. gulp less ... 完成以后,回到项目 ... 打开 dist ... css 这个目录里面的 style.css ...

这个文件就是编译以后并且经过压缩的 css ... 在这里,你看不到注释的内容 ... 并且去掉了多余的空白 ...

https://www.npmjs.org/package/gulp-minify-css

来自 https://ninghao.net/video/2021


22)最小化图像:gulp-imagemin


gulp-imagemin,可以给我们去优化图像文件的尺寸,在保证不改变图像质量的情况下,让图像文件的体积变得更小一点。先去安装一下这个插件 ... 打开命令行工具 ... 输入 sudo npm install gulp-imagemin --save-dev ... 按下回车 ...

完成以后,回到项目 ... 打开 gulpfile.js ... 先在文件顶部去包含这个插件 ... 可以叫它 imagemin ...

var imagemin = require('gulp-imagemin');

之前我们创建过一个叫 images  (copy-images) 的任务 .. 在这个任务里面,我们可以使用这个插件去优化一下图像的尺寸 ... 添加一个 .pipe ... 在这个管道里边,使用 imagamin() ...

gulp.task('copy-images', function () {
return gulp.src('images/**')
.pipe(imagemin())
.pipe(gulp.dest('dist/images'))
});

这个插件还有很多配置的选项,你可以参考项目的页面 (https://www.npmjs.org/package/gulp-imagemin)

 ... 这里我们先用插件默认的选项 .. 保存 ... 再去执行一下这个任务 .. 打开命令行 .. 输入 gulp copy-images ... 回车 ...

这里会显示出, imagemin 优化的图像的数量 ... 还有节省的空间跟比例是多少 ... imagemin 给我的项目优化了 6 个图像文件,节省了 169KB 的空间 ... 节省的空间占所有图像文件尺寸的 11.3% ...

https://www.npmjs.org/package/gulp-imagemin

来自  https://ninghao.net/video/2022#info




普通分类: