webpack 4:创建多个主题 css 文件

Posted

技术标签:

【中文标题】webpack 4:创建多个主题 css 文件【英文标题】:webpack 4: Create multiple theme css files 【发布时间】:2019-09-04 20:11:14 【问题描述】:

我需要在我的 react 项目中使用 webpack 版本 4 和“迷你 CSS 提取插件”创建多个主题 CSS 文件。取决于 webpack 找到 SCSS 文件导入的位置,它应该使用 loader 两次 - 在 sass-loader 选项中使用不同的数据。

根据这个目标,我在 Internet 上没有发现任何有用的东西。我也已经尝试过使用 webpack 的加载器,例如:webpack-combine-loaders、multi-loader 等......

这是 webpack 配置的一部分

module: 
  rules: [
    
       test: /\.scss$/,
       use: [
         
           loader: MiniCssExtractPlugin.loader,
         ,
         'css-loader',
         
            loader: "sass-loader",
            options: 
               data: '$theme: dark;',
            
         ,
       ],
     ,
      // the same except data in options
       test: /\.scss$/,
       use: [
         
           loader: MiniCssExtractPlugin.loader,
         ,
         'css-loader',
         
            loader: "sass-loader",
            options: 
               data: '$theme: white;',
            
         ,
       ],
     ,
  ],
,
plugins: [
  new MiniCssExtractPlugin(
    filename: 'client.white.css',
  ),
  new MiniCssExtractPlugin( 
    filename: 'client.dark.css',
  ),
],

在我的 scss 文件 (button.scss) 中,我使用了这样的条件:

$background: #06cc1a;
$color: white;

@if $theme == dark 
  $background: white;
  $color: black;


.button 
    background-color: $background;
    color: $color;
  

因此,我想获得两个 CSS 文件 client.white.css,其中应用了白色主题的 sass 变量和 client.dark.css,其中应用了深色主题的变量

【问题讨论】:

【参考方案1】:

我们在项目中通过使用多个入口点解决了这个问题,每个主题一个入口点,例如:

entry: 
    light: './src/css/light.scss',
    dark: './src/css/dark.scss'

light.scss 文件内容如下:

$background: #001560;    

@import "~base/scss/base.scss";

Webpack 将为每个主题输出一个单独的 css 文件,其中包含所有样式,包括基本样式和特定于主题的样式,这在优化生产时非常有用。

请注意,您还会得到一个多余的 JS 文件,您可能需要在构建后清理它。

【讨论】:

这是可能的解决方案之一,但是创建冗余 js 文件的情况有点烦人。在我们的项目中,我们必须编写自己的带有插件的 webpack 加载器来解决这个问题 确实 js 文件很烦人 @AvrelDusop 你在 Github 上有那个加载器吗? @ItayGanor 这个问题(和接受的答案)有一个例子:***.com/a/39401288/195306【参考方案2】:

我开发了一个使用多主题的网络应用程序,我们通过将每个主题的颜色保存到后端来解决这个问题,因此我们可以根据查询从 API 中获取值,对于样式,我们使用 styled-components .

我发现 css-in-js 在这类问题中非常有用。我们实际上使用样式化组件和 LESS css 来进行样式化。 styled-components 用于基于主题的着色,其余的在 LESS css 上。也许您也可以尝试使用它,或者甚至内联 css 也应该完成这项工作,因为 JS 变量可以解决这个问题。

一个具体的例子是构建一个ThemeProvider 组件,它将整个应用程序作为它的子应用程序,ThemeProvider 将包含使用styled-components 的类声明,并且该类可以在整个应用程序范围内重用。

【讨论】:

Styled-components 这绝对不是一个好主意,一团糟。让我们分离css和js组件。 我实际上同意你的看法,我也鄙视样式组件,但它成功了,所以我留下了@AvrelDusop

以上是关于webpack 4:创建多个主题 css 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 webpack 提取多个主题样式表?

关闭 css 的单独块,vue cli 3 webpack 4

Webpack:将 JS 转换为 SASS 和 CSS

Vue:webpack 没有在生产中加载 css

提取主题感知样式的 CSS 差异

Webpack:从相同的源生成多个 css 文件