Конкат скрипты по порядку с глотком
скажем, например, вы строите проект на магистрали или что-то еще, и вам нужно загрузить скрипты в определенном порядке, например underscore.js
должен быть загружен перед backbone.js
.
как мне получить его, чтобы объединить скрипты, чтобы они были в порядке?
// JS concat, strip debugging and minify
gulp.task('scripts', function() {
gulp.src(['./source/js/*.js', './source/js/**/*.js'])
.pipe(concat('script.js'))
.pipe(stripDebug())
.pipe(uglify())
.pipe(gulp.dest('./build/js/'));
});
у меня есть правильный порядок скриптов в моем source/index.html
, но так как файлы организованы в алфавитном порядке, глоток будет конкат underscore.js
после backbone.js
, и порядок скриптов в моем source/index.html
не имеет значения, он смотрит на файлы в каталоге.
так кто-нибудь есть идея по этому поводу?
лучшая идея у меня есть, чтобы переименовать скрипты поставщика с 1
,2
,3
чтобы дать им надлежащий порядок, но я не уверен, что мне это нравится.
как я узнал больше, я нашел Browserify является отличным решением, это может быть боль на первый взгляд, но это здорово.
15 ответов:
недавно у меня была аналогичная проблема с Grunt при создании моего приложения AngularJS. Вот это вопрос Я в курсе.
то, что я в конечном итоге сделал, - это явно перечислить файлы по порядку в конфигурации grunt. Так это выглядело:
[ '/path/to/app.js', '/path/to/mymodule/mymodule.js', '/path/to/mymodule/mymodule/*.js' ]
и все работает. И грант, по-видимому, достаточно умен, чтобы не включать один и тот же файл дважды.
это работает то же самое с глотком.
еще одна вещь, которая помогает, если вам нужны некоторые файлы, чтобы прийти после большой двоичный объект файлов, чтобы исключить определенные файлы из вашего глобуса, например:
[ '/src/**/!(foobar)*.js', // all files that end in .js EXCEPT foobar*.js '/src/js/foobar.js', ]
вы можете объединить это с указанием файлов, которые должны быть первыми, как описано в ответе чада Джонсона.
я использовал плагин gulp-order, но он не всегда успешен, как вы можете видеть по моему сообщению о переполнении стека модуль узла gulp-order с Объединенными потоками. При просмотре документов Gulp я наткнулся на модуль streamque, который довольно хорошо работал для указания порядка конкатенации в моем случае. https://github.com/gulpjs/gulp/blob/master/docs/recipes/using-multiple-sources-in-one-task.md
пример того, как я использовал его ниже
var gulp = require('gulp'); var concat = require('gulp-concat'); var handleErrors = require('../util/handleErrors'); var streamqueue = require('streamqueue'); gulp.task('scripts', function() { return streamqueue({ objectMode: true }, gulp.src('./public/angular/config/*.js'), gulp.src('./public/angular/services/**/*.js'), gulp.src('./public/angular/modules/**/*.js'), gulp.src('./public/angular/primitives/**/*.js'), gulp.src('./public/js/**/*.js') ) .pipe(concat('app.js')) .pipe(gulp.dest('./public/build/js')) .on('error', handleErrors); });
С помощью gulp-useref вы можете объединить каждый скрипт, объявленный в вашем индексном файле, в том порядке, в котором вы его объявляете.
https://www.npmjs.com/package/gulp-useref
var $ = require('gulp-load-plugins')(); gulp.task('jsbuild', function () { var assets = $.useref.assets({searchPath: '{.tmp,app}'}); return gulp.src('app/**/*.html') .pipe(assets) .pipe($.if('*.js', $.uglify({preserveComments: 'some'}))) .pipe(gulp.dest('dist')) .pipe($.size({title: 'html'})); });
и в HTML вы должны объявить имя файла сборки, который вы хотите создать, например:
<!-- build:js js/main.min.js --> <script src="js/vendor/vendor.js"></script> <script src="js/modules/test.js"></script> <script src="js/main.js"></script>
в вашем каталоге сборки вы будете иметь ссылку на main.минута.js, который будет содержать поставщика.Яш, тест.js, и главное.js
The sort-stream может также использоваться для обеспечения определенного порядка файлов с
gulp.src
. Пример кода, который ставитbackbone.js
всегда как последний файл для обработки:var gulp = require('gulp'); var sort = require('sort-stream'); gulp.task('scripts', function() { gulp.src(['./source/js/*.js', './source/js/**/*.js']) .pipe(sort(function(a, b){ aScore = a.path.match(/backbone.js$/) ? 1 : 0; bScore = b.path.match(/backbone.js$/) ? 1 : 0; return aScore - bScore; })) .pipe(concat('script.js')) .pipe(stripDebug()) .pipe(uglify()) .pipe(gulp.dest('./build/js/')); });
У меня есть свои сценарии, организованные в разных папках для каждого пакета, который я вытаскиваю из bower, а также мой собственный скрипт для моего приложения. Поскольку вы собираетесь где-то перечислить порядок этих скриптов, почему бы просто не перечислить их в своем файле gulp? Для новых разработчиков в вашем проекте приятно, что все конечные точки вашего сценария перечислены здесь. Вы можете сделать это с помощью gulp-add-src:
gulpfile.js
var gulp = require('gulp'), less = require('gulp-less'), minifyCSS = require('gulp-minify-css'), uglify = require('gulp-uglify'), concat = require('gulp-concat'), addsrc = require('gulp-add-src'), sourcemaps = require('gulp-sourcemaps'); // CSS & Less gulp.task('css', function(){ gulp.src('less/all.less') .pipe(sourcemaps.init()) .pipe(less()) .pipe(minifyCSS()) .pipe(sourcemaps.write('source-maps')) .pipe(gulp.dest('public/css')); }); // JS gulp.task('js', function() { gulp.src('resources/assets/bower/jquery/dist/jquery.js') .pipe(addsrc.append('resources/assets/bower/bootstrap/dist/js/bootstrap.js')) .pipe(addsrc.append('resources/assets/bower/blahblah/dist/js/blah.js')) .pipe(addsrc.append('resources/assets/js/my-script.js')) .pipe(sourcemaps.init()) .pipe(concat('all.js')) .pipe(uglify()) .pipe(sourcemaps.write('source-maps')) .pipe(gulp.dest('public/js')); }); gulp.task('default',['css','js']);
Примечание: jQuery и Bootstrap добавлено для демонстрационных целей заказа. Вероятно, лучше использовать CDNs для тех, кто так широко используется, и браузеры могут уже кэшировать их с других сайтов.
Я просто добавляю числа в начало имени файла:
0_normalize.scss 1_tikitaka.scss main.scss
Он работает в глотке без каких-либо проблем.
попробовать stream-series. Он работает как merge-stream/событие-трансляция.merge () за исключением того, что вместо чередования, он добавляет в конец. Он не требует от вас, чтобы указать режим объекта как streamqueue, Так что ваш код выходит чище.
var series = require('stream-series'); gulp.task('minifyInOrder', function() { return series(gulp.src('vendor/*'),gulp.src('extra'),gulp.src('house/*')) .pipe(concat('a.js')) .pipe(uglify()) .pipe(gulp.dest('dest')) });
альтернативным методом является использование плагина Gulp, созданного специально для этой проблемы. https://www.npmjs.com/package/gulp-ng-module-sort
Это позволяет сортировать скрипты, добавляя в
.pipe(ngModuleSort())
такие как:var ngModuleSort = require('gulp-ng-module-sort'); var concat = require('gulp-concat'); gulp.task('angular-scripts', function() { return gulp.src('./src/app/**/*.js') .pipe(ngModuleSort()) .pipe(concat('angularAppScripts.js)) .pipe(gulp.dest('./dist/)); });
предполагая, что соглашение каталога:
|——— src/ | |——— app/ | |——— module1/ | |——— sub-module1/ | |——— sub-module1.js | |——— module1.js | |——— module2/ | |——— sub-module2/ | |——— sub-module2.js | |——— sub-module3/ | |——— sub-module3.js | |——— module2.js | |——— app.js
надеюсь, что это помогает!
Я имел natualSort() и angularFileSort() в трубу, которая была переупорядочение файлов. Я удалил его и теперь он работает для меня
$.inject( // app/**/*.js files gulp.src(paths.jsFiles) .pipe($.plumber()), // use plumber so watch can start despite js errors //.pipe($.naturalSort()) //.pipe($.angularFilesort()), {relative: true}))
Я просто использую gulp-angular-filesort
function concatOrder() { return gulp.src('./build/src/app/**/*.js') .pipe(sort()) .pipe(plug.concat('concat.js')) .pipe(gulp.dest('./output/')); }
Я нахожусь в модуле environnement, где все являются основными зависимыми, используя gulp. Итак,
core
модуль должен быть добавлен перед другим.что я сделал:
- переместить все скрипты в
src
папку- просто
gulp-rename
код
Если вы хотите заказать зависимости сторонних библиотек, попробуйте wiredep. Этот пакет в основном проверяет каждую зависимость пакета в bower.затем json свяжет их для вас.
merge2 выглядит как единственный работающий и поддерживаемый упорядоченный инструмент слияния потоков на данный момент.
я попробовал несколько решений с этой страницы, но ни один не работал. У меня была серия пронумерованных файлов, которые я просто хотел упорядочить по алфавитному имени папки, поэтому при передаче в
concat()
они будут в том же порядке. То есть, сохранить порядок подстановка ввода. Полегче, Да?вот мой конкретный концептуальный код (
var order = require('gulp-order'); var gulp = require('gulp'); var print = require('gulp-print').default; var options = {}; options.rootPath = { inputDir: process.env.INIT_CWD + '/Draft', inputGlob: '/**/*.md', }; gulp.task('default', function(){ gulp.src(options.rootPath.inputDir + options.rootPath.inputGlob, {base: '.'}) .pipe(order([options.rootPath.inputDir + options.rootPath.inputGlob])) .pipe(print()); });
причина безумия
gulp.src
? Я решил, чтоgulp.src
был запуск асинхронного, когда я смог использовать