Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
gulp-rigger — это просто киллер фича. Плагин позволяет импортировать один файл в другой простой конструкцией
@import "CSS:../../bower_components/normalize.css/normalize.css";
var gulp = require('gulp'),
watch = require('gulp-watch'),
prefixer = require('gulp-autoprefixer'),
uglify = require('gulp-uglify'),
cssmin = require('gulp-cssmin'),
sass = require('gulp-sass'),
sourcemaps = require('gulp-sourcemaps'),
rigger = require('gulp-rigger'),
imagemin = require('gulp-imagemin'),
pngquant = require('imagemin-pngquant'),
rimraf = require('rimraf'),
connect = require('gulp-connect'),
opn = require('opn');
var plugins = require('gulp-load-plugins')();
Конечно не обязательно делать это именно так. Существует плагин gulp-load-plugins который позволяет не писать всю эту лапшу из require. Но мне нравится когда я четко вижу что и где подключается, и при желании могу это отключить. По этому пишу по старинке.
<title>Я собираю проекты как рок звезда</title>
И вот какая. В тексте допущены 2 грамматичческие ошибки. Содержание же текста говорит, что автор «подобен профессионалу своего дела». Суть не в том, что рок-звезда допустит подобные ошибки. Он(а) в своей деятельности вообще ничего не пишет, кроме муз.композиций. Но никто не может сказать, что в песнях звезда ошибается. В тексте же HTML автор допускает ошибки, противореча своему высказыванию. (Программисту вообще трудно утверждать, что он пишет без багов.) Поэтому, надо или утверждение изменить, или исправить ошибки.build.js, где делать все, что угодно и как угодно, не ограничиваясь плагинами gulp, которые по сути обертки над пакетами npm. В том числе вы можете использовать и стримы, и gulp, и что угодно, без каких-либо ограничений."scripts" с нативными пайпами вместо стримов.gulpfile.js в проекте; вы используете декларативную нотацию тасков, что весьма читабельно; новый пользователь может узнать все возможные операции для проекта прямо из package.json, в одном месте, что удобно; наконец, вы используете нативный инструмент, который гарантированно будет существовать долго и всегда включает все возможные пакеты, в отличие от систем сборки, где их может недоставать.var gulp = require('gulp');
var _if = require('gulp-if');
// опущу подключение остальных плагинов
var production = process.env.NODE_ENV === 'production';
gulp.task('less', function () {
gulp.src('src/less/**/*.less')
.pipe(plumber()) // не даем ошибкам всплывать
.pipe(_if(!production, sourcemaps.init())) // для сорсмепов в дев-режиме
.pipe(less()) // компилируем less
.pipe(autoprefixer()) // расставляем префиксы для браузеров
.pipe(_if(production, csso())) // в продакшене жмем
.pipe(_if(!production, sourcemaps.write())) // пишем сормепы в дев-режиме
.pipe(gulp.dest('public/css')) // пишем на диск
.pipe(_if(production, gzip())) // если продакшен - жмем gzip
.pipe(_if(production, gulp.dest('public/css'))) // и тоже записываем на диск
});
gulp.task('default', ['less'], function () {
gulp.watch('src/less/**/*.less', ['less']);
});
"scripts": {
"build": "node build.js",
"watch": "watch 'npm run build' ./src/**/*"
}
find *.less -exec cat {} и тд и тп). В то же время на виндах и в gulp с globules не все гладко."scripts": {
"build-dev": "npm run lessc-dev && npm run build-js && cat public/css/*.css | gzip-size | pretty-bytes",
"lessc-dev": "lessc src/less/main.less --source-map | autoprefixer > public/css/main.css",
"lessc-production": "lessc src/less/main.less | autoprefixer | csso > public/css/main.css ",
"build-js": "browserify src/js/index.js | ccjs - > public/js/index.js",
"watch": "watch 'npm run lessc-dev' less/*.less"
...
}
dev или к production оно относится. А если появятся переменная ci? 
bower update jquerynpm install jquery
var $ = require('jquery');
gulp.src('app/bower-manifest.html')
.pipe($.filter(manifestFilter))
.pipe(wiredep(wiredepConfig))
.pipe($.usemin({
js: [$.sourcemaps.init(), $.uglify(), $.rev(), $.sourcemaps.write('.')]
}))
где $ — ссылка на gulp-load-pluginsотдельное спасибо.
'use strict';
var gulp = require('gulp');
var plugins = require('gulp-load-plugins')({
pattern: ['gulp-*', 'main-*'] //это необходимо для плагина main-bower-files
});
var path = {
build: {
js: 'dist/js'
}
};
//установка зависимостей
gulp.task('bower', function() {
return plugins.bower();
});
//сборка зависимостей
gulp.task("bower-files", function(){
gulp.src(plugins.mainBowerFiles())
.pipe(plugins.uglify())
.pipe(plugins.concat('all.js'))
.pipe(gulp.dest(path.build.js))
});
"dependencies": {
"angular": "1.3.13",
"jquery":"1.2.2",
"some-another-package": "0.0.1"
},
"overrides": {
"some-another-package": {
"dependencies": {
"jquery": "*"
},
"main": {
"development": ["some-another-package.js"],
"production": ["some-another-package.min.js"],
}
}
}
"dependencies": {
...
"flot-splines": "https://raw.githubusercontent.com/AMKohn/flot/master/jquery.flot.spline.js",
...
},
...
"overrides": {
"flot-splines": {
"main": [
"index.js"
],
"dependencies": {
"flot": "*"
}
}
}
// amd
define(['./foo', './bar'], (foo, bar) => {
console.log({foo, bar});
});
// common
var foo = require('./foo');
var bar = require('./bar');
console.log({foo, bar});
к тому же отдельная css с dataURI весит в полтора раза больше, чем спрайт
<i class="icon"></i>
Приятная сборка frontend проекта