如何在Webpack配置中创建多个输出路径


165

有谁知道如何在webpack.config.js文件中创建多个输出路径?我正在使用bootstrap-sass,它带有一些不同的字体文件,等等。为了使webpack能够处理这些,我包括了可以正常工作的文件加载器,但是将其输出的文件保存到了我指定的输出路径中我其余的文件:

    output: {
      path: __dirname + "/js",
      filename: "scripts.min.js"
    }

我想实现一些功能,以便我可以查看Webpack输出的扩展类型以及以.woff .eot结尾的扩展名等,将其转移到其他输出路径。这可能吗?

我做了一些谷歌搜索,在github上发现了这个* issue,其中提供了一些解决方案,请编辑:

但似乎您需要了解能够使用哈希方法指定输出的入口点,例如:

var entryPointsPathPrefix = './src/javascripts/pages';
var WebpackConfig = {
  entry : {
    a: entryPointsPathPrefix + '/a.jsx',
    b: entryPointsPathPrefix + '/b.jsx',
    c: entryPointsPathPrefix + '/c.jsx',
    d: entryPointsPathPrefix + '/d.jsx'
  },

  // send to distribution
  output: {
    path: './dist/js',
    filename: '[name].js'
  }
}

* https://github.com/webpack/webpack/issues/1189

但是就我而言,就字体文件而言,输入过程有点抽象,我所知道的只是输出。对于我的其他文件进行转换的情况,有一个已知的点,即我要求将这些文件由加载程序处理。如果有办法找出发生此步骤的位置,那么我可以使用哈希方法自定义输出路径,但是我不知道这些文件在哪里。

Answers:


220

我不确定我们是否存在相同的问题,因为从2016年6月开始,Webpack每种配置仅支持一个输出。我想您已经在Github上看到了这个问题

但是我使用multi-compiler分隔了输出路径。(即,分离的配置对象webpack.config.js)。

var config = {
    // TODO: Add common Configuration
    module: {},
};

var fooConfig = Object.assign({}, config, {
    name: "a",
    entry: "./a/app",
    output: {
       path: "./a",
       filename: "bundle.js"
    },
});
var barConfig = Object.assign({}, config,{
    name: "b",
    entry: "./b/app",
    output: {
       path: "./b",
       filename: "bundle.js"
    },
});

// Return Array of Configurations
module.exports = [
    fooConfig, barConfig,       
];

如果它们之间具有通用配置,则可以在ES6中使用扩展库或在ES7中使用扩展运算符。Object.assign{...}


我没有跑的片段,一些错误或者可能出现错字
杨荣文

我确实运行了您的代码片段,就像魅力一样...……前端开发人员,没人耐心,总是很着急;-)感到惊讶。我以相同的方式导出配置,但是我的声明是不同的/标准的:var config = {entry:SOURCE_DIR +'/index.jsx',....}也未使用任何多编译器:-\
Aubergine

或者你可以在npm中做一个webpack && cp等
SuperUberDuper'7

1
这对我将npm软件包部署在原始文件夹(有自动测试)以及实现该软件包的应用程序的文件夹中非常有用。这样,我可以跳过npm下载步骤,并实时测试更新的软件包代码,直到新版本稳定并准备在npm上发布。
阿德里安·莫伊萨

<pre> <code> var config = {// TODO:添加通用配置模块:{},}; </ code> </ pre> module{}对象不正确。不是必需的 在同一水平作为关键字将扩展/合并nameentryoutput(从你的例子)。<pre> <code> {模块:{模式:“ development”,devtool:“ source-map”}},名称:“ a”,输入:“ ./a/app”,输出:{路径:“ / a ”,文件名:“ bundle.js”}} </ code> </ pre>
Rob Waa

249

Webpack确实支持多个输出路径。

将输出路径设置为输入键。并使用nameas作为输出模板。

webpack配置:

entry: {
    'module/a/index': 'module/a/index.js',
    'module/b/index': 'module/b/index.js',
},
output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js'
}

产生:

└── module
    ├── a
    │   └── index.js
    └── b
        └── index.js

4
就我而言,我希望一个输出不包含chunkhash,对此有任何简单的解决方案吗?谢谢。
raRaRa

