1.简介
前端的自动化构建工具,目前用的比较多的大概有webpack, grunt, gulp。
gulp,用自动化构建工具增强你的工作流程;
官方介绍gulp将开发流程中让人痛苦或耗时的任务自动化,从而减少你所浪费的时间、创造更大价值。简而言之,是一个自动化构建工具,主要用来设定程序自动处理静态资源的工作。他的特点就是简单,高效。这篇文章呢,主要是创建一个简单的gulp配置项目,来让我们简单地了解gulp。
2.创建项目文件夹目录
首先,我们创建一个名为gulp-demo的文件夹来作为我们的项目文件夹,
然后使用
npm init
来初始化我们的项目,项目配置这里就不介绍了;
之后在我们的项目文件夹下分别创建css, js文件夹再创建一个index.html,大概项目文件如下图:
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
他这里虽然执行了我们的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, 显示如下:
接下来可以自行执行下,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, 执行完成之后,就会显示如下界面,
然后我们对css, js的文件分别作出修改
$color:blue;
body {
text-align: center;
background: $color;
}
console.log('测试一下嘛');
console.log('测试一下嘛');
console.log('测试一下嘛');
console.log('测试热加载');
这个时候可以看到命令行发生如下变化:
自动进行了打包的操作,咱们刷新一下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, 打包了。是不是更有内味了,溜了溜了!再次感谢观看!