gulpfile.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. 'use strict';
  2. // npm插件
  3. const gulp = require('gulp'),
  4. ts = require('gulp-typescript'),
  5. tsProject = ts.createProject('tsconfig.json'),
  6. replace = require('gulp-batch-replace'),
  7. htmlMin = require('gulp-htmlmin'),
  8. sass = require('gulp-sass'),
  9. clean = require('gulp-clean'),
  10. browserSync = require('browser-sync').create(),
  11. autoPrefixer = require('gulp-autoprefixer'),
  12. cleanCSS = require('gulp-clean-css'),
  13. imageMin = require('gulp-imagemin'),
  14. ifElse = require('gulp-if-else'),
  15. runSequence = require('run-sequence');
  16. // 定义统一常量
  17. var config = {
  18. product: false,
  19. src: "src",
  20. dist: "dist",
  21. serverRoot: "./dist"
  22. }
  23. // 处理 TypeScript 文件
  24. gulp.task('typescript', function () {
  25. tsProject.src()
  26. .pipe(tsProject())
  27. .js
  28. .pipe(ifElse(config.product, replace.bind(this, [
  29. ['\n', ' '],
  30. [/\s*=\s*/g, '='],
  31. [/\s*,\s*/g, ','],
  32. [/\s*\{\s*/g, '{'],
  33. [/\s*}\s*/g, '}'],
  34. [/\s+/g, ' ']
  35. ])))
  36. .pipe(gulp.dest(config.dist));
  37. });
  38. // 处理 HTML 文件
  39. gulp.task('html', function () {
  40. return gulp.src(config.src + '/**/*.html')
  41. .pipe(ifElse(config.product, htmlMin.bind(this, {
  42. collapseWhitespace: true
  43. })))
  44. .pipe(gulp.dest(config.dist));
  45. });
  46. // 处理 Sass 文件
  47. gulp.task('sass', function () {
  48. return gulp.src(config.src + '/**/*.scss')
  49. .pipe(sass().on('error', sass.logError))
  50. .pipe(autoPrefixer({
  51. browsers: ["Firefox >= 38",
  52. "Safari >= 7",
  53. "Chrome >= 26",
  54. "IE >= 10",
  55. "Opera >= 12"
  56. ]
  57. }))
  58. .pipe(ifElse(config.product, cleanCSS))
  59. .pipe(gulp.dest(config.dist));
  60. });
  61. // 复制不需要处理的文件
  62. gulp.task('copy', function () {
  63. return gulp.src([
  64. config.src + '/**/*.txt',
  65. config.src + '/**/*.xml',
  66. config.src + '/**/*.pdf'
  67. ])
  68. .pipe(gulp.dest(config.dist));
  69. });
  70. // 处理字体文件
  71. gulp.task('font', function () {
  72. return gulp.src([
  73. config.src + '/**/*.{eot,svg,ttf,woff,woff2}'
  74. ])
  75. .pipe(gulp.dest(config.dist));
  76. });
  77. // 处理 css 文件
  78. gulp.task('css', function () {
  79. return gulp.src([
  80. config.src + '/**/*.css'
  81. ])
  82. .pipe(autoPrefixer({
  83. browsers: ["Firefox >= 38",
  84. "Safari >= 7",
  85. "Chrome >= 26",
  86. "IE >= 10",
  87. "Opera >= 12"
  88. ]
  89. }))
  90. .pipe(ifElse(config.product, cleanCSS))
  91. .pipe(gulp.dest(config.dist));
  92. });
  93. // 处理 js 文件
  94. gulp.task('js', function () {
  95. return gulp.src([
  96. config.src + '/**/*.js'
  97. ])
  98. .pipe(ifElse(config.product, replace.bind(this, [
  99. ['\n', ' '],
  100. [/\s*=\s*/g, '='],
  101. [/\s*,\s*/g, ','],
  102. [/\s*\{\s*/g, '{'],
  103. [/\s*}\s*/g, '}'],
  104. [/\s+/g, ' ']
  105. ])))
  106. .pipe(gulp.dest(config.dist));
  107. });
  108. // 处理图片文件
  109. gulp.task('image', function () {
  110. gulp.src(config.src + '/**/*.{png,jpeg,jpg,gif,ico,cur}')
  111. .pipe(ifElse(config.product, imageMin))
  112. .pipe(gulp.dest(config.dist));
  113. });
  114. // 处理 json 文件
  115. gulp.task('json', function () {
  116. return gulp.src(config.src + '/**/*.json')
  117. .pipe(ifElse(config.product, replace.bind(this, [
  118. ['\n', ' '],
  119. [/\s*,\s*/g, ','],
  120. [/\s*\{\s*/g, '{'],
  121. [/\s*}\s*/g, '}'],
  122. [/\s+/g, ' ']
  123. ])))
  124. .pipe(gulp.dest(config.dist))
  125. });
  126. // 清除目录
  127. gulp.task('clean', function () {
  128. return gulp.src(config.dist, {
  129. read: false
  130. })
  131. .pipe(clean());
  132. });
  133. // 创建一个本地 Server
  134. gulp.task('serve', function () {
  135. browserSync.init({
  136. server: {
  137. baseDir: config.serverRoot
  138. }
  139. });
  140. });
  141. // 刷新浏览器中的页面
  142. gulp.task('reload', function () {
  143. browserSync.reload();
  144. });
  145. // 开启一个本地服务器,并文件变化时刷新页面
  146. gulp.task('serve:watch', ['serve'], function () {
  147. gulp.watch(config.src + '/**/*.ts', function () {
  148. runSequence(['typescript', 'reload']);
  149. });
  150. gulp.watch(config.src + '/**/*.json', function () {
  151. runSequence(['json', 'reload']);
  152. });
  153. gulp.watch(config.src + '/**/*.html', function () {
  154. runSequence(['html', 'reload']);
  155. });
  156. gulp.watch(config.src + '/**/*.scss', function () {
  157. runSequence(['sass', 'reload']);
  158. });
  159. gulp.watch(config.src + '/**/*.js', function () {
  160. runSequence(['js', 'reload']);
  161. });
  162. gulp.watch(config.src + '/**/*.css', function () {
  163. runSequence(['css', 'reload']);
  164. });
  165. gulp.watch(config.src + '/**/*.{png,jpeg,jpg,gif,ico}', function () {
  166. runSequence(['image', 'reload']);
  167. });
  168. gulp.watch([
  169. config.src + '/**/*.txt',
  170. config.src + '/**/*.xml'
  171. ], function () {
  172. runSequence(['copy', 'reload']);
  173. });
  174. });
  175. // 默认任务
  176. gulp.task('default', ['clean'], function () {
  177. gulp.start(['typescript', 'json', 'sass', 'image', 'copy', 'font', 'css', 'js', 'html']);
  178. });
  179. // 产品发布任务
  180. // 主要用于压缩所有的文件
  181. gulp.task('product', ['clean'], function () {
  182. config.product = true;
  183. gulp.start(['typescript', 'json', 'sass', 'image', 'copy', 'font', 'css', 'js', 'html']);
  184. });