- 源代码自动化构建为生产代码
- 称之为自动化构建工作流
- 脱离运行环境问题
- 使用提高效率的语法,规范,标准
- 比如一些ES6 SASS 等通过自动化构建转化为能够运行的代码
- NPM Scripts
- 定义一些与项目有关的命令 在package.json script中定义命令
- browser-sync服务器环境
- —files \”css/*.css\” 自动更新推送到浏览器
- 在serve前加preserve 实现serve执行 前的命令
- —watch监听sacc文件变化
- 同时执行多个 npm-run-all
- run-p build serve 不需要preserve
- 常用的自动化构建工具
- Grunt
- 插件生态完善
- 工具过程基于临时文件,速度较慢
- 每一步都会创建临时文件。磁盘读写
- Gulp
- 基于内存实现,会快很多
- 默认支持同时执行多个任务
- 使用方式更加直观易懂
- FIS
- 微内核,需求集成在内部
- 大而全
- 初学者FIS,需求灵活多变Gulp,Grunt
- Grunt
- Grunt基本使用
- 安装Grunt
- 创建gruntfile.js
- grunt默认支持同步
- 异步定义一个done 为this.async()标记任务完成
```javascript
//grunt入口文件
//定义自动执行的任务
//导出一个函数
// 接收grunt形参,内部提供API
module.exports = (grunt) => {
grunt.registerTask(“foo”,()=>{
console.log(‘Hello Grunt’)
})
grunt.registerTask(“bar”,”任务描述”,()=>{
console.log(‘other’)
})
// grunt.registerTask(“default”,”任务描述”,()=>{
// console.log(‘default’)
// })
grunt.registerTask(‘default’,[‘foo’,’bar’])
// grunt.registerTask(“async-task”,()=>{
// setTimeout(()=>{
// console.log(‘async task working’)
// },1000)
// })
grunt.registerTask(“async-task”,function(){
const done = this.async()
setTimeout(()=>{
},1000) }) }console.log("async task")
done()
- 异步定义一个done 为this.async()标记任务完成
```javascript
//grunt入口文件
//定义自动执行的任务
//导出一个函数
// 接收grunt形参,内部提供API
module.exports = (grunt) => {
grunt.registerTask(“foo”,()=>{
console.log(‘Hello Grunt’)
})
grunt.registerTask(“bar”,”任务描述”,()=>{
console.log(‘other’)
})
// grunt.registerTask(“default”,”任务描述”,()=>{
// console.log(‘default’)
// })
grunt.registerTask(‘default’,[‘foo’,’bar’])
// grunt.registerTask(“async-task”,()=>{
// setTimeout(()=>{
// console.log(‘async task working’)
// },1000)
// })
grunt.registerTask(“async-task”,function(){
const done = this.async()
setTimeout(()=>{
- Grunt标记 任务失败
- 在函数体return false标记这个任务失败
- 一个任务失败 后续的任务不再被执行
- 执行 --force 强制执行所有任务。标记任务失败 也可以执行之后的任务
- 异步任务 done(false) 被标记为失败
- Grunt配置选项
- initConfig
```javascript
module.exports = (grunt) => {
grunt.initConfig({
// foo: "bar",
foo: {
bar: 123,
},
})
grunt.registerTask("foo", () => {
console.log(grunt.config("foo.bar"))
})
}
- Grunt多目标任务
```javascript
module.exports = (grunt) => {
// 需要为多目标任务配置不同目标
grunt.initConfig({
}) grunt.registerMultiTask(“build”, function () {//多目标,同时执行两个目标
//除了制定的options 作为配置选项s
build: {
options:{
foo:"bar"
},
css: {
options:{
foo:"baz"
}
},
js: "2",
},
}) }console.log("build task")
console.log(this.options())
console.log(this.target,this.data)
- Grunt插件
- 通用的构建任务
- 下载插件
- gruntfile载入插件 loadNpmTasks
```javascript
module.exports = (grunt) => {
//支持通配符方式
//** 子文件以及子文件下所有文件 */
grunt.initConfig({
clean:{
temp:"temp/**"
}
})
grunt.loadNpmTasks("grunt-contrib-clean")
}
- Grunt常用插件及总计
- grunt-sass
- 编译sass
```javascript
const sass = require(“sass”)
module.exports = (grunt) => {
grunt.initConfig({
sass:{
options:{
}, main:{sourceMap:true,
implementation:sass
} } }) grunt.loadNpmTasks(‘grunt-sass’)files:{
'dist/css/main.css':'src/scss/main.scss'
}
- 编译sass
```javascript
const sass = require(“sass”)
module.exports = (grunt) => {
grunt.initConfig({
sass:{
options:{
- grunt-sass
}
- ES6语法
- grunt-babel
- grunt-contrib-watch
- 观察,自动构建
```javascript
const sass = require("sass")
const loadGruntTasks = require("load-grunt-tasks")
module.exports = (grunt) => {
grunt.initConfig({
sass: {
options: {
sourceMap: true,
implementation: sass,
},
main: {
files: {
"dist/css/main.css": "src/scss/main.scss",
},
},
},
babel: {
options: {
sourceMap: true,
presets: ["@babel/env"],
},
main: {
files: {
"dist/js/app.js": "src/js/app.js",
},
},
},
watch: {
js: {
files: ["src/js/*.js"],
tasks: ["babel"],
},
css: {
files: ["src/scss/*.scss"],
tasks: ["sass"],
},
},
})
// grunt.loadNpmTasks('grunt-sass')
loadGruntTasks(grunt) //自动加载所有的grunt插件任务
//watch第一次不执行。做映射
grunt.registerTask('default',['sass','babel','watch'])
}
- load-grunt-tasks(grunt) 自动加载所有插件