1
@zhengkenghong我相信生成的输出路径将需要dist在其中。因此module/a/index.js,您应该module/a/dist/index.js覆盖输入文件,而不是将其作为输出路径。
dance2die

1
@Sung dist文件夹已在输出路径中配置。因此生成的文件实际上是dist/module/a/index.js,我没有提到。
zhengkenghong

4
我认为这应该是可接受的答案,因为它是来自webpack 4文档的答案。- > webpack.js.org/concepts/output/#multiple-entry-points
威尔

1
@raRaRa晚了聚会,但是您可以通过使用output.filename此处记录的功能来做到这一点:webpack.js.org/configuration/output/#outputfilename
Thomas

22

如果您可以使用具有相同深度和文件夹结构级别的多个输出路径,则可以在webpack 2中进行此操作(尚未使用webpack 1.x进行测试)

基本上,您不遵循doc规则,而是提供文件名的路径。

module.exports = {
    entry: {
      foo: 'foo.js',
      bar: 'bar.js'
    },

    output: {
      path: path.join(__dirname, 'components'),
      filename: '[name]/dist/[name].bundle.js', // Hacky way to force webpack   to have multiple output folders vs multiple files per one path
    }
};

这将采用此文件夹结构

/-
  foo.js
  bar.js

并变成

/-
  foo.js
  bar.js
  components/foo/dist/foo.js
  components/bar/dist/bar.js

@ccnixon在此处记录了 webpack.js.org/configuration/output/#outputfilename搜索“仍然允许”。
约翰·亨克尔


3

您绝对可以从webpack.config文件中返回配置数组。但是,如果您只希望将工件副本放在项目文档的文件夹中,则这不是最佳解决方案,因为它会使webpack生成代码的时间加倍,从而使生成时间增加了一倍。

在这种情况下,我建议改用FileManagerWebpackPlugin插件:

const FileManagerPlugin = require('filemanager-webpack-plugin');
// ...
plugins: [
    // ...
    new FileManagerPlugin({
      onEnd: {
        copy: [{
          source: './dist/*.*',
          destination: './public/',
        }],
      },
    }),
],

1

您只能有一个输出路径。

来自文档https://github.com/webpack/docs/wiki/configuration#output

影响编译输出的选项。输出选项告诉Webpack如何将编译后的文件写入磁盘。请注意,虽然可以有多个入口点,但是仅指定一种输出配置。

如果使用任何哈希([hash]或[chunkhash]),请确保模块的顺序一致。使用OccurenceOrderPlugin或recordsPath。


谢谢。我将离开Q,以防万一有人可以提出解决方法。
spb

您需要2条输出路径的用例是什么?听起来您需要2个应用程序或1个应用程序和1个模块。
前zac-tly

我以为我需要一个专用于文件加载器生成的输出的文件,该文件全部进入了项目的根目录,而我希望将其放在自己的文件夹中。我总结了一下,只是按照下面的答案重定向了加载程序本身的输出路径。
spb

1
这不是完全正确的。从技术上讲,您只能指定一个输出路径,但是它将应用于条目对象中的每个键,从而使您可以有多个输出-webpack.js.org/concepts/entry-points
sanjsanj

0

实际上,我只想进入文件加载器模块中的index.js并更改将内容发送到的位置。这可能不是最佳解决方案,但是除非有其他方法,否则就很好了,因为我确切地知道此加载程序正在处理什么,这只是字体。

//index.js
var loaderUtils = require("loader-utils");
module.exports = function(content) {
    this.cacheable && this.cacheable();
    if(!this.emitFile) throw new Error("emitFile is required from module system");
    var query = loaderUtils.parseQuery(this.query);
    var url = loaderUtils.interpolateName(this, query.name || "[hash].[ext]", {
        context: query.context || this.options.context,
        content: content,
        regExp: query.regExp
    });
    this.emitFile("fonts/"+ url, content);//changed path to emit contents to "fonts" folder rather than project root
    return "module.exports = __webpack_public_path__ + " + JSON.stringify( url) + ";";
}
module.exports.raw = true;

1
不知道这是否仍然是您的问题,请看一看 npmjs.com/package/webpack-entry-plus
sanjsanj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.