123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089 |
- /*******************
- * 后台管理系统、公司网站分为一组;
- * 代理商、经销商、测试系统分为一组(由于测试系统依赖app里面的公共文件,所以测试系统后续开发尽量不要和app内部文件耦合);
- * 终端用户分为一组,完全要做到:【其他系统发布不会造成对用户系统的影响】;
- *
- * 特殊的:公共组件,主要是手机网页用的多,后台管理系统用的少,但是经销商和终端用户又是分开的,导致经销商和终端用户的发布会相互影响,所以尽量不要修改!
- * ********************/
- //日志
- var log4js = require('log4js')
- var log4jsConfig = {
- appenders: {
- out: { type: 'stdout' }, //设置是否在控制台打印日志
- info: { type: 'file', filename: './var/logs/gulp-history.log' },
- },
- categories: {
- default: { appenders: ['out', 'info'], level: 'info' }, //去掉'out'。控制台不打印日志
- },
- }
- if (process.platform.indexOf('linux') > -1) {
- log4jsConfig.appenders.info.filename = '/var/log/gulp-history.log'
- }
- log4js.configure(log4jsConfig)
- var LogFile = log4js.getLogger('info')
- const { series, parallel } = require('gulp') //gulp主组件
- //引入gulp和gulp插件
- var gulp = require('gulp') //gulp主组件
- var babel = require('gulp-babel') //如果某些JS用了ES6语法,就需要转换
- var changed = require('gulp-changed')
- var htmlmin = require('gulp-htmlmin') //html压缩组件
- var jshint = require('gulp-jshint') //js语法检查
- var gulpAutoprefixer = require('gulp-autoprefixer')
- var sass = require('gulp-sass')(require('sass')) // 编译 sass
- var less = require('gulp-less')
- var minifyCss = require('gulp-minify-css') //压缩CSS为一行;
- var uglify = require('gulp-uglify') //js文件压缩
- var rev = require('gulp-rev') //对文件名加MD5后缀
- var revCollector = require('gulp-rev-collector') //路径替换
- var gulpRemoveHtml = require('gulp-remove-html') //标签清除,参考:https://www.npmjs.com/package/gulp-remove-html
- var removeEmptyLines = require('gulp-remove-empty-lines') //清除空白行,参考:https://www.npmjs.com/package/gulp-remove-empty-lines
- var rename = require('gulp-rename')
- var gulpSequence = series
- var clean = require('gulp-clean') //清除文件插件,参考:https://github.com/teambition/gulp-clean
- var modify = require('gulp-modify') //文件内容修改
- var inject = require('gulp-inject-string')
- /*************************************************开发环境**************************************************/
- var browserSync = require('browser-sync').create()
- // 文档 https://browsersync.io/docs/options
- //复制模拟数据接口
- gulp.task('copy-mock', function () {
- return gulp.src('static/mock/**/*').pipe(gulp.dest(buildBasePath + 'mock'))
- })
- // 开发时,拷贝文件到dev目录
- function devCopyChange() {
- // 拷贝时排除需要sass编译的文件、排除doc文档(因为已经不需要了)、排除babel
- return gulp
- .src([
- 'static/**/*',
- '!**/custom/css/*.css',
- '!**/app/css/*.css',
- '!**/pages/css/user-common.css',
- '!**/custom/css/*.css',
- '!**/custom/scss/*.*',
- '!**/app/doc/*.*',
- //排除babel编译的部分
- '!static/app/js/*.js',
- '!static/components/custom/js/*.js',
- ])
- .pipe(changed('dist_dev')) //只拷贝变动过的文件
- .pipe(gulp.dest('dist_dev'))
- }
- function sassCommonPipe(src) {
- return src
- .pipe(sass({ outputStyle: 'compressed' }).on('error', sass.logError)) // sass只会解析scss格式的import文件,不会解析css
- .pipe(autoprefixer())
- .pipe(minifyCss()) //压缩css,minifyCss会先把所有的@import url()外部进入的css文件递归插入,如 iconfont.css
- }
- // 开发时,自动编译sass并更新到dev目录,不用压缩!
- function devCustomRevCss(done) {
- //公共样式
- sassCommonPipe(gulp.src('static/components/custom/scss/index.scss'))
- .pipe(
- rename(function (path) {
- path.basename = 'common' //必须重命名,common文件名全局独享,这样revCollector才能正确执行
- })
- )
- .pipe(gulp.dest('dist_dev/components/custom/css'))
- //经销商、代理商、测试的样式
- sassCommonPipe(gulp.src('static/components/custom/scss/dealer.scss'))
- .pipe(
- rename(function (path) {
- path.basename = 'xyf.common.min'
- })
- )
- .pipe(gulp.dest('dist_dev/app/css'))
- //终端用户的样式
- sassCommonPipe(gulp.src('static/components/custom/scss/user.scss'))
- .pipe(
- rename(function (path) {
- path.basename = 'user-common'
- })
- )
- .pipe(gulp.dest('dist_dev/pages/css'))
- //支付后广告样式
- sassCommonPipe(gulp.src('static/components/custom/scss/third-receipt.scss'))
- .pipe(
- rename(function (path) {
- path.basename = 'third-receipt'
- })
- )
- .pipe(gulp.dest('dist_dev/public/css'))
- done()
- }
- // 开发时,自动编译less并更新到dist_dev目录,不用压缩!
- function devManageLess() {
- console.log('less编译中')
- return gulp.src('static/1.0/css/less/app.less').pipe(less()).pipe(autoprefixer()).pipe(gulp.dest('dist_dev/1.0/css'))
- }
- function devEs6App() {
- return gulp
- .src('static/app/js/*.js')
- .pipe(babel()) //es6转es5
- .pipe(gulp.dest('dist_dev/app/js'))
- }
- function devEs6Custom() {
- return gulp
- .src('static/components/custom/js/*.js')
- .pipe(babel()) //es6转es5
- .pipe(gulp.dest('dist_dev/components/custom/js'))
- }
- // 监听变动文件,然后复制或是编译
- gulp.task(
- 'dev-watch',
- parallel([devCopyChange, devCustomRevCss, devManageLess, devEs6App, devEs6Custom], function (done) {
- console.log(
- '---------已监听大部分业务js和html,排除监听公共库、公司网站代码、图片,如果变动需要重启命令即可自动拷贝-------------'
- )
- // { interval: 1500 }设置 监听频率,可以减少CPU占用
- // 监听所有js html,以及1.0的css,无后缀名的接口文件;排除angular-mod (基本不改动),排除第三方库(如有新增库,重启命令即可拷贝过去),排除后可以减少cpu的占用(i5 4590 12%占用,全部监听占用30%左右)
- gulp.watch(
- [
- 'static/**/*.js',
- 'static/1.0/**/*.css',
- 'static/**/*.html',
- 'static/mock/**/*',
- 'static/wifi/*',
- //排除babel编译的部分
- '!static/app/js/*.js',
- '!static/components/custom/js/*.js',
- //排除公共库或是基本不改的代码
- '!static/1.0/vendor/**/*.*',
- '!static/components/lib/**/*.*',
- '!static/angular-mod/**/*.*',
- ],
- devCopyChange
- )
- // 监听sass文件,并编译
- gulp.watch(['static/components/custom/scss/**/*.scss', 'static/components/custom/css/*.css'], devCustomRevCss)
- // 监听less文件,并编译
- gulp.watch(['static/1.0/**/*.less'], devManageLess)
- // 监听某些JS文件,可能会有ES6,所以编译
- gulp.watch(['static/app/js/*.js'], devEs6App)
- gulp.watch(['static/components/custom/js/*.js'], devEs6Custom)
- done()
- })
- )
- //开发: 启动服务器
- gulp.task(
- 'run-dev',
- series(['dev-watch'], function (done) {
- browserSync.init({
- server: {
- baseDir: 'dist_dev',
- },
- ghostMode: false, //不需要同步页面行为,不然无法同时打开多个不同的页面
- notify: false, //禁用浏览器的通知元素
- open: false, // 不需要自动打开浏览器
- host: '127.0.0.1',
- port: 80,
- // 前端开发时,模拟POST 避免404
- middleware: function (req, res, next) {
- if (req.method.toUpperCase() == 'POST') {
- req.method = 'GET'
- }
- next()
- },
- })
- done()
- })
- )
- module.exports.dev = series('run-dev')
- /*************************************************生产环境**************************************************/
- // 启动服务器:主要是验证一下dist对不对,需要复制模拟数据
- gulp.task(
- 'preview',
- series(['copy-mock'], function () {
- console.log('---------即将验证dist目录,请确保代码已编译-------------')
- browserSync.init({
- server: {
- baseDir: 'dist',
- },
- open: 'external',
- host: '127.0.0.1',
- port: 80,
- //模拟POST 避免404
- middleware: function (req, res, next) {
- if (req.method.toUpperCase() == 'POST') {
- req.method = 'GET'
- }
- next()
- },
- })
- })
- )
- var buildBasePath = 'dist/' //构建输出的目录
- if (process.argv[4]) {
- buildBasePath = process.argv[4] + '/'
- }
- // css浏览器兼容修复,如加webkit
- function autoprefixer() {
- return gulpAutoprefixer({
- overrideBrowserslist: ['Chrome > 31', 'Android 4.1', 'iOS 7.1'],
- cascade: true, //是否美化属性值 默认:true 像这样:
- //-webkit-transform: rotate(45deg);
- // transform: rotate(45deg);
- remove: true, //是否去掉不必要的前缀 默认:true
- })
- }
- /**********旧的dist清除******************/
- //删除全部dist文件
- gulp.task('clean:Build', function (cb) {
- return gulp.src(buildBasePath, { read: false, allowEmpty: true }).pipe(clean())
- })
- //删除后台管理系统
- gulp.task('clean:manage', function (cb) {
- return gulp
- .src([buildBasePath + '1.0/', buildBasePath + 'admaster/', buildBasePath + 'administrator/'], {
- read: false,
- allowEmpty: true,
- })
- .pipe(clean())
- })
- //删除公共组件dist
- gulp.task('clean:common', function (cb) {
- return gulp.src([buildBasePath + 'components/'], { read: false, allowEmpty: true }).pipe(clean())
- })
- //删除经销商、代理商dist文件
- gulp.task('clean:dealer', function (cb) {
- return gulp.src([buildBasePath + 'app/', buildBasePath + 'agents/'], { read: false, allowEmpty: true }).pipe(clean())
- })
- //测试系统dist文件
- gulp.task('clean:test', function (cb) {
- return gulp.src([buildBasePath + 'test/'], { read: false, allowEmpty: true }).pipe(clean())
- })
- //weknow dist文件
- gulp.task('clean:weknow', function (cb) {
- return gulp.src([buildBasePath + 'weknow/'], { read: false, allowEmpty: true }).pipe(clean())
- })
- //public dist文件
- gulp.task('clean:public', function (cb) {
- return gulp.src([buildBasePath + 'public/'], { read: false, allowEmpty: true }).pipe(clean())
- })
- //help dist文件
- gulp.task('clean:help', function (cb) {
- return gulp.src([buildBasePath + 'help/'], { read: false, allowEmpty: true }).pipe(clean())
- })
- //删除终端用户dist文件
- gulp.task('clean:enduser', function (cb) {
- return gulp.src([buildBasePath + 'pages/'], { read: false, allowEmpty: true }).pipe(clean())
- })
- /****************不需要编译的文件拷贝*********************/
- //复制公共文件,如系统图标,公共组件,等不容易变更的文件,主要是经销商、代理商、终端用户用到,后台管理系统几乎不用
- gulp.task('copy_common_1', function () {
- //拷贝前台公共组件字体
- return gulp.src(['static/components/fonts/*.*']).pipe(gulp.dest(buildBasePath + 'components/fonts'))
- })
- gulp.task('copy_common_2', function () {
- //拷贝前台公共组件js和css
- return gulp.src(['static/components/lib/**/*.*']).pipe(gulp.dest(buildBasePath + 'components/lib'))
- })
- gulp.task('copy_common_3', function () {
- //拷贝前台公共组件媒体文件
- return gulp.src(['static/components/custom/voice/*.*']).pipe(gulp.dest(buildBasePath + 'components/custom/voice'))
- })
- gulp.task('copy_common_4', function () {
- //拷贝全局网页缺省logo
- return gulp.src(['static/favicon.ico', 'static/robots.txt']).pipe(gulp.dest(buildBasePath + ''))
- })
- gulp.task('copy-common', gulpSequence(['copy_common_1'], ['copy_common_2'], ['copy_common_3'], ['copy_common_4']))
- //复制管理系统文件
- gulp.task('copy_manage_1', function () {
- //拷贝后台管理系统全部文件---【使用base=static可以在拷贝文件时候保留路径】
- return gulp
- .src(['static/1.0/fonts/**/*', 'static/1.0/img/**/*', 'static/1.0/vendor/**/*', 'static/1.0/favicon.png'], {
- base: 'static/',
- })
- .pipe(gulp.dest(buildBasePath))
- })
- gulp.task('copy-manage', gulpSequence(['copy_manage_1']))
- //复制经销商、代理商文件、测试系统文件(暂无)
- gulp.task('copy_dealer_1', function () {
- //拷贝经销商说明文档
- return gulp.src('static/app/doc/**/*').pipe(gulp.dest(buildBasePath + 'app/doc'))
- })
- gulp.task('copy_dealer_2', function () {
- //拷贝经销商图片文件
- return gulp.src('static/app/img/**/*').pipe(gulp.dest(buildBasePath + 'app/img'))
- })
- gulp.task('copy-dealer', gulpSequence(['copy_dealer_1'], ['copy_dealer_2']))
- //复制终端用户文件
- gulp.task('copy-enduser', function () {
- //拷贝终端用户图片文件
- return gulp.src('static/pages/images/**/*').pipe(gulp.dest(buildBasePath + 'pages/images'))
- })
- gulp.task('copy-help', function () {
- return gulp.src(['static/help/**/*.*']).pipe(gulp.dest(buildBasePath + 'help'))
- })
- gulp.task('chaoben_html', function () {
- return gulp
- .src(['static/chaoben/**/*.html'])
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(
- htmlmin({
- removeComments: true, //清除HTML注释
- collapseWhitespace: true, //压缩HTML
- collapseBooleanAttributes: true, //省略布尔属性的值 <input checked="true"/> ==> <input />
- removeEmptyAttributes: true, //删除所有空格作属性值 <input id="" /> ==> <input />
- removeScriptTypeAttributes: true, //删除<script>的type="text/javascript"
- removeStyleLinkTypeAttributes: true, //删除<style>和<link>的type="text/css"
- minifyJS: true, //压缩页面JS
- minifyCSS: true, //压缩页面CSS
- })
- )
- .pipe(gulp.dest(buildBasePath + 'chaoben'))
- })
- gulp.task('chaoben_css', function () {
- return gulp
- .src(['static/chaoben/**/*.css'])
- .pipe(autoprefixer())
- .pipe(minifyCss()) //压缩css
- .pipe(gulp.dest(buildBasePath + 'chaoben'))
- })
- gulp.task('chaoben_static', function () {
- return gulp
- .src(['static/chaoben/**/*.png', 'static/chaoben/**/*.jpg', 'static/chaoben/**/*.js'])
- .pipe(gulp.dest(buildBasePath + 'chaoben'))
- })
- gulp.task('chaoben', gulpSequence(['chaoben_html'], ['chaoben_css'], ['chaoben_static']))
- var commonRevDir = buildBasePath + 'components/custom' //自定义公共组件输出文件
- var dealerRevDir = buildBasePath + 'app' //经销商系统输出文件
- var agentsRevDir = buildBasePath + 'agents' //代理商系统输出文件
- var enduserRevDir = buildBasePath + 'pages' //终端用户输出文件
- var testRevDir = buildBasePath + 'test' //测试模块输出文件
- var weknowRevDir = buildBasePath + 'weknow' //导航模块输出文件
- var publicRevDir = buildBasePath + 'public'
- var helpRevDir = buildBasePath + 'help' //
- /******************自定义公共组件输出文件*****************/
- var commonSrc = 'static/components/custom' //定制化公共组件源
- gulp.task('customRevJs', function () {
- return gulp
- .src(commonSrc + '/js/*.js')
- .pipe(
- modify({
- fileModifier: function (file, contents) {
- //此处修改了多个文件,其实只需要修改commone.js,有待优化...
- return 'var APP_VERSION=' + new Date().getTime() + ';' + contents
- },
- })
- )
- .pipe(babel()) //es6转es5
- .pipe(rev())
- .pipe(uglify()) //压缩js
- .pipe(gulp.dest(commonRevDir + '/js')) //输出带后缀的文件
- .pipe(rev.manifest())
- .pipe(gulp.dest(commonRevDir + '/js')) //输出json对照表
- })
- //拷贝字体到dist目录
- gulp.task('customRevFont', function () {
- return gulp
- .src([commonSrc + '/css/*.eot', commonSrc + '/css/*.svg', commonSrc + '/css/*.ttf', commonSrc + '/css/*.woff'])
- .pipe(gulp.dest(commonRevDir + '/css')) //输出文件
- })
- gulp.task('customRevCss', function () {
- return (
- gulp
- .src(commonSrc + '/scss/index.scss')
- .pipe(sass({ outputStyle: 'compressed' }).on('error', sass.logError))
- .pipe(autoprefixer())
- .pipe(minifyCss()) //压缩css
- //必须重命名,common文件名全局独享,这样revCollector才能正确执行
- .pipe(
- rename(function (path) {
- path.basename = 'common'
- })
- )
- .pipe(rev()) //文件加md5后缀
- .pipe(gulp.dest(commonRevDir + '/css')) //输出带后缀的文件
- .pipe(rev.manifest())
- .pipe(gulp.dest(commonRevDir + '/css'))
- ) //输出json对照表
- })
- gulp.task('customReceiptCss', function () {
- return gulp
- .src(commonSrc + '/scss/third-receipt.scss')
- .pipe(sass({ outputStyle: 'compressed' }).on('error', sass.logError))
- .pipe(autoprefixer())
- .pipe(minifyCss()) //压缩css
- .pipe(
- rename(function (path) {
- path.basename = 'third-receipt'
- })
- )
- .pipe(rev()) //文件加md5后缀
- .pipe(gulp.dest(publicRevDir + '/css')) //输出带后缀的文件
- .pipe(rev.manifest())
- .pipe(gulp.dest(publicRevDir + '/css')) //输出json对照表
- })
- /**************经销商、代理商、测试系统用的公共CSS、JS文件编译以及加版本号***************/
- //定义经销商的css、js源文件路径
- var dealerJsSrc = 'static/app/js/*.js'
- //CSS生成文件hash编码并生成 rev-manifest.json文件名对照映射
- gulp.task('appRevCss', function () {
- return gulp
- .src(commonSrc + '/scss/dealer.scss')
- .pipe(sass({ outputStyle: 'compressed' }).on('error', sass.logError))
- .pipe(autoprefixer())
- .pipe(minifyCss()) //压缩css
- .pipe(
- rename(function (path) {
- path.basename = 'xyf.common.min'
- })
- )
- .pipe(rev()) //文件加md5后缀
- .pipe(gulp.dest(dealerRevDir + '/css')) //输出带后缀的文件
- .pipe(rev.manifest())
- .pipe(gulp.dest(dealerRevDir + '/css')) //输出json对照表
- })
- //js生成文件hash编码并生成 rev-manifest.json文件名对照映射
- gulp.task('appRevJs', function () {
- return gulp
- .src(dealerJsSrc)
- .pipe(babel()) //es6转es5
- .pipe(rev()) //md5
- .pipe(uglify()) //压缩js
- .pipe(gulp.dest(dealerRevDir + '/js'))
- .pipe(rev.manifest())
- .pipe(gulp.dest(dealerRevDir + '/js')) //输出json对照表
- })
- /**************后台管理系统、广告商***************/
- // 编译后台管理系统的less,manageRevCss任务压缩即可,注意src路径细节
- gulp.task('manageLess', function () {
- return gulp
- .src(['static/1.0/css/less/app.less'])
- .pipe(less())
- .pipe(gulp.dest(buildBasePath + '1.0/css'))
- })
- //预先执行 manageLess , CSS生成文件hash编码并生成 rev-manifest.json文件名对照映射,注意排除 app.css(因为已经单独编译),并包含dist下单app.css
- gulp.task(
- 'manageRevCss',
- series(['manageLess'], function () {
- return gulp
- .src(['static/1.0/css/*.css', buildBasePath + '1.0/css/app.css', '!static/1.0/css/app.css'])
- .pipe(rev())
- .pipe(autoprefixer())
- .pipe(minifyCss()) //压缩css
- .pipe(gulp.dest(buildBasePath + '1.0/css'))
- .pipe(rev.manifest())
- .pipe(gulp.dest(buildBasePath + '1.0/css')) //输出json对照表
- })
- )
- //js生成文件hash编码并生成 rev-manifest.json文件名对照映射
- gulp.task('manageRevJs', function () {
- return gulp
- .src(['static/1.0/js/**/*.js'])
- .pipe(
- modify({
- fileModifier: function (file, contents) {
- // 目前app.js ,管理系统、广告商、厂商共用;
- if (file.path.indexOf('app.js') > -1) {
- return 'var APP_VERSION=' + new Date().getTime() + ';' + contents
- } else {
- return contents
- }
- },
- })
- )
- .pipe(babel()) //es6转es5
- .pipe(rev()) //md5
- .pipe(uglify()) //压缩js
- .on('error', function (err) {
- console.log('错误信息:' + err.toString())
- })
- .pipe(gulp.dest(buildBasePath + '1.0/js')) //输出压缩文件
- .pipe(rev.manifest())
- .pipe(gulp.dest(buildBasePath + '1.0/js')) //输出json对照表
- })
- gulp.task('admasterRevJs', function () {
- return gulp
- .src(['static/admaster/js/**/*.js'])
- .pipe(babel()) //es6转es5
- .pipe(rev()) //md5
- .pipe(uglify()) //压缩js
- .pipe(gulp.dest(buildBasePath + 'admaster/js')) //输出压缩文件
- .pipe(rev.manifest())
- .pipe(gulp.dest(buildBasePath + 'admaster/js')) //输出json对照表
- })
- gulp.task('administratorRevJs', function () {
- return gulp
- .src(['static/administrator/js/**/*.js'])
- .pipe(babel()) //es6转es5
- .pipe(rev()) //md5
- .pipe(uglify()) //压缩js
- .pipe(gulp.dest(buildBasePath + 'administrator/js')) //输出压缩文件
- .pipe(rev.manifest())
- .pipe(gulp.dest(buildBasePath + 'administrator/js')) //输出json对照表
- })
- /************终端用户CSS、JS编译以及加版本号*************/
- //定义经销商的css、js源文件路径
- var enduserJsSrc = 'static/pages/js/*.js'
- //CSS生成文件hash编码并生成 rev-manifest.json文件名对照映射
- gulp.task('enduserRevCss', function () {
- return gulp
- .src(commonSrc + '/scss/user.scss')
- .pipe(sass({ outputStyle: 'compressed' }).on('error', sass.logError))
- .pipe(autoprefixer())
- .pipe(minifyCss()) //压缩css
- .pipe(
- rename(function (path) {
- path.basename = 'user-common'
- })
- )
- .pipe(rev()) //文件加md5后缀
- .pipe(gulp.dest(enduserRevDir + '/css')) //输出带后缀的文件
- .pipe(rev.manifest())
- .pipe(gulp.dest(enduserRevDir + '/css')) //输出json对照表
- })
- //js生成文件hash编码并生成 rev-manifest.json文件名对照映射
- gulp.task('enduserRevJs', function () {
- return gulp
- .src(enduserJsSrc)
- .pipe(rev()) //md5
- .pipe(uglify()) //压缩js
- .pipe(gulp.dest(enduserRevDir + '/js')) //输出文件
- .pipe(rev.manifest())
- .pipe(gulp.dest(enduserRevDir + '/js')) //输出json对照表
- })
- //html压缩配置项
- var htmlOptions = {
- removeComments: true, //清除HTML注释
- collapseWhitespace: false, //压缩HTML
- collapseBooleanAttributes: true, //省略布尔属性的值 <input checked="true"/> ==> <input />
- removeEmptyAttributes: true, //删除所有空格作属性值 <input id="" /> ==> <input />
- removeScriptTypeAttributes: true, //删除<script>的type="text/javascript"
- removeStyleLinkTypeAttributes: true, //删除<style>和<link>的type="text/css"
- minifyJS: true, //压缩页面JS
- minifyCSS: true, //压缩页面CSS
- }
- //经销商html路径
- var dealerHtmlSrc = 'static/app/**/*.html'
- //代理商html路径
- var agentsHtmlSrc = 'static/agents/**/*.html'
- //终端用户html路径
- var enduserHtmlSrc = 'static/pages/**/*.html'
- //测试模块html路径
- var testHtmlSrc = 'static/test/**/*.html'
- // weknow html路径
- var weknowHtmlSrc = 'static/weknow/**/*.html'
- var publicHtmlSrc = 'static/public/**/*.html'
- var helpHtmlSrc = 'static/help/**/*.html'
- /************经销商、代理商加入带版本号的CSS、JS引用*************/
- gulp.task('html_dealer_1', function () {
- return gulp
- .src([dealerRevDir + '/**/*.json', commonRevDir + '/**/*.json', dealerHtmlSrc])
- .pipe(revCollector()) //修改html的引入资源成为带hash的文件路径
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(htmlmin(htmlOptions))
- .pipe(
- inject.beforeEach(
- '</head>',
- '\n<script>(function(){var b=function(c){var d=document.cookie.match(new RegExp("(^| )"+c+"=([^;]*)(;|$)"));return null==d?null:unescape(d[2])}("theme_name")||"theme-alipay";document.querySelectorAll("html")[0].classList.add(b)})();</script>\n'
- )
- )
- .pipe(gulp.dest(dealerRevDir))
- })
- gulp.task('html_dealer_2', function () {
- //由于引用了经销商的样式和js,压缩代理商的文件注意路径
- return gulp
- .src([dealerRevDir + '/**/*.json', commonRevDir + '/**/*.json', agentsHtmlSrc])
- .pipe(revCollector()) //修改html的引入资源成为带hash的文件路径
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(htmlmin(htmlOptions))
- .pipe(
- inject.beforeEach(
- '</head>',
- '\n<script>(function(){var b=function(c){var d=document.cookie.match(new RegExp("(^| )"+c+"=([^;]*)(;|$)"));return null==d?null:unescape(d[2])}("theme_name")||"theme-alipay";document.querySelectorAll("html")[0].classList.add(b)})();</script>\n'
- )
- )
- .pipe(gulp.dest(agentsRevDir))
- })
- gulp.task('html-dealer', gulpSequence(['html_dealer_1'], ['html_dealer_2']))
- /************测试系统加入带版本号的CSS、JS引用*************/
- gulp.task('html-test', function () {
- //测试模块html处理
- return gulp
- .src([dealerRevDir + '/**/*.json', commonRevDir + '/**/*.json', testHtmlSrc])
- .pipe(revCollector()) //修改html的引入资源成为带hash的文件路径
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(htmlmin(htmlOptions))
- .pipe(gulp.dest(testRevDir))
- })
- /************ weknow 加入带版本号的CSS、JS引用*************/
- gulp.task('html-weknow', function () {
- //测试模块html处理
- return gulp
- .src([dealerRevDir + '/**/*.json', commonRevDir + '/**/*.json', weknowHtmlSrc])
- .pipe(revCollector()) //修改html的引入资源成为带hash的文件路径
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(htmlmin(htmlOptions))
- .pipe(gulp.dest(weknowRevDir))
- })
- /************ public 加入带版本号的CSS、JS引用*************/
- gulp.task('html-public', function () {
- //测试模块html处理
- return gulp
- .src([commonRevDir + '/**/*.json', publicRevDir + '/**/*.json', publicHtmlSrc])
- .pipe(revCollector()) //修改html的引入资源成为带hash的文件路径
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(htmlmin(htmlOptions))
- .pipe(gulp.dest(publicRevDir))
- })
- /************ help 加入带版本号的CSS、JS引用*************/
- gulp.task('html-help', function () {
- //测试模块html处理
- return gulp
- .src([dealerRevDir + '/**/*.json', commonRevDir + '/**/*.json', helpHtmlSrc])
- .pipe(revCollector()) //修改html的引入资源成为带hash的文件路径
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(htmlmin(htmlOptions))
- .pipe(gulp.dest(helpRevDir))
- })
- /************终端用户加入带版本号的CSS、JS引用*************/
- gulp.task('html-enduser', function () {
- //终端用户html处理
- return gulp
- .src([enduserRevDir + '/**/*.json', commonRevDir + '/**/*.json', enduserHtmlSrc])
- .pipe(revCollector()) //修改html的引入资源成为带hash的文件路径
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(htmlmin(htmlOptions))
- .pipe(
- inject.beforeEach(
- '</head>',
- '\n<script>(function(){var b=function(c){var d=document.cookie.match(new RegExp("(^| )"+c+"=([^;]*)(;|$)"));return null==d?null:unescape(d[2])}("theme_name")||"theme-alipay";document.querySelectorAll("html")[0].classList.add(b)})();</script>\n'
- )
- )
- .pipe(gulp.dest(enduserRevDir))
- })
- /************管理系统加入带版本号的CSS、JS引用,开发时尽量不要有重名文件*************/
- //修改manage主页的js/css引用
- gulp.task('res-rev-manage', function () {
- return gulp
- .src([buildBasePath + '1.0/**/rev-manifest.json', 'static/1.0/**/*.html'])
- .pipe(revCollector({ replaceReved: true })) //修改html的引入资源成为带hash的文件路径
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(htmlmin(htmlOptions))
- .pipe(gulp.dest(buildBasePath + '1.0'))
- })
- //修改admaster主页的js/css引用
- gulp.task('res-rev-admaster', function () {
- //----css、js 公用1.0的,【后面的json优先级高于前面,注意admaster往后放】---
- return gulp
- .src([
- buildBasePath + '1.0/js/rev-manifest.json',
- buildBasePath + 'admaster/js/rev-manifest.json',
- buildBasePath + '1.0/css/rev-manifest.json',
- 'static/admaster/**/*.html',
- ])
- .pipe(revCollector({ replaceReved: true })) //修改html的引入资源成为带hash的文件路径
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(htmlmin(htmlOptions))
- .pipe(gulp.dest(buildBasePath + 'admaster'))
- })
- //修改administrator主页的js/css引用
- gulp.task('res-rev-administrator', function () {
- //----css、js 公用1.0的,【后面的json优先级高于前面,注意administrator往后放】---
- return gulp
- .src([
- buildBasePath + '1.0/js/rev-manifest.json',
- buildBasePath + 'administrator/js/rev-manifest.json',
- buildBasePath + '1.0/css/rev-manifest.json',
- 'static/administrator/**/*.html',
- ])
- .pipe(revCollector({ replaceReved: true })) //修改html的引入资源成为带hash的文件路径
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(htmlmin(htmlOptions))
- .pipe(gulp.dest(buildBasePath + 'administrator'))
- })
- //【在manage路由配置中也有引用到js!】
- gulp.task('res-rev-manage-js', function () {
- return gulp
- .src([buildBasePath + '1.0/js/rev-manifest.json', buildBasePath + '1.0/js/*.router.js'])
- .pipe(revCollector({ replaceReved: true })) //修改html的引入资源成为带hash的文件路径
- .pipe(gulp.dest(buildBasePath + '1.0/js'))
- })
- //【在admaster路由配置中也有引用到js!】
- gulp.task('res-rev-admaster-js', function () {
- //----指令、服务、过滤器等 公用1.0的,【后面的json优先级高于前面,注意admaster往后放】---
- return gulp
- .src([
- buildBasePath + '1.0/js/rev-manifest.json',
- buildBasePath + 'admaster/js/rev-manifest.json',
- buildBasePath + 'admaster/js/*.router.js',
- ])
- .pipe(revCollector({ replaceReved: true })) //修改html的引入资源成为带hash的文件路径
- .pipe(gulp.dest(buildBasePath + 'admaster/js'))
- })
- //【在administrator路由配置中也有引用到js!】
- gulp.task('res-rev-administrator-js', function () {
- //----指令、服务、过滤器等 公用1.0的,【后面的json优先级高于前面,注意administrator往后放】---
- return gulp
- .src([
- buildBasePath + '1.0/js/rev-manifest.json',
- buildBasePath + 'administrator/js/rev-manifest.json',
- buildBasePath + 'administrator/js/*.router.js',
- ])
- .pipe(revCollector({ replaceReved: true })) //修改html的引入资源成为带hash的文件路径
- .pipe(gulp.dest(buildBasePath + 'administrator/js'))
- })
- gulp.task('moveAll', function (done) {
- // 暂时不清理
- done()
- })
- /********发布任务**************/
- //默认任务、全部产品发布
- gulp.task('default', function (done) {
- console.log('-------------------------请用以下命令发布产品-----------------------------')
- console.log(' \x1B[32m gulp all \x1B[0m --发布所有产品')
- console.log(' \x1B[32m gulp manage \x1B[0m --发布后台管理系统和公司网站')
- console.log(' \x1B[32m gulp dealer \x1B[0m --发布经销商、代理商')
- console.log(' \x1B[32m gulp test \x1B[0m --发布测试系统')
- console.log(' \x1B[32m gulp weknow \x1B[0m --发布weknow')
- console.log(' \x1B[32m gulp public \x1B[0m --发布public')
- console.log(' \x1B[32m gulp help \x1B[0m --发布whelp')
- console.log(' \x1B[32m gulp enduser \x1B[0m --发布终端用户')
- console.log(' \r\n')
- console.log(' \x1B[31m gulp all --dist new_dist_dir \x1B[0m --输出到new_dist_dir')
- console.log('--------------------------------------------------------------------------')
- })
- //默认任务、全部产品发布
- module.exports.all = gulpSequence(
- // ['clean:Build'],//删除所有旧的dist文件
- ['clean:common'], //清空公共组件 会导致经销商、代理商的公共文件丢失
- ['clean:manage'], //清空相关文件
- ['clean:dealer'], //清空相关文件
- ['clean:test'], //清空相关文件
- ['clean:weknow'], //清空相关文件
- ['clean:public'], //清空相关文件
- ['clean:help'], //清空相关文件
- ['clean:enduser'], //清空相关文件
- ['copy-manage'], //复制管理系统、广告系统 静态文件
- ['copy-common'], //复制公共组件、文件
- ['copy-dealer'], //复制经销商、代理商、测试系统文件
- ['copy-enduser'], //复制终端用户文件
- ['copy-help'], //copy help
- // ['chaoben'], //copy chaoben
- // 后台管理系统、广告系统
- ['manageRevCss'],
- ['manageRevJs'],
- ['admasterRevJs'],
- ['administratorRevJs'],
- ['res-rev-manage'],
- ['res-rev-admaster'],
- ['res-rev-administrator'],
- ['res-rev-manage-js'],
- ['res-rev-admaster-js'],
- ['res-rev-administrator-js'],
- //编译公共js、css并加入版本号
- ['customRevJs'],
- ['customRevCss'],
- ['customReceiptCss'],
- ['customRevFont'],
- //经销商、代理商、测试系统CSS、js文件编译并加入版本号
- ['appRevCss'],
- ['appRevJs'],
- //终端用户CSS、js文件编译并加入版本号
- ['enduserRevCss'],
- ['enduserRevJs'],
- //经销商、代理商、测试系统、终端用户的CSS、js引入修改
- ['html-dealer'],
- ['html-test'],
- ['html-weknow'],
- ['html-public'],
- ['html-enduser'],
- //移动到发布目录
- ['moveAll']
- )
- //后台管理系统、公司网站
- gulp.task(
- 'manage',
- gulpSequence(
- ['clean:manage'], //清空管理系统相关文件
- ['copy-manage'], //复制后台管理系统、网站文件
- /******后台管理系统公共组件vender、字体变更较少,不需要编译***********/
- /**!!!!依赖json minifest的一定要保证顺序执行,否则结果永远不正确!!!!**/
- ['manageRevCss'],
- ['manageRevJs'],
- ['admasterRevJs'],
- ['administratorRevJs'],
- ['res-rev-manage'],
- ['res-rev-admaster'],
- ['res-rev-administrator'],
- ['res-rev-manage-js'],
- ['res-rev-admaster-js'],
- ['res-rev-administrator-js'],
- //移动到发布目录
- ['moveAll']
- )
- )
- //经销商、代理商
- gulp.task(
- 'dealer',
- gulpSequence(
- ['clean:dealer'], //清空相关文件
- ['copy-common'], //复制公共组件、文件
- ['copy-dealer'], //复制经销商、代理商文件
- //编译公共js、css并加入版本号
- ['customRevJs'],
- ['customRevCss'],
- ['customRevFont'],
- //经销商、代理商、测试系统 公用的CSS、js文件编译并加入版本号
- ['appRevCss'],
- ['appRevJs'],
- //经销商、代理商的CSS、js引入修改
- ['html-dealer'],
- //移动到发布目录
- ['moveAll']
- )
- )
- // 测试系统
- gulp.task(
- 'test',
- gulpSequence(
- ['clean:test'], //清空相关文件
- // todo 其实和经销商的公共组件重复,但是为了可以单独部署,也需要公共文件;在和经销商一起部署时,为了不影响经销商,不要clean:common
- ['copy-common'], //复制公共组件、文件
- ['copy-dealer'], //复制经销商、代理商文件、测试系统就用到了几张图片
- //编译公共js、css并加入版本号:似乎代码不变的情况的下,编译的文件名居然不同。。。
- ['customRevJs'],
- ['customRevCss'],
- ['customRevFont'],
- //经销商、代理商、测试系统 公用的CSS、js文件编译并加入版本号
- ['appRevCss'],
- ['appRevJs'],
- //测试系统的CSS、js引入修改
- ['html-test'],
- //移动到发布目录
- ['moveAll']
- )
- )
- // weknow 发布
- gulp.task(
- 'weknow',
- gulpSequence(
- ['clean:weknow'], //清空相关文件
- ['copy-common'], //复制公共组件、文件
- ['copy-dealer'], //复制经销商、代理商文件、测试系统就用到了几张图片
- //编译公共js、css并加入版本号:似乎代码不变的情况的下,编译的文件名居然不同。。。
- ['customRevJs'],
- ['customRevCss'],
- ['customRevFont'],
- //经销商、代理商、测试系统 公用的CSS、js文件编译并加入版本号
- ['appRevCss'],
- ['appRevJs'],
- //测试系统的CSS、js引入修改
- ['html-weknow'],
- //移动到发布目录
- ['moveAll']
- )
- )
- // public 发布
- gulp.task(
- 'public',
- gulpSequence(
- ['clean:public'], //清空相关文件
- ['copy-common'], //复制公共组件、文件
- ['copy-dealer'], //复制经销商、代理商文件、测试系统就用到了几张图片
- //编译公共js、css并加入版本号:似乎代码不变的情况的下,编译的文件名居然不同。。。
- ['customRevJs'],
- ['customRevCss'],
- ['customRevFont'],
- //经销商、代理商、测试系统 公用的CSS、js文件编译并加入版本号
- ['appRevCss'],
- ['appRevJs'],
- ['html-public'],
- //移动到发布目录
- ['moveAll']
- )
- )
- // help 发布
- gulp.task(
- 'help',
- gulpSequence(
- ['clean:help'], //清空相关文件
- ['copy-help'], //copy help
- //移动到发布目录
- ['moveAll']
- )
- )
- //终端用户
- gulp.task(
- 'enduser',
- gulpSequence(
- ['clean:enduser'], //清空相关文件
- ['copy-common'], //复制公共组件、文件
- ['copy-enduser'], //复制终端用户文件
- //编译公共js、css并加入版本号
- ['customRevJs'],
- ['customRevCss'],
- ['customRevFont'],
- //终端用户CSS、js文件编译并加入版本号
- ['enduserRevCss'],
- ['enduserRevJs'],
- //终端用户的CSS、js引入修改
- ['html-enduser'],
- //移动到发布目录
- ['moveAll']
- )
- )
- //js语法检测 【开发使用】
- gulp.task('jshint', function () {
- return gulp.src('static/app/js/*.js').pipe(jshint()).pipe(jshint.reporter('default'))
- })
- /*************嵌入式设备页面压缩**********************/
- gulp.task('wifi-copy', function () {
- return gulp.src(['static/wifi/**/*.gz']).pipe(gulp.dest('dist/wifi'))
- })
- gulp.task(
- 'html-wifi',
- series('wifi-copy', function (done) {
- return gulp
- .src(['static/wifi/**/*.html'])
- .pipe(gulpRemoveHtml()) //清除特定标签
- .pipe(removeEmptyLines({ removeComments: true })) //清除空白行
- .pipe(htmlmin(htmlOptions))
- .pipe(gulp.dest('dist/wifi'))
- })
- )
|