Guest User

Untitled

a guest
Dec 11th, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.62 KB | None | 0 0
  1. 'use strict'
  2. //plugins
  3. const gulp = require('gulp');
  4. const pug = require('gulp-pug');
  5. const sass = require('gulp-sass');
  6. const rename = require('gulp-rename');
  7. const sourcemaps = require('gulp-sourcemaps'); //для дебажа
  8. const del = require('del');
  9. const browserSync = require('browser-sync').create();
  10. const pngquant = require('imagemin-pngquant'); //сжатиe изображений
  11.  
  12. //gulp-load-plugins избавляет от необходимости явно подключать плагин в gulpfile.js, но не от необходимости устанавливать npm-модуль
  13. const gP = require('gulp-load-plugins')(); //автоматическоe подключениe плагинов
  14.  
  15. const pixelsToRem = require('postcss-pixels-to-rem');
  16. const uglify = require('gulp-uglify'); //минификации js-файлов
  17.  
  18. // const jquery = './node_modules/jquery/dist/jquery.js';
  19.  
  20.  
  21. //разобраться
  22. //const gulpWebpack = require('gulp-webpack');
  23. //const webpack = require('webpack');
  24. //const webpackConfig = require('./webpack.config.js');
  25.  
  26. //вспомогательная переменная для создания спрайта function svgSpriteBuild()
  27. const config = {
  28. mode: {
  29. symbol: {
  30. sprite: "../sprite.svg",
  31. render: {
  32. scss: {
  33. dest: '../../../../../sass/config/_sprite.scss'
  34. }
  35. },
  36. example: {
  37. dest: '../tmp/spriteSvgDemo.html' // демо html
  38. }
  39. }
  40. }
  41. };
  42.  
  43. //paths
  44. const paths = {
  45. //сразу указываем папку продакшена, корень проекта build
  46. root: './build',
  47. templates: {
  48. //-где лежат pages взять все файлы c расширением pug
  49. pages: 'src/templates/pages/*.pug',
  50. //-в templates все pug-файлы любой вложенности
  51. src: 'src/templates/**/*.pug',
  52. },
  53. styles: {
  54. src: 'src/styles/*.{scss,sass}', // в styles файлы *.{scss,sass}
  55. dest: 'build/assets/styles/'
  56. },
  57. images: {
  58. src: 'src/images/img/**/*.{png,jpg}', // в src/images/img/ в папках любой вложенности все файлы с расширением *.{png,jpg}
  59. dest: 'build/assets/images/'
  60. },
  61. scripts: {
  62. src: 'src/scripts/**/*.js', //все файла в папке и подпапках src/scripts/ с расширением .js
  63. dest: 'build/assets/scripts/'
  64. },
  65. svg: {
  66. src:'src/images/svg/**/*.svg',
  67. dest:'src/images/img/icons/sprite/'
  68. },
  69. svgSprite: {
  70. src: 'src/images/img/icons/sprite/sprite.svg',
  71. dest: 'build/assets/images/icons/sprite'
  72. },
  73. fonts: {
  74. src:'src/fonts/**/*.*',
  75. dest:'build/assets/fonts/'
  76. }
  77. };
  78.  
  79.  
  80. // pug
  81. function templates() {
  82. return gulp.src(paths.templates.pages) //берём файлы
  83. .pipe(pug({ pretty: true })) //компилируем, делаем красивые отступы
  84. .pipe(gulp.dest(paths.root)); //куда положить
  85. //.on('end', browserSync.reload); // в функции server browserSync.watch
  86. };
  87.  
  88. // scss стили и конвертация px в rem
  89. function styles() {
  90.  
  91. var plugins = [ pixelsToRem() ];
  92.  
  93. return gulp.src([paths.styles.src]) //исходный файл *.{scss,sass}
  94.  
  95. .pipe(gP.plumber({
  96. errorHandler: gP.notify.onError(function(error) {
  97. return {
  98. title: 'Styles',
  99. message: error.message
  100. };
  101. })
  102. }))
  103.  
  104. .pipe(sourcemaps.init()) //1.sourcemaps инициализация
  105. .pipe(sass({includePaths: require('node-normalize-scss').includePaths}))
  106. .pipe(sass({outputStyle: 'compressed'})) //2. компиляция в css
  107. .pipe(gP.concat('main.css')) //2a. 'склеивание'
  108. .pipe(gP.postcss(plugins)) //2b. .postcss анализирует css и вызывает pixelsToRem()
  109. .pipe(gP.autoprefixer({
  110. browsers: ['last 15 versions'],
  111. cascade: false
  112. }))
  113. .pipe(sourcemaps.write()) //3.sourcemaps запись
  114. .pipe(rename({suffix: '.min'})) //переименовали
  115. .pipe(gulp.dest(paths.styles.dest)) //куда положить
  116. //.pipe(browserSync.stream()); >> fn watch()
  117. };
  118.  
  119. // img переносим и минифицируем картинки
  120. function images() {
  121. return gulp.src(paths.images.src)
  122. //.plumber формирует вывод об ошибке
  123. .pipe(gP.plumber({
  124. errorHandler: gP.notify.onError(function(error) {
  125. return {
  126. title: 'Images',
  127. message: error.message
  128. };
  129. })
  130. }))
  131. .pipe(gP.imagemin({use: [pngquant()]}))
  132. .pipe(gulp.dest(paths.images.dest))
  133. };
  134.  
  135. // svg создание спрайта, демки и перенос в продакшн
  136. //создание спрайта и демки
  137. function svgSpriteBuild() {
  138. return gulp.src(paths.svg.src)
  139. // минифицируем svg
  140. .pipe(gP.svgmin({
  141. js2svg: {
  142. pretty: true
  143. }
  144. }))
  145. // удалить все атрибуты fill, style and stroke в фигурах. Парсит, но как работает?
  146. .pipe(gP.cheerio({
  147. run: function($) {
  148. $('[fill]').removeAttr('fill');
  149. $('[stroke]').removeAttr('stroke');
  150. $('[style]').removeAttr('style');
  151. },
  152. parserOptions: {
  153. xmlMode: true
  154. }
  155. }))
  156. // плагин gulp-replace заменит, если появилась, скобка '>', на нормальную.
  157. .pipe(gP.replace('>', '>'))
  158. // paths.svgdest:'src/images/img/icons/sprite/
  159. .pipe(gP.svgSprite(config))
  160. .pipe(gulp.dest(paths.svg.dest));
  161. }
  162. //копируем готовый спрайт из src-исходников в build-продакшен
  163. function svgSprite() {
  164. return gulp.src(paths.svgSprite.src)
  165. .pipe(gulp.dest(paths.svgSprite.dest));
  166. };
  167.  
  168. // fonts перекладываем из src в build
  169. function fonts() {
  170. return gulp.src(paths.fonts.src)
  171. .pipe(gP.plumber({
  172. errorHandler: gP.notify.onError(function(error) {
  173. return {
  174. title: 'Fonts',
  175. message: error.message
  176. };
  177. })
  178. }))
  179. .pipe(gulp.dest(paths.fonts.dest))
  180. };
  181.  
  182. // // normalize перекладываем из src в build
  183. // function normalizeFile() {
  184. // return gulp.src(normalize)
  185. // .pipe(gulp.dest(paths.normalize.dest))
  186. // }
  187.  
  188. //scripts
  189. function scripts() {
  190. return gulp.src(paths.scripts.src)
  191. .pipe(gP.plumber({
  192. errorHandler: gP.notify.onError(function(error) {
  193. return {
  194. title: 'Scripts',
  195. message: error.message
  196. };
  197. })
  198. }))
  199. .pipe(gP.sourcemaps.init()) //sourcemaps инициализация
  200. .pipe(uglify()) //минификация js-файлов
  201. .pipe(gP.concat('main.min.js')) // 'склеивание'
  202. .pipe(gP.sourcemaps.write()) //sourcemaps запись
  203. .pipe(gulp.dest(paths.scripts.dest)) // куда положить
  204. };
  205.  
  206. // очистка, удаляет все скомпилированные файлы, папку build
  207. function clean() {
  208. return del(paths.root);
  209. };
  210.  
  211. // watch галповский вотчер, (за чем следить, какую фун-ю вызывать)
  212. function watch() {
  213. gulp.watch(paths.styles.src, styles);
  214. gulp.watch(paths.templates.src, templates);
  215. gulp.watch(paths.images.src, images);
  216. gulp.watch(paths.scripts.src, scripts);
  217. gulp.watch(paths.svg.src, svgSpriteBuild);
  218. gulp.watch(paths.fonts.src, fonts);
  219. };
  220.  
  221. // локальный сервер + livereload (встроенный)
  222. function server() {
  223. browserSync.init({
  224. server: paths.root
  225. });
  226. //следит за папкой build + всеми файлами в ней, перезагружает при изменении
  227. browserSync.watch(paths.root + '/**/*.*', browserSync.reload);
  228. }
  229.  
  230. //для отладки, вызов функций из консоли
  231. exports.clean = clean;
  232. exports.templates = templates;
  233. exports.svgSpriteBuild = svgSpriteBuild;
  234. exports.svgSprite = svgSprite;
  235. exports.images = images;
  236. exports.fonts = fonts;
  237. exports.styles = styles;
  238. exports.scripts = scripts;
  239.  
  240.  
  241. // default
  242. gulp.task('default', gulp.series(
  243. clean,
  244. svgSpriteBuild,
  245. gulp.parallel(templates, styles, svgSprite, fonts, images, scripts),
  246. gulp.parallel(watch, server)
  247. ));
Add Comment
Please, Sign In to add comment