简单易懂的gulp入门配置

写在前面:这篇文章 基于gulp3版本写的。如果是gulp4版本运行下面一些指令可能会报错,个别已给出 gulp4版本的解决方案,但是自动刷新的功能找不到gulp4的解决方案,所以仍然提供的是gulp3版本方案。

安装Gulp

安装Gulp之前你需要先安装Node.js。

安装完Node.js,使用Terminal(终端,win下是cmd)用下面命令安装Gulp

sudo npm install gulp -g

-g 表示全局安装,这样你在电脑上任何位置都能只用gulp 命令。

npm install 是指定从Node Package Manager安装的命令。

只有mac用户才需要sudo命令,Mac 用户需要管理员权限才能全局安装,所以需要sudo。

接下来使用Gulp创建项目。

创建Gulp项目

首先,我们新建一个project文件夹,然后进到目录下执行 npm init 命令:

npm init

npm init命令会为你创建一个package.json文件,这个文件保存着这个项目相关信息。比如你用到的各种依赖(这里主要是插件)(终端会自动出现下面内容,这里先随便填就行)

package.json.png

创建完之后,我们执行下面的命令:

npm install gulp--save-dev

这一次,我们局部安装Gulp。使用—save-dev,将通知计算机在package.json中添加gulp依赖。

package.json添加了gulp.png

在正式开始之前,我们再来明确下项目的目录结构。

目录结构

Gulp非常之灵活,理解它的内部工作,你就能在项目中得心应手。

这篇文章,我们使用通用的webapp目录结构:

项目目录.png

在这个结构中,我们使用app文件夹作为开发目录(所有的源文件都放在这下面),dist文件夹用来存放生产环境下的内容。

这些文件名,你想怎么起都行,但请务必记住你的目录结构。现在我们来创建gulpfile.js。

第一个Gulp任务

你需要先在根目录下创建一个gulpfile.js文件。

// gulpfile.js 文件引入

var gulp = require('gulp');

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

简单的任务如下所示:

写个Hello World,是这样的:

gulp.task('hello',function() {
     console.log('Hello World!');
});

命令行中执行 gulp hello,发现编译过程如下图所示,说明这个任务已经跑起来了。

gulp hello.png

但是如果编译如下图,说明出错了,可能是gulp的版本问题。

gulp hello2.png

可以改成这样就没问题了:

gulp.task('hello', async() => {
     await console.log('Hello World!');
});

Gulp任务通常都会比这难一丁点,就一丁点。通常会包含两个特定的Gulp方法和一些列Gulp插件。

大概这样:

gulp.task('task-name',function() {
     return gulp.src('source-files')
                .pipe(aGulpPlugin())
                .pipe(gulp.dest('destination'))
})

正如你所见,两个Gulp方法,src,dest,一进一出。下面用编译Sass来举栗子。

Gulp执行预处理

我们使用gulp-sass插件来编译Sass。安装插件的步骤是这样的:

使用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')   //这里是传入的需要gulp的源文件
                  .pipe(sass()) // 这里是前面require进来的gulp-sass插件
                  .pipe(gulp.dest('destination'))  //这里是输出的目标文件

});

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

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

gulp.task('sass',function(){
       return gulp.src('app/scss/styles.scss')
                  .pipe(sass())
                  .pipe(gulp.dest('app/css'))
});

然后在styles.scss 写一些样式代码:

styles.scss.png

命令行执行gulp sass,你将看到app/css/styles.css文件下会有下面的代码:

styles.css.png

styles.css是gulp自动为我们生成的。
使用Sass就这么简单。但是通常我们不止有一个scss文件。这时候可以使用Node通配符

Node中的通配符

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

使用通配符,计算机检查文件名和路径进行匹配。

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

*.scss : * 号匹配当前目录任意文件,所以这里 *.scss 匹配当前目录下所有scss文件

*/.scss :匹配当前目录及其子目录下的所有scss文件。

!not-me.scss :!号移除匹配的文件,这里将移除not-me.scss

