如何在 gulp 中混合使用 promises 和 pipe?

How do I mix promises and pipe in gulp?

在我的项目中,我使用汇总从嵌套目录中的源文件编译了多个包。

我有一个包含以下代码的 gulp 文件,它运行良好:

function build_app_js(file, name) {
  return gulp.src(file)
    .pipe(sourcemaps.init())
    .pipe(rollup({format:'iife'}))
    .pipe(terser())
    .pipe(rename(name + '.js'))
    .pipe(rename({suffix: '.min'}))
    .pipe(sourcemaps.write())
    .pipe(gulp.dest(js_apps_dir))
}
// call the above for multiple sets of file+app_name

但是后来我将我通过相对路径访问的 ES6 代码中的一个依赖项更改为一个 npm 包,所以它现在在 node_modules 中。 Rollup 需要一个插件来解决这个问题,所以我把上面的改成这样:

   .pipe(rollup({plugins: [resolveNodeModules()], format:'iife'}))

然而这根本行不通。

我在 gulp 上查阅了 rollup 的 docs,并根据我的情况调整了示例,所以现在看起来像这样:

function build_app_js(file, name) {
  return rollup.rollup({
    input: file,
    plugins: [
      resolveNodeModules()
    ]
  }).then(bundle => {
    return bundle.write({
      file: js_apps_dir + '/' + name + '.js',
      format: 'iife',
      sourcemap: true
    });
  });
}

这有效,但没有缩小步骤,我不知道如何添加一个。

更一般地说,这是与使用 pipe() 完全不同的范例,我不知道如何使两者一起工作。

我是尝试在 Promise 语法中添加缩小,还是以可以与管道一起使用的方式包装 Promise 函数?

8 天后回答自己的问题。

可以通过汇总插件实现缩小,例如 rollup-plugin-terser

您只需要小心导入它们的方式:

var rollup = require('rollup');
var resolveNodeModules = require('rollup-plugin-node-resolve');
//var terser = require('rollup-plugin-terser'); // WRONG
var {terser} = require('rollup-plugin-terser'); // CORRECT

function build_app_js(file, name) {
  return rollup.rollup({
    input: file,
    plugins: [
      resolveNodeModules(),
      terser()
    ]
  }).then(bundle => {
    return bundle.write({
      file: js_apps_dir + '/' + name + '.js',
      format: 'iife',
      sourcemap: true
    });
  });
}

如果以错误的方式导入它,您将得到一个 terser() is not a function 类型错误,这是因为它将 terser 作为一个模块导入。

不同的rollup-plugins无法以相同的方式导入有点烦人,但是嘿。