如何在 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无法以相同的方式导入有点烦人,但是嘿。
在我的项目中,我使用汇总从嵌套目录中的源文件编译了多个包。
我有一个包含以下代码的 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无法以相同的方式导入有点烦人,但是嘿。