用gulp自动化构建项目

Gulp 是一个自动化工具,前端开发者可以使用它来处理常见任务:

  • 搭建web服务器
  • 文件保存时自动重载浏览器
  • 使用预处理器如Sass、LESS
  • 优化资源,比如压缩CSS、JavaScript、压缩图片

安装

Gulp官网 有详细的安装教程,我以前也有篇文章介绍如何安装gulp的,本篇文章就不写了。

初始化项目

在项目文件夹下打开终端执行npm init命令

npm init

npm init命令会为你创建一个package.json文件,这个文件保存着这个项目相关信息。比如你用到的各种依赖(这里主要是插件)
一路回车就可以了

本地安装gulp

npm install gulp --save-dev

使用–save-dev,将通知计算机在package.json中添加gulp依赖。

创建gulp任务

先在根目录下创建gulpfile.js文件

/*gulpfile.js*/
var gulp = require('gulp');

这行命令告知Node去node_modules中查找gulp包,先局部查找,找不到就去全局环境中查找。
找到之后就会赋值给gulp变量,然后就可以使用它了。

最简单的demo

gulp.task('task-name', function() {
  console.log('hello,world!');
});

然后在命令行中执行gulp hello

就会输出“Hello World!”

利用gulp编译sass

sass最终输出的样式包括下面几种样式风格:
嵌套输出方式 nested
展开输出方式 expanded
紧凑输出方式 compact
压缩输出方式 compressed

  • 使用npm install 命令安装

    npm install gulp-sass --save-dev
    
  • 在gulpfile中引入插件,用变量保存

    var gulp = require('gulp');
    var sass = require('gulp-sass');
    
  • 在任务中使用

    gulp.task('sass', function(){
      return gulp.src('source-files')//源文件路径
        .pipe(sass({outputStyle: 'compact'})) // 使用 gulp-sass 插件
        .pipe(gulp.dest('destination'))//输出路径
    });
    

我们需要给sass任务提供源文件和输出位置。所以我们先在项目中创建app/scss文件夹,里面有个styles.scss文件。
这个文件将在gulp.src中用到。

sass处理之后,我们希望它生成css文件并产出到css目录下,可以这样写:

gulp.task('sass', function(){
  return gulp.src('scss/styles.scss')
    .pipe(sass()) // Converts Sass to CSS with gulp-sass
    .pipe(gulp.dest('css'))
});

然后在命令行中运行gulp sass

通常我们不止有一个scss文件,这时候可以使用Node通配符。

Node中的通配符

通配符是一种匹配模式,允许你匹配到多个文件。不止是Node,很多平台都有,有点像正则表达式。

大部分时候,我们只需要用到下面4种匹配模式:

  1. *.scss*号匹配当前目录任意文件,所以这里*.scss匹配当前目录下所有scss文件
  2. **/*.scss:匹配当前目录及其子目录下的所有scss文件。
  3. !not-me.scss:!号移除匹配的文件,这里将移除not-me.scss
  4. *.+(scss|sass):+号后面会跟着圆括号,里面的元素用|分割,匹配多个选项。这里将匹配scss和sass文件。

那么还是上面的栗子,改造一下:

gulp.task('sass', function() {
  return gulp.src('scss/**/*.scss') // 匹配在scss和它的子目录下的所有后缀为.scss的文件
    .pipe(sass())
    .pipe(gulp.dest('css'))
})

任何app下的scss文件,在执行命令之后将生成对应的css文件存放到相应路径。

现在我们能处理多个文件了,但是不想每次都要执行命令,怎么办?
Gulp就是为懒人而生的,我们可以使用watch命令,自动检测并执行。

监听文件

Gulp提供watch方法给我们,语法如下:

// Gulp watch syntax
gulp.watch('files-to-watch', ['tasks', 'to', 'run']);

将上面的栗子再改下:

// Gulp watch syntax
gulp.watch('scss/**/*.scss', ['sass']);

通常我们监听的还不只是一个文件,把它变成一个任务:

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

在命令行执行gulp watch命令。

有了监听,每次修改文件,Gulp都将自动为我们执行任务。

优化css和JavaScript文件

说到优化的时候,我们需要想到:压缩,拼接。也就是减少体积和HTTP次数。
开发者面临的主要问题是很难按照正确的顺序合并文件。

<body> 
    <!-- other stuff -->
    <script src="js/lib/a-library.js"></script>
    <script src="js/lib/another-library.js"></script>
    <script src="js/main.js"></script>
