gulpfile.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. var gulp = require('gulp');
  2. var loader = require('gulp-load-plugins')(); //按需加载插件,其他插件不用一个一个的引入
  3. var historyApiFallback = require('connect-history-api-fallback');
  4. var app = {
  5. srcPath: 'src/',
  6. distPath: 'dist/'
  7. };
  8. var htmlminOptions = {
  9. removeComments: false, //清除HTML注释
  10. collapseWhitespace: true, //压缩HTML
  11. collapseBooleanAttributes: true, //省略布尔属性的值 <input checked="true"/> ==> <input />
  12. removeEmptyAttributes: true, //删除所有空格作属性值 <input id="" /> ==> <input />
  13. removeScriptTypeAttributes: true, //删除<script>的type="text/javascript"
  14. removeStyleLinkTypeAttributes: true, //删除<style>和<link>的type="text/css"
  15. minifyJS: true, //压缩页面JS
  16. minifyCSS: true //压缩页面CSS
  17. };
  18. var vendors = [
  19. {
  20. dist: 'js/angular.js',
  21. src: 'vendor/angular/angular.js'
  22. },
  23. {
  24. dist: 'js/angular-route.js',
  25. src: 'vendor/angular-route/angular-route.js'
  26. },
  27. {
  28. dist: 'js/angular-animate.js',
  29. src: 'vendor/angular-animate/angular-animate.js',
  30. },
  31. {
  32. dist: 'js/angular-cookies.js',
  33. src: 'vendor/angular-cookies/angular-cookies.js',
  34. },
  35. {
  36. dist: 'js/jquery.js',
  37. src: 'vendor/jquery/dist/jquery.js',
  38. },
  39. {
  40. dist: 'js/semantic.js',
  41. src: 'vendor/semantic/dist/semantic.js'
  42. }
  43. ];
  44. gulp.task('dev_vendor', function (done) {
  45. gulp.src(vendors.map(function (item) { return item.src; }))
  46. .pipe(loader.plumber())
  47. .pipe(loader.ngAnnotate({ single_quotes: true }))
  48. .pipe(gulp.dest(app.distPath + 'js'))
  49. .pipe(loader.connect.reload());
  50. gulp.src('vendor/semantic/dist/themes/**/*.*')
  51. .pipe(loader.plumber())
  52. .pipe(gulp.dest(app.distPath + 'css/themes'))
  53. .pipe(loader.connect.reload());
  54. gulp.src('vendor/semantic/dist/semantic.css')
  55. .pipe(loader.plumber())
  56. .pipe(gulp.dest(app.distPath + 'css'))
  57. .pipe(loader.connect.reload());
  58. done();
  59. });
  60. gulp.task('vendor', function (done) {
  61. gulp.src(vendors.map(function (item) { return item.src; }))
  62. .pipe(loader.plumber())
  63. .pipe(loader.ngAnnotate({ single_quotes: true }))
  64. .pipe(loader.concat('vendor.min.js'))
  65. .pipe(loader.uglify())
  66. .pipe(gulp.dest(app.distPath + 'js'))
  67. .pipe(loader.connect.reload());
  68. gulp.src('vendor/semantic/dist/themes/**/*.*')
  69. .pipe(loader.plumber())
  70. .pipe(gulp.dest(app.distPath + 'css/themes'))
  71. .pipe(loader.connect.reload());
  72. gulp.src('vendor/semantic/dist/semantic.min.css')
  73. .pipe(loader.plumber())
  74. .pipe(gulp.dest(app.distPath + 'css'))
  75. .pipe(loader.connect.reload());
  76. done();
  77. });
  78. gulp.task('dev_views', function (done) {
  79. gulp.src([
  80. app.srcPath + 'app/**/*.html',
  81. app.srcPath + 'common/**/*.html'
  82. ], { allowEmpty: true })
  83. .pipe(loader.plumber())
  84. .pipe(loader.ngHtml2js({ prefix: 'app/', moduleName: 'appView' }))
  85. .pipe(loader.concat('views.js'))
  86. .pipe(gulp.dest(app.distPath + 'js'))
  87. .pipe(loader.connect.reload());
  88. done();
  89. });
  90. gulp.task('views', function (done) {
  91. gulp.src([
  92. app.srcPath + 'app/**/*.html',
  93. app.srcPath + 'common/**/*.html'
  94. ], { allowEmpty: true })
  95. .pipe(loader.plumber())
  96. .pipe(loader.htmlmin(htmlminOptions))
  97. .pipe(loader.ngHtml2js({ prefix: 'app/', moduleName: 'appView' }))
  98. .pipe(loader.uglify())
  99. .pipe(loader.concat('views.min.js'))
  100. .pipe(gulp.dest(app.distPath + 'js'))
  101. .pipe(loader.connect.reload());
  102. done();
  103. });
  104. gulp.task('dev_less', function (done) {
  105. gulp.src(app.srcPath + 'less/**/*.less')
  106. .pipe(loader.sourcemaps.init())
  107. .pipe(loader.plumber()) //源自于gulp-plumber,处理错误进程,输出错误日志
  108. .pipe(loader.less())
  109. .pipe(loader.sourcemaps.write()) //文件底部写入sourcemaps
  110. .pipe(loader.concat('app.css'))
  111. .pipe(gulp.dest(app.distPath + 'css'))
  112. .pipe(loader.connect.reload());
  113. done();
  114. });
  115. gulp.task('less', function (done) {
  116. gulp.src(app.srcPath + 'less/**/*.less')
  117. .pipe(loader.sourcemaps.init())
  118. .pipe(loader.plumber()) //源自于gulp-plumber,处理错误进程,输出错误日志
  119. .pipe(loader.less())
  120. .pipe(loader.sourcemaps.write()) //文件底部写入sourcemaps
  121. .pipe(loader.minifyCss()) //压缩css成一行
  122. .pipe(loader.concat('app.min.css'))
  123. .pipe(gulp.dest(app.distPath + 'css'))
  124. .pipe(loader.connect.reload());
  125. done();
  126. });
  127. gulp.task('dev_js', function (done) {
  128. gulp.src(app.srcPath + '**/*.js')
  129. .pipe(loader.plumber())
  130. .pipe(loader.ngAnnotate({ single_quotes: true })) // 自动注入
  131. .pipe(loader.concat('app.js')) //合并成一个名为index.js文件
  132. .pipe(gulp.dest(app.distPath + 'js'))
  133. .pipe(loader.connect.reload());
  134. done();
  135. });
  136. gulp.task('js', function (done) {
  137. gulp.src(app.srcPath + '**/*.js')
  138. .pipe(loader.plumber())
  139. .pipe(loader.ngAnnotate({ single_quotes: true })) // 自动注入
  140. .pipe(loader.uglify()) //源自于gulp-uglify,功能压缩js
  141. .pipe(loader.concat('app.min.js')) //合并成一个名为index.js文件
  142. .pipe(gulp.dest(app.distPath + 'js'))
  143. .pipe(loader.connect.reload());
  144. done();
  145. });
  146. gulp.task('images', function (done) {
  147. gulp.src(app.srcPath + 'assets/images/*.*')
  148. .pipe(loader.plumber())
  149. .pipe(gulp.dest(app.distPath + 'images'))
  150. .pipe(loader.connect.reload());
  151. done();
  152. });
  153. gulp.task('fonts', function (done) {
  154. gulp.src([
  155. app.srcPath + '**/*.woff2',
  156. app.srcPath + '**/*.woff',
  157. app.srcPath + '**/*.eot',
  158. app.srcPath + '**/*.ttf',
  159. app.srcPath + '**/*.otf',
  160. app.srcPath + '**/*.svg'
  161. ])
  162. .pipe(gulp.dest(app.distPath))
  163. .pipe(loader.connect.reload());
  164. done();
  165. });
  166. gulp.task('dev_index', function(done) {
  167. gulp.src(app.srcPath + 'index.html')
  168. .pipe(loader.plumber())
  169. .pipe(loader.htmlReplace({
  170. css: ['css/semantic.css', 'css/app.css'],
  171. vendor: vendors.map(function (item) { return item.dist; }),
  172. js: ['js/views.js', 'js/app.js']
  173. }))
  174. .pipe(gulp.dest(app.distPath))
  175. .pipe(loader.connect.reload());
  176. done();
  177. });
  178. gulp.task('index', function(done) {
  179. gulp.src(app.srcPath + 'index.html')
  180. .pipe(loader.plumber())
  181. .pipe(loader.htmlmin(htmlminOptions))
  182. .pipe(loader.htmlReplace({
  183. css: ['css/semantic.min.css', 'css/app.min.css'],
  184. vendor: ['js/vendor.min.js'],
  185. js: ['js/views.min.js', 'js/app.min.js']
  186. }))
  187. .pipe(gulp.dest(app.distPath))
  188. .pipe(loader.connect.reload());
  189. done();
  190. });
  191. gulp.task('clean', function (done) {
  192. gulp.src(app.distPath, { allowEmpty: true }).pipe(loader.clean());
  193. done();
  194. });
  195. // gulp.parallel 并行执行, gulp.series 串行执行
  196. gulp.task('build', gulp.series('vendor', 'views', 'less', 'js', 'images', 'fonts', 'index'));
  197. gulp.task('dev_build', gulp.series('dev_vendor', 'dev_views', 'dev_less', 'dev_js', 'images', 'fonts', 'dev_index'))
  198. gulp.task('serve', function () {
  199. //gulp.watch 监听任务,目录下的之资源changed,执行任务流
  200. gulp.watch('vendor/**/*', gulp.series('dev_vendor', 'dev_index'));
  201. gulp.watch(app.srcPath + '**/*.html', gulp.series('dev_views', 'dev_index'));
  202. gulp.watch(app.srcPath + 'less/*.less', gulp.series('dev_less', 'dev_index')); //当所有src/less下的 .less文件发生改变时,调用less任务
  203. gulp.watch(app.srcPath + '**/*.js', gulp.series('dev_js', 'dev_index'));
  204. gulp.watch(app.srcPath + 'assets/**/*.*', gulp.series('images'));
  205. loader.connect.server({ //前端启动服务,源自于gulp-connect
  206. root: [app.distPath], //服务启动的根目录
  207. livereload: true, //即时刷新
  208. port: 8000, //端口
  209. middleware: function (connect, opt) {
  210. return [historyApiFallback()];
  211. }
  212. });
  213. });
  214. gulp.task('default', gulp.series('clean', function () {
  215. gulp.start('serve');
  216. }));