我目前正在开发一个应用程序,该应用程序使用不同的前端主题。这些主题只是 CSS 文件,用户可以选择它们。
从技术上讲,这些主题是 .scss 文件,通过 webpack 编译并通过标准链接标签在 angular 中加载:
从技术上讲,这些主题是 .scss 文件,通过 webpack 编译并通过标准链接标签在 angular 中加载:
<link rel="stylesheet", ng-href="themes/{{theme}}.css">
我的简化的 webpack 配置如下:theme1CssExtractor = new ExtractTextPlugin('themes/theme-1.css'),
theme2CssExtractor = new ExtractTextPlugin('themes/theme-2.css'),
module.exports = new WebpackConfig().merge({
entry: {
app: [
'./app/main.ts',
'./assets/sass/themes/theme-1.scss',
'./assets/sass/themes/theme-2.scss'
],
},
output: {
path: "build/",
filename: "[name].bundle.js",
publicPath: "/build/"
},
plugins: [
theme1CssExtractor,
theme2CssExtractor,
],
module: {
loaders: [
{
test: /\.ts$/,
loaders: ['awesome-typescript-loader']
},
[
{
test: /theme-1\.scss$/,
include: path.resolve(__dirname, "assets/sass/themes"),
loader: theme1CssExtractor.extract(
"style",
"css!sass?includePaths[]=" + path.resolve(__dirname, './node_modules/compass-mixins/lib')
)
},
{
test: /theme-2\.scss$/,
include: path.resolve(__dirname, "assets/sass/themes"),
loader: theme2CssExtractor.extract(
"style",
"css!sass?includePaths[]=" + path.resolve(__dirname, './node_modules/compass-mixins/lib')
)
}
]
]
}
在启用热模块替换(HMR)功能的webpack-dev-server中,extractTextPlugin不支持HMR,因此这种方法无法正常工作。如果简单禁用extractTextPlugin(options.disable)或将其删除,则所有主题都会编译到主模块中,这当然会破坏主题,因为所有主题都被一起应用。
如何直接使用webpack生成这些CSS文件而不使用extractTextPlugin?我尝试了各种尝试,包括不同的entries/chunks、file-loader等,但仍然没有真正解决问题。
应该很简单:从SCSS-Files生成静态CSS-Files,而不将它们转换为JS-Files,也不使用ExtractTextPlugin。
如果有人能指点我正确的方向,那将非常棒。