gulpfile.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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: true, //清除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. gulp.task('vendor', function (done) {
  19. gulp.src([
  20. 'vendor/angular/angular.js',
  21. 'vendor/angular-ui-router/release/angular-ui-router.js',
  22. 'vendor/angular-animate/angular-animate.js',
  23. 'vendor/angular-cookies/angular-cookies.js',
  24. 'vendor/jquery/dist/jquery.js',
  25. 'vendor/semantic/dist/semantic.js'
  26. ])
  27. .pipe(loader.plumber())
  28. .pipe(loader.ngAnnotate({ single_quotes: true }))
  29. .pipe(loader.concat('vendor.min.js'))
  30. .pipe(loader.uglify())
  31. .pipe(gulp.dest(app.distPath + 'js'))
  32. .pipe(loader.connect.reload());
  33. gulp.src('vendor/semantic/dist/themes/**/*.*')
  34. .pipe(loader.plumber())
  35. .pipe(gulp.dest(app.distPath + 'css/themes'))
  36. .pipe(loader.connect.reload());
  37. gulp.src('vendor/semantic/dist/semantic.min.css')
  38. .pipe(loader.plumber())
  39. .pipe(gulp.dest(app.distPath + 'css'))
  40. .pipe(loader.connect.reload());
  41. done();
  42. });
  43. gulp.task('views', function (done) {
  44. gulp.src([
  45. app.srcPath + 'app/**/*.html',
  46. app.srcPath + 'common/**/*.html'
  47. ], { allowEmpty: true })
  48. .pipe(loader.plumber())
  49. .pipe(loader.htmlmin(htmlminOptions))
  50. .pipe(loader.ngHtml2js({ prefix: 'app/', moduleName: 'Views' }))
  51. .pipe(loader.uglify())
  52. .pipe(loader.concat('views.min.js'))
  53. .pipe(gulp.dest(app.distPath + 'js'))
  54. .pipe(loader.connect.reload());
  55. done();
  56. });
  57. gulp.task('less', function (done) {
  58. gulp.src(app.srcPath + 'less/**/*.less')
  59. .pipe(loader.sourcemaps.init())
  60. .pipe(loader.plumber()) //源自于gulp-plumber,处理错误进程,输出错误日志
  61. .pipe(loader.less())
  62. .pipe(loader.sourcemaps.write()) //文件底部写入sourcemaps
  63. .pipe(loader.minifyCss()) //压缩css成一行
  64. .pipe(loader.concat('app.min.css'))
  65. .pipe(gulp.dest(app.distPath + 'css'))
  66. .pipe(loader.connect.reload());
  67. done();
  68. });
  69. gulp.task('js', function (done) {
  70. gulp.src(app.srcPath + '**/*.js')
  71. .pipe(loader.plumber())
  72. .pipe(loader.ngAnnotate({ single_quotes: true })) // 自动注入
  73. .pipe(loader.concat('app.min.js')) //合并成一个名为index.js文件
  74. .pipe(loader.uglify()) //源自于gulp-uglify,功能压缩js
  75. .pipe(gulp.dest(app.distPath + 'js'))
  76. .pipe(loader.connect.reload());
  77. done();
  78. });
  79. gulp.task('images', function (done) {
  80. gulp.src(app.srcPath + 'assets/images/*.*')
  81. .pipe(loader.plumber())
  82. .pipe(gulp.dest(app.distPath + 'images'))
  83. .pipe(loader.connect.reload());
  84. done();
  85. });
  86. gulp.task('fonts', function (done) {
  87. gulp.src([
  88. app.srcPath + '**/*.woff2',
  89. app.srcPath + '**/*.woff',
  90. app.srcPath + '**/*.eot',
  91. app.srcPath + '**/*.ttf',
  92. app.srcPath + '**/*.otf',
  93. app.srcPath + '**/*.svg'
  94. ])
  95. .pipe(gulp.dest(app.distPath))
  96. .pipe(loader.connect.reload());
  97. done();
  98. });
  99. gulp.task('index', function(done) {
  100. gulp.src(app.srcPath + 'index.html')
  101. .pipe(loader.plumber())
  102. .pipe(loader.htmlmin(htmlminOptions))
  103. .pipe(gulp.dest(app.distPath))
  104. .pipe(loader.connect.reload());
  105. done();
  106. });
  107. gulp.task('clean', function (done) {
  108. gulp.src(app.distPath, { allowEmpty: true }).pipe(loader.clean());
  109. done();
  110. });
  111. // gulp.parallel 并行执行, gulp.series 串行执行
  112. gulp.task('build', gulp.series('vendor', 'views', 'less', 'js', 'images', 'fonts', 'index'));
  113. gulp.task('serve', function () {
  114. //gulp.watch 监听任务,目录下的之资源changed,执行任务流
  115. gulp.watch('vendor/**/*', gulp.series('vendor'));
  116. gulp.watch(app.srcPath + '**/*.html', gulp.series('views'));
  117. gulp.watch(app.srcPath + 'less/*.less', gulp.series('less')); //当所有src/less下的 .less文件发生改变时,调用less任务
  118. gulp.watch(app.srcPath + '**/*.js', gulp.series('js'));
  119. gulp.watch(app.srcPath + 'assets/**/*.*', gulp.series('images'));
  120. loader.connect.server({ //前端启动服务,源自于gulp-connect
  121. root: [app.distPath], //服务启动的根目录
  122. livereload: true, //即时刷新
  123. port: 8000, //端口
  124. middleware: function (connect, opt) {
  125. return [historyApiFallback()];
  126. }
  127. });
  128. });
  129. gulp.task('default', gulp.series('clean', function () {
  130. gulp.start('serve');
  131. }));