build.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. 'use strict';
  2. var gulp = require('gulp');
  3. var path = require('path');
  4. var config = require('./config');
  5. var _ = require('lodash');
  6. var wiredep = require('wiredep').stream;
  7. var $ = require('gulp-load-plugins')({
  8. pattern: ['gulp-*', 'main-bower-files', 'uglify-save-license', 'del', 'imagemin-pngquant']
  9. });
  10. var sass = require('gulp-sass');
  11. gulp.task('clean:dist', function() {
  12. $.del([path.join(config.paths.dist, '/')]);
  13. });
  14. /**
  15. * [生成Html模版文件]
  16. */
  17. gulp.task('partials', function() {
  18. return gulp.src([
  19. path.join(config.paths.src, '/app/**/*.html')
  20. ])
  21. .pipe($.minifyHtml({
  22. empty: true,
  23. spare: true,
  24. quotes: true
  25. }))
  26. .pipe($.angularTemplatecache('templateCacheHtml.js', {
  27. module: config.modules.templateModuleName,
  28. root: 'app'
  29. }))
  30. .pipe(gulp.dest(config.paths.tmp + '/partials/'));
  31. });
  32. /**
  33. * [Html,Js,Css压缩合并]
  34. */
  35. gulp.task('html', ['plug:timestamp', 'inject', 'partials'], function() {
  36. var partialsInjectFile = gulp.src(path.join(config.paths.tmp, '/partials/templateCacheHtml.js'), {
  37. read: false
  38. });
  39. var partialsInjectOptions = {
  40. starttag: '<!-- inject:partials -->',
  41. ignorePath: path.join(config.paths.tmp, '/partials'),
  42. addRootSlash: false
  43. };
  44. var htmlFilter = $.filter('*.html', {
  45. restore: true
  46. });
  47. var jsFilter = $.filter('**/*.js', {
  48. restore: true
  49. });
  50. var cssFilter = $.filter('**/*.css', {
  51. restore: true
  52. });
  53. return gulp.src(path.join(config.paths.tmp, '/serve/*.html'))
  54. //error
  55. .pipe($.plumber(config.errorHandler()))
  56. //inject template
  57. .pipe($.inject(partialsInjectFile, partialsInjectOptions))
  58. //js
  59. .pipe($.useref()) //合并和压缩
  60. .pipe(jsFilter)
  61. //修复HTML图片地址
  62. .pipe($.replace('app/assets/', 'assets/'))
  63. .pipe($.stripDebug())
  64. .pipe($.uglify())
  65. .pipe(jsFilter.restore)
  66. //css
  67. .pipe(cssFilter)
  68. //修复HTML图片地址
  69. .pipe($.replace('app/assets/', 'assets/'))
  70. .pipe($.replace('(assets/', '(../assets/'))
  71. .pipe($.autoprefixer({
  72. browsers: ['last 20 versions'],
  73. cascade: false
  74. }))
  75. .pipe($.csso())
  76. .pipe(cssFilter.restore)
  77. //md5后缀
  78. .pipe($.if('*.css', $.rev()))
  79. .pipe($.if('*.js', $.rev()))
  80. //替换md5后缀的文件名
  81. .pipe($.revReplace())
  82. //html处理
  83. .pipe(htmlFilter)
  84. // .pipe($.replace('<base href="/">', '<base href="/eolinker/">'))
  85. .pipe($.minifyHtml({
  86. empty: true,
  87. spare: true,
  88. quotes: true,
  89. conditionals: true
  90. }))
  91. .pipe(htmlFilter.restore)
  92. .pipe(gulp.dest(path.join(config.paths.dist, '/')))
  93. .pipe($.size({
  94. title: path.join(config.paths.dist, '/'),
  95. showFiles: true
  96. }));
  97. });
  98. /**
  99. * [图片压缩]
  100. */
  101. gulp.task('images', function() {
  102. return gulp.src([
  103. path.join(config.paths.src, '/assets/images/**/*'),
  104. path.join('!' + config.paths.src, '/assets/images/sprite/**/*')
  105. ])
  106. .pipe($.imagemin({
  107. progressive: true,
  108. svgoPlugins: [{
  109. removeViewBox: false
  110. }],
  111. use: [$.imageminPngquant()]
  112. }))
  113. .pipe(gulp.dest(path.join(config.paths.dist, '/assets/images')));
  114. });
  115. gulp.task('fonts', function() {
  116. return gulp.src(config.vendor.base.source, {
  117. base: 'bower_components'
  118. })
  119. .pipe($.filter('**/*.{eot,svg,ttf,woff,woff2}'))
  120. .pipe($.flatten())
  121. .pipe(gulp.dest(path.join(config.paths.dist, '/font/')));
  122. });
  123. /**
  124. * [复制文件] 前端依赖库以及静态文件
  125. */
  126. gulp.task('plug:timestamp', function() {
  127. return gulp.src([
  128. path.join(config.paths.src, '/app/constant/plug.constant.js')
  129. ])
  130. .pipe($.replace(/.js\?timestamp=.*?\'/g, '.js?timestamp='+(new Date()).getTime()+'\''))
  131. .pipe($.replace(/.css\?timestamp=.*?\'/g, '.css?timestamp='+(new Date()).getTime()+'\''))
  132. .pipe(gulp.dest(path.join(config.paths.src, '/app/constant')));
  133. });
  134. gulp.task('other:vendor', function() {
  135. return gulp.src([
  136. path.join(config.paths.src, '/vendor/**/*')
  137. ])
  138. .pipe($.filter(function(file) {
  139. return file.stat.isFile();
  140. }))
  141. .pipe(gulp.dest(path.join(config.paths.dist, '/vendor')));
  142. });
  143. gulp.task('other:plug', ['other:plug:css'], function() {
  144. return gulp.src([
  145. path.join(config.paths.src, '/plug/**/*.js'),
  146. ])
  147. .pipe($.filter(function(file) {
  148. return file.stat.isFile();
  149. }))
  150. .pipe($.stripDebug())
  151. .pipe($.uglify())
  152. .pipe(gulp.dest(path.join(config.paths.dist, '/plug')));
  153. });
  154. gulp.task('other:plug:css', function() {
  155. return gulp.src([
  156. path.join(config.paths.src, '/plug/**/*'),
  157. path.join('!' + config.paths.src, '/plug/**/*.scss'),
  158. path.join('!' + config.paths.src, '/plug/**/*.js')
  159. ])
  160. .pipe(gulp.dest(path.join(config.paths.dist, '/plug')));
  161. });
  162. gulp.task('plug:compass', function() {
  163. return gulp.src(path.join(config.paths.src, '/plug/**/*.scss'))
  164. .pipe(sass().on("error", sass.logError))
  165. .pipe(gulp.dest(path.join(config.paths.src, '/plug')));
  166. });
  167. gulp.task('other:libs', function() {
  168. return gulp.src([
  169. path.join(config.paths.src, '/libs/**/*')
  170. ])
  171. .pipe($.filter(function(file) {
  172. return file.stat.isFile();
  173. }))
  174. .pipe(gulp.dest(path.join(config.paths.dist, '/libs')));
  175. });
  176. gulp.task('other:assets', function() {
  177. return gulp.src([
  178. path.join(config.paths.src, '/app/assets/**/*')
  179. ])
  180. .pipe($.filter(function(file) {
  181. return file.stat.isFile();
  182. }))
  183. .pipe(gulp.dest(path.join(config.paths.dist, '/assets')));
  184. });
  185. gulp.task('build', $.sequence('prod-config', ['clean:dist', 'html'], ['images', 'fonts'], 'other:vendor', 'other:plug', 'other:libs', 'other:assets'));
  186. gulp.task('build:e2e', $.sequence('test-config', ['clean:dist', 'html'], ['images', 'fonts'], 'other:vendor', 'other:assets'));