gulp的初级入门配置

1.简介

前端的自动化构建工具,目前用的比较多的大概有webpack, grunt, gulp。

gulp,用自动化构建工具增强你的工作流程;

官方介绍gulp将开发流程中让人痛苦或耗时的任务自动化,从而减少你所浪费的时间、创造更大价值。简而言之,是一个自动化构建工具,主要用来设定程序自动处理静态资源的工作。他的特点就是简单,高效。这篇文章呢,主要是创建一个简单的gulp配置项目,来让我们简单地了解gulp。

2.创建项目文件夹目录

首先,我们创建一个名为gulp-demo的文件夹来作为我们的项目文件夹,
然后使用

npm init 

来初始化我们的项目,项目配置这里就不介绍了;

之后在我们的项目文件夹下分别创建css, js文件夹再创建一个index.html,大概项目文件如下图:


image.png

3.下载gulp,并简单的配置gulpfile.js

下载gulp可以gulp官网或者github查看如何下载,我们这里就直接用yarn下载,当然,npm也是可行的。

yarn add gulp -D

下载好之后,我们在当前项目文件夹下创建一个名为gulpfile.js的文件,这个文件会在执行gulp命令的时候被自动加载。关于gulpfile.js的详细介绍,可查看官网说明,简而言之,就是我们可以适用js相关的语法来书写gulpfile.js。
接下来,我们简单地书写gulpfile.js如下:

const {
  series
} = require('gulp')
function js(){
  console.log("I am js task");
}
function css(){
  console.log("I am css task");
}
function html(){
  console.log("I am html task");
}
function clean(){
  console.log("I am clean task");
}
exports.scripts = js;
exports.clean = clean;
exports.styles = css;
exports.default = series([
  clean,
  js,
  css,
  html
])

可以看到我们分别定义了四个方法并把它们分别export,和一起作为defalut export了出去;
而我们引入的series,是个把任务串行执行的gulp方法;
那我们在命令行输入如下的命令,看看会发生什么效果:

npx gulp scripts
image.png

他这里虽然执行了我们的js方法,打印了我们的输出,但是下面两行提示提示我们少了什么东西。原来每执行完一个任务你得告诉gulp,你执行完了。所以代码修改如下:

const {
  series
} = require('gulp')
function js(cb){
  console.log("I am js task");
  cb();
}

function css(cb){
  console.log("I am css task");
  cb()
}
function html(cb){
  console.log("I am html task");
  cb()
}
function clean(cb){
  console.log("I am clean task");
  cb()
}
exports.scripts = js;
exports.clean = clean;
exports.styles = css;
exports.default = series([
  clean,
  js,
  css,
  html
])

传入的参数cb函数就相当于是用来告诉gulp的,再来执行npx gulp scripts, 显示如下:


image.png

接下来可以自行执行下,npx gulp clean, npx gulp styles, npx gulp, 分别查看命令行的显示结果是什么样的。

3.修改项目文件

在css文件夹中创建inde.scss文件如下:

$color:red;
body {
  text-align: center;
  background: $color;
}

在js文件夹中创建inde.js文件如下:

console.log('测试一下嘛');
console.log('测试一下嘛');
console.log('测试一下嘛');

4.打包函数的配置

  • 通过上面的操作,我们应该可以理解了,原来我们在gulifie.js中定义的方法,可以当我们执行gulp命令时,分别执行我们的方法,如果在方法中加上对文件的输出,编译,删除等操作,就可以实现对项目文件的打包了

  • 我们在命令行中输入如下命令,分别下载gulp-sass, gulp-autoprefixer, gulp-load-plugins, gulp-uglify, del 插件,至于插件的用处,我们之后再说

yarn add gulp-sass gulp-autoprefixer gulp-load-plugins gulp-uglify del -D
  • 然后我们来对js的方法进行改写,改写前,我们要引入其他几个gulp的方法,和一些插件:
const {
  src,
  dest,
  watch,
  series
} = require('gulp')
const plugins = require('gulp-load-plugins')() //注意这里的括号不能少

src是查看目标文件的方法,dest方法是打包好的文件输出的方法,watch是用于热监听的,监听文件的变化(后面会用到),而我们的gulp-load-plugins就是个很神奇的插件了,具体神奇在哪里,直接看下面的代码:

function js(cb) {
  src("js/*.js")     //查找 js文件夹下的所有.js文件
  .pipe(plugins.uglify())  //pipe调用uglify插件
  .pipe(dest('./dist/js')) //pipe调用dest方法
  cb();
}

这段代码就是告诉gulp, 将js目录下的所有js文件,全部丑化,输出到dist目录下的js目录。而我们的gulp-load-plugins插件就可以让我们不用引入其他的插件,直接plugins.插件名(),就可以调用插件了,是不是很方便!!!

那么改写完成了之后,我们执行npx gulp scripts, 就会发现咱们的项目文件夹会多出来一个dist目录,且下面有js录,里面也有个叫index.js的,不过它长这样:

console.log("测试一下嘛"),console.log("测试一下嘛"),console.log("测试一下嘛");

