-
Notifications
You must be signed in to change notification settings - Fork 1
/
gulpfile.js
executable file
·504 lines (486 loc) · 18.3 KB
/
gulpfile.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
var releaseDest = '../app-h5-zip/'; // 发布目录
var gulp = require('gulp'), // 基础库
watch = require('gulp-watch'); // watch库,解决新增文件不能监听的bug
watchPath = require('gulp-watch-path'), // 用于解析watch结果的库
browserSync = require('browser-sync'), // 用于自动刷新页面
babel = require('gulp-babel'), // babel,用于转换es6后缀文件
concat = require('gulp-concat'), // 文件合并
autoprefixer = require('gulp-autoprefixer'), // 自动添加hack
less = require('gulp-less'), // less文件处理
// sass = require('gulp-sass'), // sass文件处理
// importCss = require('gulp-import-css'), // css文件导入
importCss = require('gulp-cssimport'), // css文件导入
minifyCss = require('gulp-clean-css'), // css文件压缩
minifyImg = require('gulp-imagemin'), // img文件压缩
uglify = require('gulp-uglify'), // js压缩
del = require('del'), // 删除文件或目录
replace = require('gulp-replace'), // 字符替换
webpack = require('webpack-stream'), // webpack
named = require('vinyl-named'), // 配合webpack的命名插件
rev = require('gulp-rev'), // 更改版本名
revCollector = require('gulp-rev-collector'), // 更新静态资源引用路径
// sourcemaps = require('gulp-sourcemaps'), // sourcemaps插件
zip = require('gulp-zip'), // zip压缩插件
tar = require('gulp-tar'), // tar打包插件
gzip = require('gulp-gzip'), // gzip压缩插件
plumber = require('gulp-plumber'); // gulp错误检测
require('babel-plugin-transform-runtime');
var work = parseInt(getArg('--work'));
var path = getArg('--path');
var version = getArg('--ver');
var autoRefresh = getArg('--autorefresh') === 'yes' ? true : false;
var match = ('/' + path).match(/^.*[\/\\](.+?)[\/\\](.+?)[\/\\]*$/);
var lineName = match[1]; // 产品线
var projName = match[2]; // 项目目录名
process.title = getArg('--title');
// 默认任务
gulp.task('default', function() {
if (!work || !path) {
console.log('Error: Missing parameters!');
return;
}
switch (work) {
case 1: // 自动构建
return autoBuild(autoRefresh);
break;
case 2: // 预发布项目
return zipProj();
break;
case 3: // 初始化项目
return initProj();
break;
case 5: // 预发布公共文件
return zipCommon();
break;
case 6: //发布单独的公共文件
return zipAloneCommon();
break;
case 9: // 构建公共文件
return buildCommon();
break;
}
});
// 获取参数
function getArg(name) {
var argv = process.argv;
for (var i in argv) {
if (argv[i] === name) {
return argv[+i + 1];
}
}
return null;
}
// 发布单独的公共文件
function zipAloneCommon() {
var comPath = lineName + '/';
console.log("开始打包公共文件------------------");
var filename = 'common.zix';
var src = lineName + '/tmp/common/';
var dist = releaseDest + lineName + '/';
return new Promise(function(resolve, reject) {
var s1 = 4;
cleanTemp();
// 移动其它静态文件
gulp.src([comPath + '**',
'!' + comPath + '**/*.js',
'!' + comPath + '**/*.css',
'!' + comPath + 'src/**',
'!' + comPath + 'src',
]).
pipe(gulp.dest(src)).
on('end', function() {
if (--s1 === 0) resolve('done');
});
// 压缩JS
gulp.src(comPath + 'static/**/*.js').
pipe(replace(/\/\*debug>[\s\S]*<debug\*\//g, '')). // 清除debug标记
pipe(uglify()).
pipe(gulp.dest(src + 'static/')).
on('end', function() {
if (--s1 === 0) resolve('done');
});
// 压缩CSS
gulp.src(comPath + 'static/**/*.css').
pipe(minifyCss()).
pipe(gulp.dest(src + 'static/')).
on('end', function() {
if (--s1 === 0) resolve('done');
});
//处理版本json文件
gulp.src(comPath + 'static/version.json').
pipe(gulp.dest(src)).
on('end', function() {
if (--s1 === 0) resolve('done');
});
}).then(function() {
// 压缩优化处理完成,开始打包
return gulp.src(lineName + '/tmp/' + '**').
pipe(zip(filename)).
// pipe(tar(filename)).
// pipe(gzip()).
pipe(gulp.dest(dist)).
on('end', function() {
cleanTemp();
console.log('预发布公共文件完成\n发布地址:%s%s', dist, filename);
});
});
}
// 预发布项目
function zipProj() {
var filename = projName + '-' + version + '.zix';
var src = lineName + '/tmp/' + projName + '/';
var dist = releaseDest + lineName + '/';
return new Promise(function(resolve, reject) {
var s1 = 6;
cleanTemp();
//移动项目配置文件
gulp.src(path + '/projectCfg.json').
pipe(gulp.dest(src)).
on('end', function(){
console.log('>>> 移动项目配置文件.......................[done]');
if(--s1 === 0) resolve('done');
})
// 移动其它静态文件
gulp.src([path + 'static/**',
'!' + path + 'static/js/**',
'!' + path + 'static/css/**',
'!' + path + 'static/img/**'
]).
pipe(gulp.dest(src + 'static/')).
on('end', function() {
console.log('>>> 移动其它静态文件.......................[done]');
if (--s1 === 0) resolve('done');
});
// 移动HTML文件
gulp.src(path + 'page/**').
pipe(replace(/\<script[^>]+\/vm\/(?:virtual|debug)App.+?>.+?script>/g, '')). // 清除虚拟文件引用
pipe(replace(/\<script[^>]+\:9600\/app.js.+?>.+?script>/g, '')). // 清除weinre文件
pipe(replace(/\<script[^>]+\/target-script-min.+?>.+?script>/g, '')). // 清除weinre文件
pipe(gulp.dest(src + 'page/')).
on('end', function() {
console.log('>>> 移动HTML文件...........................[done]');
if (--s1 === 0) resolve('done');
});
// 压缩JS
gulp.src(path + 'static/js/**/*.js').
pipe(replace(/\/\*debug>[\s\S]*<debug\*\//g, '')). // 清除debug标记
pipe(uglify()).
pipe(gulp.dest(src + 'static/js/')).
on('end', function() {
console.log('>>> 压缩JS文件.............................[done]');
if (--s1 === 0) resolve('done');
});
// 压缩CSS
gulp.src(path + 'static/css/**/*.css').
// pipe(minifyCss({restructuring:false})).
pipe(minifyCss()).
pipe(gulp.dest(src + 'static/css/')).
on('end', function() {
console.log('>>> 压缩CSS文件............................[done]');
if (--s1 === 0) resolve('done');
});
// 优化图片
gulp.src(path + 'static/img/**/*').
pipe(minifyImg({
optimizationLevel: 5, //类型:Number 默认:3 取值范围:0-7(优化等级)
progressive: true, //类型:Boolean 默认:false 无损压缩jpg图片
interlaced: true, //类型:Boolean 默认:false 隔行扫描gif进行渲染
multipass: true //类型:Boolean 默认:false 多次优化svg直到完全优化
})).
pipe(gulp.dest(src + 'static/img/')).
on('end', function() {
console.log('>>> 压缩图片文件...........................[done]');
if (--s1 === 0) resolve('done');
});
}).then(function() {
// 压缩优化处理完成,开始打包
var tmpPath = lineName + '/tmp/' + projName + '/';
return stamp(zipMyProj);
// 修改html和css文件,给静态文件打戳
function stamp(cb) {
return gulp.src([tmpPath + 'static/**', '!' + tmpPath + 'static/images/**']).
pipe(rev()).
// pipe(gulp.dest(dest.res)). // 目前只需计算文件摘要,不进行重命名
pipe(rev.manifest()).
pipe(gulp.dest(tmpPath + '../rev/')).
on('end', function() {
return gulp.src([tmpPath + '../rev/*.json', tmpPath + 'static/**/*.css', tmpPath + 'static/**/*.js']).
pipe(revCollector({
replaceReved: true
})).
// 修改为 ?v=stamp 形式
pipe(replace(/\-([0-9a-z]{8,})\.(png|jpg|gif|ico|otf)/g, function(a, b, c) {
return '.' + c + '?v=' + b;
})).
// 修改为 ?v=stamp 形式
pipe(replace(/\-([0-9a-z]{8,})\.(mp4|avi|ogg|webm|swf)/g, function(a, b, c) {
return '.' + c + '?v=' + b;
})).
// 修改为 ?v=stamp 形式
pipe(replace(/\-([0-9a-z]{8,})\.(json)/g, function(a, b, c) {
return '.' + c + '?v=' + b;
})).
pipe(gulp.dest(tmpPath + 'static/')).
on('end', function() {
return gulp.src([tmpPath + '../rev/*.json', tmpPath + 'page/**/*.html']).
pipe(revCollector({
replaceReved: true
})).
// 修改为 ?v=stamp 形式
pipe(replace(/\-([0-9a-z]{8,})\.((min\.)?css|(min\.)?js)/g, function(a, b, c) {
return '.' + c + '?v=' + b;
})).
pipe(replace(/\-([0-9a-z]{8,})\.(png|jpg|gif|ico|otf)/g, function(a, b, c) {
return '.' + c + '?v=' + b;
})).
pipe(replace(/\-([0-9a-z]{8,})\.(mp4|avi|ogg|webm|swf)/g, function(a, b, c) {
return '.' + c + '?v=' + b;
})).
pipe(gulp.dest(tmpPath + 'page/')).
on('end', function() {
console.log('>>> 静态资源版本控制.......................[done]');
if (typeof cb === 'function') return cb();
});
});
});
}
function zipMyProj() {
return gulp.src([lineName + '/tmp/' + '**', '!' + lineName + '/tmp/rev{,/**}']).
pipe(zip(filename)).
pipe(gulp.dest(dist)).
on('end', function() {
cleanTemp();
console.log('-------------------------------------------\n预发布项目完成\n发布地址:%s%s', dist, filename);
});
}
});
}
// 清除临时文件夹
function cleanTemp(cb) {
try {
del(lineName + '/tmp/' + '**', cb);
} catch (e) {}
}
// 初始化项目
function initProj() {
return new Promise(function(resolve, reject) {
var s1 = 4;
packJS().on('end', function() {
if (--s1 === 0) resolve('done');
});
buildLess().on('end', function() {
if (--s1 === 0) resolve('done');
});
buildSass().on('end', function() {
if (--s1 === 0) resolve('done');
});
buildCSS().on('end', function() {
if (--s1 === 0) resolve('done');
});
}).then(function() {
console.log('初始化项目完成');
});
}
// 预发布公共文件
function zipCommon() {
var comPath = lineName + '/common/';
// var filename = 'common.tar';
var filename = 'common.zix';
var src = lineName + '/tmp/common/';
var dist = releaseDest + lineName + '/';
return new Promise(function(resolve, reject) {
var s1 = 3;
cleanTemp();
// 移动其它静态文件
gulp.src([comPath + '**',
'!' + comPath + '**/*.js',
'!' + comPath + '**/*.css',
'!' + comPath + 'src/**',
'!' + comPath + 'src',
]).
pipe(gulp.dest(src)).
on('end', function() {
if (--s1 === 0) resolve('done');
});
// 压缩JS
gulp.src(comPath + 'static/**/*.js').
pipe(replace(/\/\*debug>[\s\S]*<debug\*\//g, '')). // 清除debug标记
pipe(uglify()).
pipe(gulp.dest(src + 'static/')).
on('end', function() {
if (--s1 === 0) resolve('done');
});
// 压缩CSS
gulp.src(comPath + 'static/**/*.css').
pipe(minifyCss()).
pipe(gulp.dest(src + 'static/')).
on('end', function() {
if (--s1 === 0) resolve('done');
});
}).then(function() {
// 压缩优化处理完成,开始打包
return gulp.src(lineName + '/tmp/' + '**').
pipe(zip(filename)).
// pipe(tar(filename)).
// pipe(gzip()).
pipe(gulp.dest(dist)).
on('end', function() {
cleanTemp();
console.log('预发布公共文件完成\n发布地址:%s%s', dist, filename);
});
});
}
// 构建公共文件
function buildCommon() {
var baseSrc = path + '../common/src/';
var baseDist = path + '../common/static/';
return new Promise(function(resolve, reject) {
var s1 = 3;
buildCSS(baseSrc + '**/*.css', baseDist).on('end', function() {
if (--s1 === 0) resolve('done');
});
packJS(baseSrc + '**/*.{js,jsx,es6}', baseDist).on('end', function() {
if (--s1 === 0) resolve('done');
});
// 移动其它静态文件
gulp.src([baseSrc + '**',
'!' + baseSrc + '**/*.js',
'!' + baseSrc + '**/*.css',
'!' + baseSrc + '**/*.es6',
'!' + baseSrc + '**/*.jsx'
]).
pipe(gulp.dest(baseDist)).
on('end', function() {
if (--s1 === 0) resolve('done');
});
}).then(function() {
console.log('构建公共文件完成');
});
}
// 开启自动构建
function autoBuild(autoRefresh) {
watch(path + 'src/**/*.{js,jsx,es6}', function(event) {
console.log('js building...');
packJS();
});
watch(path + 'src/**/*.{css,less,scss}', function(event) {
var paths = watchPath(event, path + 'src/', path + 'src/'); // 检测less及scss文件
if (paths.srcFilename.indexOf('.less') > -1) { // 分捡less文件
buildLess(paths.srcPath, paths.distDir);
} else if (paths.srcFilename.indexOf('.scss') > -1) { // 分捡sass文件
buildSass(paths.srcPath, paths.distDir);
} else {
buildCSS();
}
});
if (autoRefresh) {
browserSync({
files: path + 'static/**',
startPath: '/' + projName + '/page/',
server: {
baseDir: path + '../',
index: 'index.html'
}
});
}
}
/**
* 打包JS文件
* 如提供src及dist参数,则只构建src指定的文件并输出到dist指定的目标
* @param {string} src 可选,构建源文件
* @param {string} dist 可选,目的文件
*/
function packJS(src, dist) {
src = src || (path + 'src/js/app*.{js,jsx,es6}');
dist = dist || (path + 'static/js/');
return gulp.src(src).
pipe(plumber({
errorHandler: function(e) {
console.log(e);
}
})).
pipe(named()).
pipe(webpack({
module: {
loaders: [{
test: /\.js|jsx|es6$/,
exclude: /node_modules/,
loader: 'babel',
query: {
plugins: ['transform-runtime'],
presets: ['react', 'es2015', 'stage-0']
}
}, {
test: /\.(png|jpg|gif|woff|woff2)$/,
loader: 'url-loader?limit=8192'
}],
},
})).
pipe(gulp.dest(dist));
}
/**
* 构建less文件
* 如提供src及dist参数,则只构建src指定的文件并输出到dist指定的目标
* @param {string} src 可选,构建源文件
* @param {string} dist 可选,目的文件
*/
function buildLess(src, dist) {
src = src || (path + 'src/**/*.less');
dist = dist || (path + 'static/');
console.log('less building...');
return gulp.src(src).
pipe(plumber({
errorHandler: function(e) {
console.log(e);
}
})).
pipe(less()).
pipe(importCss()). // 处理 @import url
// pipe(autoprefixer('last 2 Chrome versions', 'Firefox > 20')).
pipe(gulp.dest(dist));
}
/**
* 构建sass文件
* 如提供src及dist参数,则只构建src指定的文件并输出到dist指定的目标
* @param {string} src 可选,构建源文件
* @param {string} dist 可选,目的文件
*/
function buildSass(src, dist) {
src = src || (path + 'src/**/*.scss');
dist = dist || (path + 'static/');
// console.log('sass building...');
return {
on: function(a, cb) {
return cb();
}
};
/*return gulp.src(src).
pipe(plumber({errorHandler: function(e){
console.log(e);
}})).
pipe(sass()).
pipe(importCss()). // 处理 @import url
// pipe(autoprefixer('last 2 Chrome versions', 'Firefox > 20')).
pipe(gulp.dest(dist));*/
}
/**
* 构建css文件
* 如提供src及dist参数,则只构建src指定的文件并输出到dist指定的目标
* @param {string} src 可选,构建源文件
* @param {string} dist 可选,目的文件
*/
function buildCSS(src, dist) {
var src = src || (path + 'src/**/*.css');
var dist = dist || (path + 'static/');
console.log('css building...');
return gulp.src(src).
pipe(plumber({
errorHandler: function(e) {
console.log(e);
}
})).
pipe(importCss()). // 处理 @import url
// pipe(autoprefixer('last 2 Chrome versions', 'Firefox > 20')).
pipe(autoprefixer('Chrome > 10', 'Firefox > 10')).
pipe(gulp.dest(dist));
}