</body>

gulp-useref

gulp-useref会将多个文件拼接成单一文件,并输出到相应目录。

安装

npm install gulp-useref --save-dev`

引用

var useref = require('gulp-useref');`

使用

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

  return gulp.src('*.html')
        .pipe(useref())
        .pipe(gulp.dest('dist'));//这里将dist设为生产目录
});

执行useref命令,Gulp将合并三个script标签成一个文件,并保存到dist/js/main.min.js。

gulp-uglify

合并完之后,我们再来压缩。使用gulp-uglify插件。

安装

npm install gulp-uglify --save-dev

引用

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

使用

gulp.task('useref', function(){
  return gulp.src('*.html')
    .pipe(uglify())
    .pipe(useref())
    .pipe(gulp.dest('dist'))
});

执行useref命令,Gulp将合并三个script标签成一个文件,并保存到dist/js/main.min.js。

注意:执行完useref后,html中的script路径将只剩下main.min.js。

gulp-minify-css

gulp-useref同样可以用在css上。除了压缩,需要区分,其它内容同js一样。所以我们使用gulp-if来做不同处理。
使用gulp-minify-css压缩css。

安装

`$ npm install gulp-if gulp-minify-css --save-dev`

使用

var gulpIf = require('gulp-if');var minifyCSS = require('gulp-minify-css');gulp.task('useref', function(){  return gulp.src('app/*.html')    
// Minifies only if it's a CSS file  
    .pipe(gulpIf('*.css', minifyCSS()))    // Uglifies only if it's a Javascript file    
    .pipe(gulpIf('*.js', uglify())) 
    .pipe(useref())    
    .pipe(gulp.dest('dist'))
 });`

在项目中应用

规范目录结构

|- build/   --开发目录
    |- css/
    |- images/
    |- js/
    |- sass/
    |- index.html

|- dist     --发布目录
    |- css/
    |- images/
    |- js/
    |- index.html

|- gulpfile.js
|- node_modules/
|- package.json

上面是我自己习惯用的项目目录结构

gulpfile.js

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

gulp.task('watch', async ()=>{
    gulp.watch('./**/*', async()=>{        
        /*编译sass文件*/
        gulp.src('app/sass/**/*.scss')
        .pipe(sass({outputStyle: 'expanded'})) //展开输出方式
        .pipe(gulp.dest('app/css')) //输出到开发文件夹
        .pipe(sass({outputStyle: 'compressed'})) //压缩输出方式   
        .pipe(gulp.dest('dist/css')) //输出到发布文件夹          
        /*压缩js文件*/
        .pipe(uglify())     
        .pipe(gulp.dest('dist'))//将压缩后的js文件同步到发布文件夹     
        /*监控image文件,同步到发布文件夹*/
        gulp.src('app/images/*')
        .pipe(gulp.dest('dist/images'))       
        /*监控js文件,压缩后的文件输出到发布文件夹*/
        gulp.src('app/**/*.js')
        .pipe(gulp.dest('dist/js'))       
        /*监控css文件,同步到发布文件夹*/
        gulp.src('app/**/*.css')
        .pipe(gulp.dest('dist/css'))    
        /*监控开发文件夹下的所有html文件,同步到发布文件夹*/
        gulp.src('app/**/*.html')
        .pipe(gulp.dest('dist'))       
        /*将发布文件夹下所有文件部署到服务器*/
        gulp.src("dist/**/*")
        .pipe(gulp.dest("D:\\phpStudy\\WWW\\xiaoguantea"));
    });
});

我自己的项目目前只用过gulp-sassgulp-uglify来编译scss文件和压缩js文件,刚接触gulp,边看官网文档一边参考别人博客的教程,难免有错误和不足之处,如果有发现哪里有问题可以私信我哟!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,433评论 1 32
  • 原文地址:https://css-tricks.com/gulp-for-beginners/原文代码:https...
    小雨雪smile阅读 1,471评论 0 2
  • 安装Gulp首先需要安装Node.js,并在控制台输入$ npm install gulp -gMac端需要写成$...
    LaBaby_阅读 910评论 0 1
  • Sass&Gulp 一、sass介绍 (一) SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计...
    锋享前端阅读 1,494评论 0 3
  • 原文标题:Gulp for Beginners作者: Zell Liew翻译:治电小白菜原文地址:https://...
    ZZES_ZCDC阅读 1,574评论 6 18