grunt部分
一:自动化构建简介
- 一切重复工作本应该自动化
- 作用
- 脱离运行环境兼容带来的问题
- 使用提高效率的语法,规范和标准
二:常见的自动化构建工具
Grunt
- 生态插件完善,几乎可以完成你想要做的事情,但是由于工作过程是基于临时文件去实现的,所以它的构建速度相对比较慢(因为需要读写,在磁盘中完成)
Gulp
- 它很好的解决了Grunt构建速度慢的问题,因为它是基于内存去实现的,对文件的处理是在内存中完成的,同时还默认同时执行多个任务,效率大大提高,而且使用方式相对于Grunt更加直观易懂,目前生态创建也完善
FIS
- 更像是一种捆绑套餐,把项目典型的需要尽可能集成再内部了,适合初学者,但是要灵活多变的话Grunt更合适
三:Grunt的基本使用
- 创建文件夹
- 初始化一个package.json文件(yarn init --yes)
- 安装grunt模块(yarn add grunt)
- 在文件的根目录新建一个gruntfile.js文件作为grunt入口文件,用于定义一些需要Grunt自动执行的任务,并且需要导出一个函数,此函数接收一个grunt的形参,内部提供一些创建任务时可以用到的API
四:Grunt标记任务失败
- 如果在构建任务的逻辑代码中发生错误,那么即可将任务标记为失败任务
- 可以在函数体当中通过return false标记错误
- 在default执行多个方法时如果前面的任务发生错误,那么后面的任务将不再执行,可以通过-yarn grunt default--force-解决
- 在异步方法中可以在异步回调函数中传入一个实参-false
五:Grunt的配置方法
- grunt.initConfig
六:Grunt的多目标任务
- grunt.registerMultiTack
七:Grunt插件的使用(只演示一个,其他可查看文档)
- 使用grunt.loadNpmTasks加载插件
Gulp部分
一:Gulp的基本使用
- yarn init --yes 初始化一个package.json文件
- yarn add gulp --dev 安装gulp作为开发依赖
- 在根目录中创建一个gulpfile.js文件
- 可以通过 ---yarn gulp + 任务---运行(默认任务可以直接 yarn gulp 执行)
- 因为gulp4.0后是异步任务,所以每次任务完成都需要标记任务完成,否则会报错
二:Gulp的组合任务
- Gulp提供的API
- series()--将任务操作组合成跟强大的操作,依次执行
- parallel()--将任务组合成同时在线的较大操作
三:Gulp的的异步任务
- 回调
- promise
- async await
- 返回stream
四:Gulp构建过程核心工作原理
- 读取流--> 转换流 --> 写入流
五:Gulp文件操作部分API加插件的使用
- Gulp提供了读取流和写入流,相对于node底层的读写流和写入流跟强大,更容易使用,转换流基本使用独立的插件使用
- 读取流---src()
- 转换流---插件
- 写入流---dest()
六:Gulp案例
- 样式编译------yarn add gulp-sass --dev
- js脚本编译------yarn add gulp-bable @bable/core @bable/preset-env --dev
- 页面模板编译------yarn add gulp-swig --dev
- 图片和文字转换------yarn add gulp-imagemin --dev
- 其他文件及文件清除------yarn add del --dev (这不是gulp插件,只是可以在gulp上使用)
- 自动加载插件------yarn add gulp-load-plugins --dev
- 开发服务器------yarn add browser-sync --dev(这不是gulp插件,它可以提供gulp管理,插件一个开发服务器,这个支持我们修改代码后自动热更新)
- 监视变化以及构建优化------gulp的API--watch
- 文件引用处理------yarn add gulp-useref --dev
- 文件压缩(js:gulp-uglify)-(html:gulp-htmlmin)-(css:gulp-clean-css)
- gulp-if----用于判断是上面类型(用于文件压缩)
- 重新规划构建过程
- 补充-package.json配置
- 文件目录如下
const { src , dest , parallel , series , watch} = require('gulp')
//自动加载插件
const loadPlugins = require('gulp-load-pugins')
//使用方法
const plugins = loadPlugins()
//清除---这不是gulp插件
const del = require('del')
const browserSync = require('browser-sync')
//这个模块提供一个create方法用于创建一个开发服务器
const bs = browserSync.create()
//清除文件
const claen = () => {
//这里表示清除dist文件和temp文件
return del(['dist', 'temp'])
}
//样式编译sass转为浏览器可以编译的css
const style = () => {
//base的目的就是把文件路径保留下来
return src('src/assets/styles/*.scss',{ base : 'src'})
.pipe(plugins.sass())
.pipe(dest('temp'))
}
//js脚本编译es6转es5
const script = () => {
return src('src/assets/scripts/*.js', { base : 'src'})
.pipe(plugins.bable({ presets: ['@bable/env']}))
.pipe(dest('temp'))
}
//模板脚本编译
const page = () => {
return src('src/*.html', {base : 'src'})
.pipe(plugins.swig())
.pipe(dest('temp'))
}
//图片转换--压缩
const image = () => {
return src('src/assets/images/**', { base : 'src' })
.pipe(plugins.imagemin())
.pipe(dest('dist'))
}
//字体转换--压缩
const font = () => {
return src('src/assets/fonts/**', { base : 'src'})
.pipe(plugins.imagemin())
.pipe(dest('dist'))
}
//拷贝其他文件例如public
const extra = () => {
return src('public/**', { base : 'public' })
.pipe(dest('dist'))
}
//把之前的构建注释转换成链接,并压缩对应文件
const userf = () => {
return src('temp/*.html' , { base : 'temp' })
.pipe(plugins.useref({ serachPath: ['temp' , ''] }))
.pipe(plugins.if(/\.js$/, plugins.uglify()))
.pipe(plugins.if(/\.css$/, plugins.cleanCss()))
//没有配置的话只会压缩行内的一个空格
.pipe(plugins.if(//.html$\, plugins.htmlmin({
collapseWhiteaspace:true,
minifyCss:true,
minifyJS:true
})))
.pipe(dest('dist'))
}
const serve = () => {
//Glup的API-watch
//监听以下目录,如果发生变化则触发相应的任务是浏览器内容更新
watch('src/assets/styles/*.scss', style)
watch('src/assets/scripts/*.js', script)
watch('src/*.html', page)
//reload是browerSync插件的方法
//bs.reload下面的路径文件变化就会刷新浏览器
watch(['src/assets/images/**', 'src/assets/fonts/**', 'public/**'], bs.reload())
//init方法初始化一些相关的配置
bs.init({
//关闭打开网页时右上角的提示
notify:false,
//开发服务器的端口
port:8080,
//是否自动打开浏览器
open:'true',
//指定一个字符串,用于browser启动过后被监听的文件
files:'dist/**',
//这是核心配置
server:{
//网站的根目录,可以是一个数组,前面找不到他会依次往后面找
baseDir:['temp', 'src', 'public'],
//用于发开阶段因为开发阶段并没有处理构建过程中文件引用的问题
routes:{
'/node_modules':'node_modules'
}
}
})
}
const compile = parallel(style,script,page)
//线上环境打包压缩
const build = series(clean, parallel( series( compile , useref ), image, font, extra))
//开发阶段
const develop = series( compile, serve )
modele.exports = {
clean,
build,
develop
}
七:最后可以在package.json配置
- 通过yarn clean 运行
- 通过yarn build 运行
- 通过yarn develop运行