csm-pages
Version:
static web app workflow
175 lines (158 loc) • 4.26 kB
JavaScript
// 实现这个项目的构建任务
// gulp构建过程工作原理就是读取流,转换流和写入流
const {
src,
dest,
parallel,
series,
watch
} = require('gulp')
// 多次打包会有冗余文件需要删除 del
const del = require('del')
// 热更新开发服务器 browser-sync
const browserSync = require('browser-sync')
// 自动加载插件 gulp-load-plugins
const gulpLoadPlugins = require('gulp-load-plugins')
const plugins = gulpLoadPlugins()
const bs = browserSync.create()
const config = require('./config')
const clean = () => {
return del([config.build.dist, config.build.temp])
}
// 样式编译——项目里使用sass,需要转换scss为css gulp-sass
const style = () => {
return src(config.build.paths.styles, {
base: config.build.src,
cwd: config.build.src
})
.pipe(plugins.sass({
outputStyle: 'expanded'
}))
.pipe(dest(config.build.temp))
.pipe(bs.reload({
stream: true
}))
}
// JS编译——项目里使用了ES6语法,需要使用babel转换为ES5 gulp-babel @babel/core @babel/preset-env
const script = () => {
return src(config.build.paths.scripts, {
base: config.build.src,
cwd: config.build.src
})
.pipe(plugins.babel({
presets: [require('@babel/preset-env')]
}))
.pipe(dest(config.build.temp))
.pipe(bs.reload({
stream: true
}))
}
// 模板编译——项目页面需要使用模板引擎处理 gulp-swig
const page = () => {
return src(config.build.paths.pages, {
base: config.build.src,
cwd: config.build.src
})
.pipe(plugins.swig({
data: config.data,
defaults: {
cache: false
}
})) // 防止模板缓存导致页面不能及时更新
.pipe(dest(config.build.temp))
.pipe(bs.reload({
stream: true
}))
}
// 图片字体压缩复制
const image = () => {
return src(config.build.paths.images, {
base: config.build.src,
cwd: config.build.src
})
.pipe(plugins.imagemin())
.pipe(dest(config.build.dist))
}
const font = () => {
return src(config.build.paths.fonts, {
base: config.build.src,
cwd: config.build.src
})
.pipe(plugins.imagemin())
.pipe(dest(config.build.dist))
}
// 项目打包的时候public里的文件作为不需要额外处理的文件,全部复制到打包目录下
const extra = () => {
return src('**', {
base: config.build.public,
cwd: config.build.public
})
.pipe(dest(config.build.dist))
}
const serve = () => {
watch(config.build.paths.styles, {
cwd: config.build.src
}, style)
watch(config.build.paths.scripts, {
cwd: config.build.src
}, script)
watch(config.build.paths.pages, {
cwd: config.build.src
}, page)
watch([
config.build.paths.images,
config.build.paths.fonts
], {
cwd: config.build.src
}, bs.reload)
watch('**', {
cwd: config.build.public
}, bs.reload)
bs.init({
notify: false,
port: 3080,
server: {
baseDir: [config.build.temp, config.build.src, config.build.public],
routes: {
'/node_modules': 'node_modules'
}
}
})
}
// 处理文件引用,压缩/合并代码 gulp-useref
// 上线准备 压缩CSS、JS、html和图片 gulp-clean-css gulp-uglify gulp-imagemin
const useref = () => {
return src(config.build.paths.pages, {
base: config.build.temp,
cwd: config.build.temp
})
.pipe(plugins.useref({
searchPath: [config.build.temp, '.']
}))
// html js css
.pipe(plugins.if(/\.js$/, plugins.uglify()))
.pipe(plugins.if(/\.css$/, plugins.cleanCss()))
.pipe(plugins.if(/\.html$/, plugins.htmlmin({
collapseWhitespace: true,
minifyCSS: true,
minifyJS: true
})))
.pipe(dest(config.build.dist))
}
const compile = parallel(style, script, page)
// 上线之前执行的任务
const build = series(
clean,
parallel(
series(compile, useref),
image,
font,
extra
)
)
const deploy = series(compile, serve)
module.exports = {
clean,
build,
deploy
}