Webpack 2:SASS主题与Angular

Webpack 2:SASS主题与Angular

问题描述:

Webpack 2.2.1,Angular 2.4.7。Webpack 2:SASS主题与Angular

我使用SASS创建了一个包含多个主题的网站,但一直没有能够让Webpack为每个主题创建单独的CSS文件。 ExtractTextPlugin显示承诺,因为它为每个入口点创建一个单独的CSS文件,但不是我需要的特定主题。有没有办法让每个ThemeX.scss输出为/themes/ThemeX.css? 请注意,主题命名有所不同,但为了简洁起见,我使用的名称像ThemeA.css。它们实际上是Sales.css,Engineers.css等

为主题的实例目录结构:

src/assets/styles/themes/ThemeA/ThemeA.scss 
src/assets/styles/themes/ThemeB/ThemeB.scss 

的WebPack配置

const extractThemePlugin = new ExtractTextPlugin("themes/[name].css"); 

{ 
    test: /\.scss$/, 
    include: helpers.root('src/assets/styles/themes'), 
    use: extractThemePlugin.extract({ 
     fallback: "style-loader", 
     use: ["css-loader", "sass-loader"] 
    }) 
} 

plugins: [ extractThemePlugin, ...and others ] 

事我试过

1:设置每个ThemeX.scss文件作为切入点:

entry: {    
    'main': './src/main.browser.ts', 
    'themeA': helpers.root('src/assets/styles/themes/themeA/themeA.scss'), 
    'themeB': helpers.root('src/assets/styles/themes/themeB/themeB.scss') 
} 

它创建单独的文件,但他们每个人是另一个的副本,所以ThemeA.css,ThemeB。 css和ThemeC.css都包含ThemeA.css的内容。

2:导入根app.module.ts中的每个主题。这只是将文件捆绑到一个CSS文件中。

3:为每个主题创建一个ExtractTextPlugin实例。这也会创建具有重复内容的文件,类似于#1。

const extractThemeAPlugin = new ExtractTextPlugin("themes/themeA.css"); 
const extractThemeBPlugin = new ExtractTextPlugin("themes/themeB.css"); 

您可以使用您的WebPack的配置节多的正则表达式匹配,而不是只具有单一extracttext条目:

首先把这个在的WebPack配置的顶部:

let extractTheme1 = new ExtractTextPlugin('theme1.css'); 
let extractTheme2 = new ExtractTextPlugin('theme2.css'); 

然后在配置中:

{ 
    test: /\.scss$/i, 
    exclude: [ 
     /theme2\.scss$/i 
    ], 
    use: [extractTheme1.extract('css-loader'), 
     'css-loader', 
     'sass-loader' 
    ] 
}, 

// SCSS Loader 
{ 
    test: /theme2\.scss$/i, 
    use: [extractTheme2.extract('css-loader'), 
     'css-loader', 
     'sass-loader' 
    ] 
}, 

而在插件部分:

plugins: [ 
    ... 
    extractTheme1, 
    extractTheme2 
    ... 
] 
+0

这让我走上了正轨。而不是使用排除(因为我有5个以上的主题,这本来就是一场噩梦),我只是将测试设置为与每个主题相匹配。然后我必须包含HtmlWebpackExcludeAssetsPlugin以防止HtmlWebpackPlugin为每个主题创建链接元素。 –