javascript - 当我使用多种配置时,如何提取常见的 Encore 设置?
问题描述
下午好!我的问题是如何将配置的公共部分应用到多个配置中。换句话说,我怎样才能使多个配置从一个通用配置扩展而来?
我提供了一个简化的 Encore 配置来说明这个问题。在我原来webpack.config.js
的配置中,我还有 5 个配置,所以我重复了很多代码,它可以工作,但不是真正可维护的。
Symfony 文档中没有对此进行解释。
// FRONTEND CONFIGURATION
Encore
.setOutputPath("public/compiled/frontend/")
.setPublicPath("/compiled/frontend")
.addEntry("frontend", "./assets/entries/frontend/frontend.js")
.addPlugin(new WebpackBar({
name: "Frontend",
color: "blue",
}))
// Common configuration
.addAliases({
"@": path.resolve(__dirname, "assets", "js"),
styles: path.resolve(__dirname, "assets", "scss"),
fonts: path.resolve(__dirname, "assets", "fonts"),
})
.enableVueLoader();
const frontend = Encore.getWebpackConfig();
frontend.name = "frontend";
Encore.reset();
// AGENCY CONFIGURATION
Encore
.setOutputPath("public/compiled/agency/")
.setPublicPath("/compiled/agency")
.addEntry("agency", "./assets/entries/agency/agency.js")
.addPlugin(new WebpackBar({
name: "Agency",
color: "green",
}))
// Common configuration
.addAliases({
"@": path.resolve(__dirname, "assets", "js"),
styles: path.resolve(__dirname, "assets", "scss"),
fonts: path.resolve(__dirname, "assets", "fonts"),
})
.enableVueLoader();
const agency = Encore.getWebpackConfig();
agency.name = "agency";
Encore.reset();
module.exports = [frontend, agency];
共同部分
// Common configuration
.addAliases({
"@": path.resolve(__dirname, "assets", "js"),
styles: path.resolve(__dirname, "assets", "scss"),
fonts: path.resolve(__dirname, "assets", "fonts"),
})
.enableVueLoader();
解决方案
我在 Webpack Encore GitHub 页面上发布了我的问题,@Lyrkan 提供了一个非常干净且实用的解决方案,一个返回配置对象的函数。
https://github.com/symfony/webpack-encore/issues/849
我在这里发布他的解决方案,以防它对其他人有用:
const Encore = require('@symfony/webpack-encore');
const WebpackBar = require('webpackbar');
const path = require('path');
function getConfig({ outputPath, publicPath, name, color, entries }) {
// Make sure we start fresh
Encore.reset();
Encore
.setOutputPath(outputPath)
.setPublicPath(publicPath)
.addPlugin(new WebpackBar({
name,
color,
}))
.addAliases({
"@": path.resolve(__dirname, "assets", "js"),
styles: path.resolve(__dirname, "assets", "scss"),
fonts: path.resolve(__dirname, "assets", "fonts"),
})
.enableVueLoader();
for (const name in entries) {
Encore.addEntry(name, entries[name]);
}
const config = Encore.getWebpackConfig();
config.name = name;
return config;
}
// FRONTEND CONFIGURATION
const frontend = getConfig({
name: "Frontend",
color: "blue",
outputPath: "public/compiled/frontend/",
publicPath: "/compiled/frontend",
entries: {
"frontend": "./assets/entries/frontend/frontend.js"
}
});
// AGENCY CONFIGURATION
const agency = getConfig({
name: "Agency",
color: "green",
outputPath: "public/compiled/agency/",
publicPath: "/compiled/agency",
entries: {
"agency": "./assets/entries/agency/agency.js"
}
});
module.exports = [frontend, agency];```
推荐阅读
- c - 编程语言语法的 Bison Shift/Reduce Conflict
- oracle - 如何将游标内的记录转换为选择语句的列名?
- go - Colly 没有找到任何链接
- postgresql - PostgreSQL 将 SERIAL 列添加到现有表中,其值基于 ORDER BY
- javascript - JQuery animate() 没有动画
- arrays - 为什么不能使用 map() 函数迭代我的模型中的数组
- php - Dompdf 未在 php 标签内呈现内容
- ibm-watson - 使用 GraphQl 的 Watson 助手
- php - 使用mysql和php插入查询的问题
- ruby-on-rails - 如何使用 rails 初始化事件?