之前多余的空格就被我们的uglify插件给优化没了,js方法改造完成。

  • 删除文件
    每次打包前,先把之前的删除
const del = require('del')
function clean(cb){
  del("./dist")
  cb()
}
export.clean = clean;

在打包了js文件后,执行下 npx gulp clean 看能否删除dist文件夹

  • 下面来对css方法改造
function css(cb){
  src('css/*.scss')
  .pipe(plugins.sass({outputStyle: 'compressed'}))
  .pipe(plugins.autoprefixer({
    cascade: false,
    remove:false
  }))
  .pipe(dest('./dist/css'))
  cb();
}

关于上面的gulp-autoprefixer,和gulp-sass的参数的配置,这里就不一一讲解了,大家可以自行去gulp的插件搜索这两个插件,查看他们如上配置的参数的作用。配置完成后,咱们npx gulp styles。
同上发生了类似的事情,查看我们生成的dist/css目录下的index.css,长相如下:

body{text-align:center;background:red}

已经完成了scss到我们浏览器能看懂的css!!

然后我们在index.html,引入这两个文件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello gulp</title>
  <link rel="stylesheet" href="./dist/css/index.css">
</head>
<body>
  <h2>hello gulp</h2>
  <script src="./dist/js/index.js"></script>
</body>
</html>

打开浏览器看看,其实这时候我们的简单的打包就基本完成了。

  • 热监听
    然后,咱们就会发现,难道我们每改一次代码,都要执行一遍命令行,然后再刷新看看效果么?那这样也太麻烦了。不要着急,gulp的watch方法可以很好的解决这个问题。
    只要将我们的代码做到监听到文件发生改变时,就再次打包改文件就行了
function service(cb){
  watch("css/*.scss", css)  //scss文件发生改变时,调用css方法
  watch("js/*.js", js) //js文件发生改变时,调用js方法
  cb()
}

exports.default = series([
  clean,
  js,
  css,
  html,
  service
])

watch方法就是监听到文件发生变化时,就会调用哪个任务; 执行下npx gulp, 执行完成之后,就会显示如下界面,


image.png

然后我们对css, js的文件分别作出修改

$color:blue;
body {
  text-align: center;
  background: $color;
}
console.log('测试一下嘛');
console.log('测试一下嘛');
console.log('测试一下嘛');
console.log('测试热加载');

这个时候可以看到命令行发生如下变化:


image.png

自动进行了打包的操作,咱们刷新一下inde.html的页面,就可以查看到发生的变化了。

  • 浏览器自动刷新
    什么?我改了代码居然要我刷新浏览器才能看到变化,不行!这个太麻烦了,难道就不能自动刷新浏览器么???
    答案是肯定能的啊!!!还记得那个clean,和html吗,一直没被动过的方法,终于可以来对他们动手了
    这里要下载一个插件:
yarn add browser-sync -D

并且要在package.json中添加如下配置:

{
  "browserslist": [
    "> 2%",
    "last 2 versions"
]
}

引入browser-sync插件来做到自动刷新

const browserSync = require('browser-sync').create()
const reload = browserSync.reload;

reload方法就是重新刷新浏览器, del插件就是用来删除文件的,改写html,clean

function html(cb){
  src("*.html")
  .pipe(reload({stream:true})) //刷新一下
  cb()
}

然后我们要做到,文件改变时,浏览器自动刷新,肯定是监听到文件发生变化了,我们就要刷新浏览器,上一步我们已经做了,监听到文件发生变化执行执行方法,那我们在方法中添加刷新浏览器不就行了么
所以所有修改如下:

const {
  src,
  dest,
  watch,
  series
} = require('gulp')
const plugins = require('gulp-load-plugins')()
const del = require('del')
const browserSync = require('browser-sync').create()
const reload = browserSync.reload;

function js(cb) {
  src("js/*.js")
  .pipe(plugins.uglify())
  .pipe(dest('./dist/js'))
  .pipe(reload({stream:true}))  // 添加刷新浏览器操作
  cb();
}

function clean(cb){
  del("./dist")
  cb()
}

function css(cb){
  src('css/*.scss')
  .pipe(plugins.sass({outputStyle: 'compressed'}))
  .pipe(plugins.autoprefixer({
    cascade: false,
    remove:false
  }))
  .pipe(dest('./dist/css'))
  .pipe(reload({stream:true}))
  cb();
}

function service(cb){
  browserSync.init({
    server:{
      baseDir: './'
    }
  })
  watch("css/*.scss", css)
  watch("js/*.js", js)
  watch("*.html", html)
  cb()
}

function html(cb){
  src("*.html")
  .pipe(reload({stream:true}))
  cb()
}
exports.scripts = js;
exports.clean = clean;
exports.styles = css;
exports.default = series([
  clean,
  js,
  css,
  html,
  service
])

这个时候我们执行,npx gulp, 就能实现文件变化,浏览器实时刷新了,结果就不展示了!谢谢观看!!!
对了还差一步, 配置package.json

  "scripts": {
    "build": "gulp"
  },

然后,之后就可以npm run build, 打包了。是不是更有内味了,溜了溜了!再次感谢观看!

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