有谁知道如何在 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
但是就我而言,就字体文件而言,输入过程有点抽象,我只知道输出。在我的其他文件正在进行转换的情况下,有一个已知点我需要它们然后由我的加载器处理。如果有办法找出这一步发生在哪里,我可以使用哈希方法自定义输出路径,但我不知道这些文件在哪里需要。
Webpack 确实支持多个输出路径。
将输出路径设置为入口键。并使用 name
作为输出模板。
网络包配置:
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
我不确定我们是否有同样的问题,因为截至 2016 年 6 月,webpack 仅支持每个配置一个输出。我猜您已经看到了 issue on 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,
];
如果它们之间有共同的配置,则可以使用 extend 库或 ES6 中的 Object.assign
或 ES7 中的 {...}
扩展运算符。
module{}
对象不正确。这不是必需的。它将在与关键字 name
、entry
、output
相同的级别进行扩展/合并(来自您的示例)。 <pre><代码> {模块:{模式:“开发”,开发工具:“源地图”}},名称:“a”,条目:“./a/app”,输出:{路径:“/a”,文件名:“捆绑.js" } } </code></pre>
您现在可以(从 Webpack v5.0.0 开始)使用新的“描述符”语法 (https://webpack.js.org/configuration/entry-context/#entry-descriptor) 为每个条目指定唯一的输出路径 -
module.exports = {
entry: {
home: { import: './home.js', filename: 'unique/path/1/[name][ext]' },
about: { import: './about.js', filename: 'unique/path/2/[name][ext]' }
}
};
如果您可以使用具有相同深度和文件夹结构的多个输出路径,则可以在 webpack 2 中执行此操作(尚未使用 webpack 1.x 进行测试)
基本上,您不遵循文档规则,而是提供了文件名的路径。
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
如果在所有答案之后不明显,您还可以输出到完全不同的目录(例如标准 dist
文件夹之外的目录)。您可以通过使用根目录作为路径(因为您只有一个路径)并将路径的完整“目录部分”移动到 entry
选项(因为您可以有多个条目)来做到这一点:
entry: {
'dist/main': './src/index.js',
'docs/main': './src/index.js'
},
output: {
filename: '[name].js',
path: path.resolve(__dirname, './'),
}
此配置导致创建 ./dist/main.js
和 ./docs/main.js
。
你绝对可以从你的 webpack.config 文件中返回配置数组。但是,如果您只想将工件的副本放在项目文档的文件夹中,这不是一个最佳解决方案,因为它会使 webpack 构建您的代码,使构建的总时间加倍。
在这种情况下,我建议改用 FileManagerWebpackPlugin 插件:
const FileManagerPlugin = require('filemanager-webpack-plugin');
// ...
plugins: [
// ...
new FileManagerPlugin({
onEnd: {
copy: [{
source: './dist/*.*',
destination: './public/',
}],
},
}),
],
请不要使用任何解决方法,因为它会影响构建性能。
Webpack 文件管理器插件
易于安装将此标签复制到 webpack.config.js 之上
const FileManagerPlugin = require('filemanager-webpack-plugin');
安装
npm install filemanager-webpack-plugin --save-dev
添加插件
module.exports = {
plugins: [
new FileManagerPlugin({
onEnd: {
copy: [
{source: 'www', destination: './vinod test 1/'},
{source: 'www', destination: './vinod testing 2/'},
{source: 'www', destination: './vinod testing 3/'},
],
},
}),
],
};
截屏
https://i.stack.imgur.com/KoV5F.png
events.onEnd.copy
就我而言,我有这种情况
const config = {
entry: {
moduleA: './modules/moduleA/index.js',
moduleB: './modules/moduleB/index.js',
moduleC: './modules/moduleB/v1/index.js',
moduleC: './modules/moduleB/v2/index.js',
},
}
我像这样解决它(webpack4)
const config = {
entry: {
moduleA: './modules/moduleA/index.js',
moduleB: './modules/moduleB/index.js',
'moduleC/v1/moduleC': './modules/moduleB/v1/index.js',
'moduleC/v2/MoculeC': './modules/moduleB/v2/index.js',
},
}
您只能有一个输出路径。
来自文档https://github.com/webpack/docs/wiki/configuration#output
影响编译输出的选项。输出选项告诉 Webpack 如何将编译后的文件写入磁盘。请注意,虽然可以有多个入口点,但只指定了一种输出配置。如果您使用任何散列([hash] 或 [chunkhash]),请确保模块的顺序一致。使用 OccurenceOrderPlugin 或 recordsPath。
我写了一个插件,希望能做你想做的事,你可以指定已知或未知的入口点(使用 glob)并指定确切的输出或使用入口文件路径和名称动态生成它们。 https://www.npmjs.com/package/webpack-entry-plus
实际上,我只是进入文件加载器模块中的 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;
你可以喜欢
var config = {
// TODO: Add common Configuration
module: {},
};
var x= Object.assign({}, config, {
name: "x",
entry: "./public/x/js/x.js",
output: {
path: __dirname+"/public/x/jsbuild",
filename: "xbundle.js"
},
});
var y= Object.assign({}, config, {
name: "y",
entry: "./public/y/js/FBRscript.js",
output: {
path: __dirname+"/public/fbr/jsbuild",
filename: "ybundle.js"
},
});
let list=[x,y];
for(item of list){
module.exports =item;
}
问题已经存在于语言中:
条目(这是一个对象(键/值),用于定义输入*)
输出(这是一个对象(键/值),用于定义输出*)
基于有限占位符(如“[name]”)区分输出的想法定义了限制。
我喜欢 webpack 的核心功能,但使用需要用基于逻辑和简单性的抽象定义重写……软件开发中最难的事情……逻辑和简单性。
所有这一切都可以通过提供输入/输出定义列表来解决……输入/输出定义列表。
Vinod Kumar's 好的解决方法是:
module.exports = {
plugins: [
new FileManagerPlugin({
events: {
onEnd: {
copy: [
{source: 'www', destination: './vinod test 1/'},
{source: 'www', destination: './vinod testing 2/'},
{source: 'www', destination: './vinod testing 3/'},
],
},
}
}),
],
};
dist
。因此,不应将module/a/index.js
作为输出路径,而应为module/a/dist/index.js
否则,您将覆盖您的入口文件。dist
文件夹已在输出路径中配置。所以生成的文件实际上是dist/module/a/index.js
,我没有提到。output.filename
函数来做到这一点:webpack.js.org/configuration/output/#outputfilename