【问题标题】:How to output files to the parent of their source directory using Webpack in Gulp?如何在 Gulp 中使用 Webpack 将文件输出到其源目录的父目录?
【发布时间】:2016-11-10 02:10:55
【问题描述】:

到目前为止,我有这个代码,我得到了from here

var gulp = require('gulp');
var webpack = require('webpack-stream');
var named = require('vinyl-named');

gulp.task('default', function() {
  return gulp.src('*/lib/app.js', { base: '.' })
    .pipe(named())
    .pipe(webpack())
    .pipe(gulp.dest('.'));
});

我的文件夹结构是这样的:

site1/lib/app.js
site2/lib/app.js

我想创建如下所示的输出文件,每个文件只包含它们各自的 lib/app.js 文件的代码(以及其中制作的任何 require()):

site1/app.js
site2/app.js

但是,我现在的代码只是输出到项目的根目录。我尝试了几种组合,例如删除{ base: '.' },但没有任何效果。但是,如果我删除 named()webpack() 管道,那么当前代码实际上会输出到正确的目录。那么,在这个过程中,Webpack 似乎丢失了原始目录信息?

另外,是否有可能获得一个也适用于 Webpack 的“watch: true”选项的解决方案,以便快速编译修改后的文件,而不是使用 Gulp 在每次文件更改时始终遍历每个文件?

【问题讨论】:

    标签: javascript node.js gulp webpack


    【解决方案1】:

    我假设您想为每个站点创建一个app.js,该站点包含该站点(而不是其他站点)的代码。

    在这种情况下,您可以使用gulp-foreach 有效地迭代所有app.js 文件并将每个文件发送到自己的流中。然后你可以使用node.js内置的path module找出每个app.js文件的父目录在哪里,并用gulp.dest()写在那里。

    var gulp = require('gulp');
    var webpack = require('webpack-stream');
    var named = require('vinyl-named');
    var foreach = require('gulp-foreach');
    var path = require('path');
    
    gulp.task('default', function() {
      return gulp.src('*/lib/app.js')
        .pipe(foreach(function(stream, file) {
          var parentDir = path.dirname(path.dirname(file.path));
          return stream
            .pipe(named())
            .pipe(webpack())
            .pipe(gulp.dest(parentDir));
        }));
    });
    

    如果您想使用webpack({watch:true}),您将不得不使用不同的方法。下面使用glob 遍历所有app.js 文件。每个app.js 文件再次向下发送自己的流,但是这次所有流在返回之前都是merged

    var gulp = require('gulp');
    var webpack = require('webpack-stream');
    var named = require('vinyl-named');
    var path = require('path');
    var merge = require('merge-stream');
    var glob = require('glob');
    
    gulp.task('default', function() {
      return merge.apply(null, glob.sync('*/lib/app.js').map(function(file) {
        var parentDir = path.dirname(path.dirname(file));
        return gulp.src(file)
          .pipe(named())
          .pipe(webpack({watch:true}))
          .pipe(gulp.dest(parentDir));
      }));
    });
    

    【讨论】:

    • 如果我这样做,那么 Webpack 的“watch: true”会起作用,还是因为它为每个流创建一个新的观察者而不起作用?
    • 不起作用,因为第一个观察者会阻止一切。您必须使用常规的gulp.watch() 而不是webpack({watch:true})。如果您真的想使用webpack({watch:true}),则必须合并各个流(请参阅我的编辑)。
    • 好的,谢谢。此外,是否可以通过 gulp-coffee 或 gulp-concat 运行源文件来修改源文件,然后以某种方式将其传递给 Webpack?我在尝试时收到错误 // Unhandled stream error in pipe.
    • 不同的主题。为此打开一个新问题。
    • 好的,谢谢。 Here it is.
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2017-07-02
    • 2016-07-05
    • 1970-01-01
    相关资源
    最近更新 更多