需求:
实现开发模式下启动服务器,文件修改后实现自动重载(热更新);打包模式下进行文件压缩与版本更新(防止缓存)。
gulp版本为4.0.2
package.json scripts 与 devDependencies 依赖包安装
{
"name": "gulp",
"version": "1.0.0",
"description": "",
"main": "src/ts/index.js",
"scripts": {
"start": "gulp",
"build": "gulp build",
"tsc": "gulp tsc",
"clean": "gulp clean"
},
"author": "ys",
"license": "ISC",
"dependencies": {},
"devDependencies": {
"del": "^5.1.0",
"gulp": "^4.0.2",
"gulp-connect": "^5.7.0",
"gulp-cssmin": "^0.2.0",
"gulp-htmlmin": "^5.0.1",
"gulp-rev": "^9.0.0",
"gulp-rev-collector": "^1.3.1",
"gulp-sass": "^4.0.2",
"gulp-typescript": "^6.0.0-alpha.1",
"gulp-uglify": "^3.0.2",
"open": "^7.0.0",
"typescript": "^3.7.3"
}
}
插件引用
const {src, dest, watch, parallel, series} = require('gulp');
const connect = require('gulp-connect');
const open = require("open");
const del = require('del');
const sass = require('gulp-sass');
const ts = require('gulp-typescript');
const rev = require("gulp-rev");
const revCollector = require("gulp-rev-collector");
const uglify = require("gulp-uglify");
const cssmin = require("gulp-cssmin");
const htmlMin = require("gulp-htmlmin");
变量配置
const app = {
srcPath: 'src/',
buildPath: 'dist/',
devPath: 'dev/',
revPath: 'rev/'
};
let html_min_options = {
collapseWhitespace: true,
collapseBooleanAttributes: true,
removeComments: true,
removeEmptyAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
minifyJS: true,
minifyCSS: true
};
删除【开发模式】与【发布模式】生成的文件与文件夹
function clean(cb) {
return del([app.devPath, app.buildPath, app.revPath], cb)
}
开发模式【DEV】任务
function image() {
return src(app.srcPath + 'images/**/*')
.pipe(dest(app.devPath + 'images'))
.pipe(connect.reload());
}
function css() {
return src(app.srcPath + 'scss/**/*.scss')
.pipe(sass())
.pipe(dest(app.devPath + 'css'))
.pipe(connect.reload());
}
function tsc() {
return src(app.srcPath + 'ts/**/*.ts')
.pipe(ts())
.pipe(dest(app.srcPath + 'js'));
}
function js() {
return src(app.srcPath + 'js/**/*.js')
.pipe(dest(app.devPath + 'js'))
.pipe(connect.reload());
}
function html() {
return src(app.srcPath + '**/*.html')
.pipe(dest(app.devPath))
.pipe(connect.reload());
}
function server(cb) {
connect.server({
root: [app.devPath],
livereload: true,
port: 5000
})
open("http://localhost:5000")
watch(app.srcPath + 'images/**/*', image);
watch(app.srcPath + 'scss/**/*.scss', css);
watch(app.srcPath + 'ts/**/*.ts', series(tsc, js));
watch(app.srcPath + 'js/**/*.js', js);
watch(app.srcPath + '**/*.html', html);
cb()
}
发布模式【BUILD】任务
function image_build() {
return src(app.srcPath + 'images/**/*')
.pipe(rev())
.pipe(dest(app.buildPath + 'images'))
.pipe(rev.manifest())
.pipe(dest(app.revPath + 'images'));
}
function scss_build() {
return src(app.srcPath + 'scss/**/*.scss')
.pipe(sass())
.pipe(dest(app.srcPath + 'css'));
}
function css_build() {
return src(app.srcPath + 'css/**/*.css')
.pipe(rev())
.pipe(cssmin())
.pipe(dest(app.buildPath + "css/"))
.pipe(rev.manifest())
.pipe(dest(app.revPath + 'css'));
}
function css_clean(cb) {
return del([app.srcPath + 'css'], cb);
}
function tsc_build() {
return src(app.srcPath + 'ts/**/*.ts')
.pipe(ts())
.pipe(dest(app.srcPath + 'js'));
}
function js_build() {
return src(app.srcPath + 'js/**/*.js')
.pipe(rev())
.pipe(uglify())
.pipe(dest(app.buildPath + 'js/'))
.pipe(rev.manifest())
.pipe(dest(app.revPath + 'js'));
}
function image_rev_collector() {
return src([app.revPath + "**/*.json", app.buildPath + "**/*.css"])
.pipe(revCollector({replaceReved: true}))
.pipe(dest(app.buildPath + '/'));
}
function html_build() {
return src([app.revPath + "**/*.json", app.srcPath + "**/*.html"])
.pipe(revCollector({replaceReved: true}))
.pipe(dest(app.buildPath + '/'));
}
function build_clean(cb) {
return del([app.revPath, app.buildPath], cb);
}
代码地址