*.+(scss|sass) :+号后面会跟着圆括号,里面的元素用|分割,匹配多个选项。这里将匹配scss和sass文件。

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

gulp.task('sass',function() {
         return gulp.src('app/scss/**/*.scss')
                    .pipe(sass())
                    .pipe(gulp.dest('app/css'))

})

我们这会再在scss文件夹下新建一个style2.scss文件。

style2.scss.png

命令行执行gulp sass。然后再看app/css目录下,现在已经有两个文件了,分别是:style.css 和 style2.css。

style2.css.png

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

监听Sass文件

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

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

将上面的栗子再改下:

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

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

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

执行gulp watch命令。

gulp watch.png

如果是gulp4 版本的会报错如下:

gulp watch error.png

['sass']是Gulp3的方式指定依赖任务,在Gulp4中使用gulp.series和gulp.parallel。

改成这样就好:

gulp.task('watch', function(){
      gulp.watch('app/scss/**/*.scss', gulp.series('sass'));
      // Other watchers
});

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

gulp-for-beginner-watch-compile.gif

还不够,修改完直接帮我刷新浏览器行吗。

使用Browser Sync自动刷新

Browser Sync 帮助我们搭建简单的本地服务器并能实时刷新浏览器

新插件?记住!安装,引入,使用。

npm install browser-sync--save-dev

引入:

var browserSync =require('browser-sync');

我们创建一个broswerSync任务,我们需要告知它,根目录在哪里。

gulp.task('browserSync', function() {
    browserSync({
        server: {
            baseDir:'app'
        },
    })
})

我们稍微修改一下之前的代码,让每次css文件更改都刷新一下浏览器:

gulp.task('sass',function() {
    return gulp.src('app/scss/**/*.scss') // Gets all files ending with .scssin app/scss
        .pipe(sass())
        .pipe(gulp.dest('app/css'))
        .pipe(browserSync.reload({
            stream:true
    }))
});

然后改一下watch任务如下:

gulp.task('watch', gulp.series('sass', 'browserSync', function(){
      gulp.watch('app/scss/**/*.scss', gulp.series('sass'));
      // Other watchers
}));

执行 gulp watch:

gulp watch.png

!!!但是改动文件之后,并没有实时刷新,终端也没有监听得到。找了很久没有找到方法解决,我最后把gulp的版本降回了3.9。

cnpm install gulp@3.9.1

然后改了gulpfile.js 文件的watch任务写法如下:

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

再执行gulp wacth 此时发现 再改动scss文件。终端立马监听得到并且浏览器页面也自动刷新了。真是折腾啊!!!

不止是scss修改的时候需要刷新浏览器吧?再改改:

gulp.task('watch', ['browserSync', 'sass'], function (){
        gulp.watch('app/scss/**/*.scss', ['sass']);
        gulp.watch('app/*.html', browserSync.reload);
        gulp.watch('app/js/**/*.js', browserSync.reload);
});

现在不论是改动scss,还是html,还是js都能自动刷新了。

gulp watch.png

gulp-for-beginner-bs-change-bg.gif

附上gulpfile.js 的代码:

var gulp = require('gulp');
var sass = require('gulp-sass');
var browserSync = require('browser-sync');

gulp.task('hello', async() => {
   await console.log('Hello World!');
});

//编译Sass
gulp.task('sass', function() {
  return gulp.src('app/scss/**/*.scss') // Gets all files ending with .scss in app/scss
    .pipe(sass())
    .pipe(gulp.dest('app/css'))
    .pipe(browserSync.reload({
      stream: true
    }))
});

gulp.task('browserSync', function() {
  browserSync({
    server: {
      baseDir: 'app'
    },
  })
});

//监听
gulp.task('watch', ['browserSync', 'sass'], function (){
     gulp.watch('app/scss/**/*.scss', ['sass']);
   gulp.watch('app/*.html', browserSync.reload);
    gulp.watch('app/js/**/*.js', browserSync.reload);
});

今天参考网上的文章学习了gulp,一边记录下来。希望能加深记忆的同时帮到需要的人。

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

推荐阅读更多精彩内容

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