为什么 Gulp 以错误的顺序连接我的输出?

Why is Gulp concatenating my output in the wrong order?

如下面 gulpfile.js 所示,我正在尝试将 jQuery、bootstrap.js 和来自子文件夹的 Javascript 片段集合编译成单个 app.js输出文件。它正在工作,只是子文件夹中的片段出现在 app.js 输出文件的顶部,在 jQuery 被加载之前。

如何确保这些文件以正确的顺序输出?

const { src, dest, watch, series, parallel } = require('gulp');
const concat = require('gulp-concat');
const uglify = require('gulp-uglify');
var merge2 = require('merge2');

const files = {
  jsSrcPath: [
    '../node_modules/jquery/dist/jquery.js',
    '../node_modules/bootstrap/dist/js/bootstrap.js',
    'js/*.js'
  ],
  jsDstPath: '../public/js'
}

function jsTask(){
  return merge2(files.jsSrcPath.map(function (file) {
    return src(file)
  }))
  .pipe(concat('app.js'))
  .pipe(uglify())
  .pipe(dest(files.jsDstPath));
}

function watchTask(){
    watch(files.jsSrcPath, jsTask);
}

exports.default = series(
    jsTask,
    watchTask
);

这里有一些内部问题,在我的测试中我看到顺序有时是随机的,有时基于修改时间,有时是按顺序。在任何情况下,最好使用一种工具来确保我们的流始终按照我们想要的顺序进行。

gulp-order 就是为了这个目的而存在的。它可以采用您已有的特定路径和 glob 语法,因此您可以将其重新传递给插件:

const { src, dest, watch, series, parallel } = require('gulp');
const concat = require('gulp-concat');
const uglify = require('gulp-uglify');
const order = require('gulp-order'); // Added
var merge2 = require('merge2');

const files = {
  jsSrcPath: [
    '../node_modules/jquery/dist/jquery.js',
    '../node_modules/bootstrap/dist/js/bootstrap.js',
    'js/*.js'
  ],
  jsDstPath: 'dist'
}

function jsTask() {
  return merge2(files.jsSrcPath.map(function (file) {
    return src(file)
  }))
    .pipe(order(files.jsSrcPath)) // Added
    .pipe(concat('app.js'))
    .pipe(uglify())
    .pipe(dest(files.jsDstPath));
}

function watchTask() {
  watch(files.jsSrcPath, jsTask);
}

exports.default = series(
  jsTask,
  watchTask
);