gulpfile.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. var ENV = process.env.NODE_ENV;
  2. var IS_DEVELOPMENT;
  3. if (ENV !== 'development' && ENV !== 'production')
  4. throw new Error('NODE_ENV must be set to either development or production.');
  5. else
  6. IS_DEVELOPMENT = ENV === 'development';
  7. var gulp = require('gulp');
  8. var source = require('vinyl-source-stream');
  9. var browserify = require('browserify');
  10. var watchify = require('watchify');
  11. var babelify = require('babelify');
  12. var gulpif = require('gulp-if');
  13. var uglify = require('gulp-uglify');
  14. var streamify = require('gulp-streamify');
  15. var notify = require('gulp-notify');
  16. var cssmin = require('gulp-cssmin');
  17. var gutil = require('gulp-util');
  18. var sass = require('gulp-sass');
  19. var autoprefixer = require('gulp-autoprefixer');
  20. var sourcemaps = require('gulp-sourcemaps');
  21. var imagemin = require('gulp-imagemin');
  22. // external dependencies that are not rebundled while developing,
  23. // but included in production
  24. var dependencies = [
  25. 'react',
  26. 'react/addons',
  27. 'immutable'
  28. ];
  29. var browserifyTask = function() {
  30. var appBundler = browserify({
  31. entries: './src/js/index.js',
  32. transform: [babelify],
  33. debug: IS_DEVELOPMENT,
  34. // required by watchify
  35. cache: {}, packageCache: {}, fullPaths: IS_DEVELOPMENT
  36. });
  37. (IS_DEVELOPMENT ? dependencies : []).forEach(function(dep) {
  38. appBundler.external(dep);
  39. });
  40. var rebundle = function() {
  41. var start = Date.now();
  42. console.log('Building BROWSERIFY bundle');
  43. appBundler.bundle()
  44. .on('error', gutil.log)
  45. .pipe(source('index.js'))
  46. .pipe(gulpif(!IS_DEVELOPMENT, streamify(uglify())))
  47. .pipe(gulp.dest(IS_DEVELOPMENT ? './build/js/' : './dist/js/'))
  48. .pipe(notify(function() {
  49. gutil.log(gutil.colors.green('BROWSERIFY bundle built in ' +
  50. (Date.now() - start) + 'ms'));
  51. }));
  52. };
  53. if (IS_DEVELOPMENT) {
  54. appBundler = watchify(appBundler);
  55. appBundler.on('update', rebundle);
  56. }
  57. rebundle();
  58. if (IS_DEVELOPMENT) {
  59. var vendorBundler = browserify({
  60. debug: true,
  61. require: dependencies
  62. });
  63. var start = new Date();
  64. console.log('Building VENDOR bundle');
  65. vendorBundler.bundle()
  66. .on('error', gutil.log)
  67. .pipe(source('vendor.js'))
  68. .pipe(gulp.dest('./build/js/'))
  69. .pipe(notify(function() {
  70. gutil.log(gutil.colors.green(
  71. 'VENDOR bundle built in ' + (Date.now() - start) + 'ms'));
  72. }));
  73. }
  74. };
  75. var cssTask = function() {
  76. if (IS_DEVELOPMENT) {
  77. var run = function() {
  78. var start = new Date();
  79. console.log('Building CSS bundle');
  80. gulp.src('./src/css/main.scss')
  81. .pipe(sourcemaps.init())
  82. .pipe(sass({
  83. errLogToConsole: true
  84. }))
  85. .pipe(sourcemaps.write('./maps'))
  86. .pipe(gulp.dest('./build/css/'))
  87. .pipe(notify({
  88. message: function() {
  89. gutil.log(gutil.colors.green(
  90. 'CSS bundle built in ' + (Date.now() - start) + 'ms'));
  91. },
  92. onLast: true
  93. }));
  94. };
  95. run();
  96. gulp.watch('./src/css/*.scss', run);
  97. } else {
  98. gulp.src('./src/css/main.scss')
  99. .pipe(sass({
  100. errLogToConsole: true
  101. }))
  102. .pipe(autoprefixer({
  103. browsers: ['last 2 versions'],
  104. cascade: false
  105. }))
  106. .pipe(cssmin())
  107. .pipe(gulp.dest('./dist/css/'))
  108. .pipe(notify({
  109. message: function() {
  110. gutil.log(gutil.colors.green('CSS bundle built.'));
  111. },
  112. onLast: true
  113. }));
  114. }
  115. };
  116. var imageminTask = function() {
  117. gulp.src('./src/img/*')
  118. .pipe(imagemin({
  119. progressive: true,
  120. svgoPlugins: [{removeViewBox: false}]
  121. }))
  122. .pipe(gulp.dest('./' + (IS_DEVELOPMENT ? 'build' : 'dist') + '/img/'))
  123. .pipe(notify({
  124. message: function() {
  125. gutil.log(gutil.colors.green('IMAGES/SVG optimized.'));
  126. },
  127. onLast: true
  128. }));
  129. };
  130. gulp.task('default', function() {
  131. browserifyTask();
  132. cssTask();
  133. imageminTask();
  134. });