使用 Gulp 按顺序连接脚本

IT技术 javascript gulp
2021-02-27 23:20:44

举例来说,您正在 Backbone 或其他任何地方构建一个项目,并且您需要按特定顺序加载脚本,例如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/'));
});

我在 my 中有正确的脚本顺序source/index.html,但是由于文件是按字母顺序组织的,gulp 将underscore.js在 之后连接backbone.js,并且 mysource/index.html脚本的顺序无关紧要,它会查看目录中的文件。

那么有人对此有什么想法吗?

我有最好的办法是重新命名与供应商的脚本123给他们以正确的顺序,但我不知道如果我喜欢这个。

随着我了解更多,我发现 Browserify 是一个很好的解决方案,起初可能会很痛苦,但它很棒。

6个回答

最近在构建我的 AngularJS 应用程序时,我在 Grunt 上遇到了类似的问题。这是我发布一个问题

我最终做的是在 grunt 配置中按顺序明确列出文件。配置文件将如下所示:

[
  '/path/to/app.js',
  '/path/to/mymodule/mymodule.js',
  '/path/to/mymodule/mymodule/*.js'
]

Grunt 能够找出哪些文件是重复的而不包括它们。同样的技术也适用于 Gulp。

顺便说一下,这在 gulp 下也能正常工作。Gulp 也不会重复文件。
2021-04-18 23:20:44
帅哥,这两个杰作太棒了。我终于将我的 gulp.js 文件设置为按我想要的方式工作,用一些 html 编写,保存文件并通过按一下按钮来构建一个使用最佳框架和良好实践构建的站点。加上更新将很容易,如果您不需要使用任何一种!
2021-04-25 23:20:44
是的!我最近开始使用 Grunt,它很棒。不再在后端框架中嵌入 JavaScript 应用程序。
2021-04-26 23:20:44
在我的尝试中,Gulp 正在复制文件,但我意识到我在 gulp 与文件系统中的情况不同,所以请注意这一点!在确切的情况下,gulp 不会复制文件。
2021-04-27 23:20:44
手动订购是严肃项目中的噩梦。有特殊的文件分类器 - 用于 angularjs 和其他。
2021-04-27 23:20:44

如果您需要一堆文件之后出现一些文件,另一件事是从您的 glob 中排除特定文件,如下所示:

[
  '/src/**/!(foobar)*.js', // all files that end in .js EXCEPT foobar*.js
  '/src/js/foobar.js',
]

您可以将此与指定需要首先出现的文件结合起来,如 Chad Johnson 的回答中所述。

啊,我实际上早些时候看到了你的帖子,它帮助我向我src我的注入代码,我build看到你使用这种语法,我最终删除了那部分,因为我不确定我为什么需要它,现在很有意义。
2021-05-05 23:20:44
对于 AngularJS 应用程序,我的module定义驻留在名称中没有“破折号”的文件中,这个 Gulp glob 模式有效; ['src/app/**/!(*-)*.js', 'src/app/**/*.js']
2021-05-06 23:20:44
哦,好吧,所以你的观点刚好击中了我,这不会让 foobar.js 持续下去吗?不应该是相反的。['./source/js/*.js', './source/js/**/underscore.js', './source/js/**/!(underscore)*.js']
2021-05-09 23:20:44
是的,这更多只是额外的一点帮助。当您需要或希望您的核心应用程序代码在加载其他所有内容后进入时,它最有用。!(foobar)如果您事先包含了特定文件,则没有理由使用它 ( )。
2021-05-12 23:20:44

我已经使用了 gulp-order 插件,但它并不总是成功,正如您在我的堆栈溢出后gulp-order 节点module与合并流中看到的那样在浏览 Gulp 文档时,我遇到了 streamque module,它在我的案例中指定顺序连接非常有效。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 插件根本无法始终如一地工作(就像您指出的顺序一样),这是一种耻辱,因为 gulp 的架构概念非常壮观,只是我认为有很多人实施和维护他们的插件很差......我发现底层节点module更有用,所以感谢您提供此解决方案!效果很好!
2021-04-17 23:20:44
流队列,事件流对我不起作用,但 merge2 按预期工作npmjs.com/package/merge2
2021-05-01 23:20:44
另见流系列它不需要您指定对象模式,并且可以与 gulp-inject 一起使用。看我的回答。
2021-05-09 23:20:44

使用 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.min.js 的引用,其中将包含 vendor.js、test.js 和 main.js

太棒了!我讨厌需要定义顺序的答案!你知道吗?顺序在那里:在 HTML 文件中。完美的解决方案。
2021-05-06 23:20:44

类型的流也可用于确保文件的具体顺序用gulp.srcbackbone.jsalways 作为要处理的最后一个文件的示例代码

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/'));
});
@JeremyJohn 您应该能够使用 return a.path.localeCompare(b.path, undefined, { numeric: true })
2021-04-21 23:20:44
我希望这个module能工作,因为它对我来说似乎是最简单的答案,但在我的情况下,我有编号的文件名和一个非常简单的比较函数,这不起作用。
2021-05-15 23:20:44