Webpack 无法修复 CSS 覆盖问题并在 <head> 中捆绑 <style> 元素

瑞德万·沙克尔

在我的应用程序中,假设我有两个 JS 页面 A 和 B,每个页面都导入不同的样式表 ( import '../style/<A or B.css>')。
两个样式表具有相同的类名,但具有不同的属性。

我跑 yarn run dev ==> dev: webpack-dev-server --inline --hot ==> webpack -p

这就是我的 html 的<head>样子
https://imgur.com/a/1JVb5
页面 A 样式表先加载,然后页面 B css 样式加载

当我转到页面 B 时,css 是正确的
当我转到页面 A 时,css 被混淆,并且某些类样式被页面 B.css 覆盖。

我的项目结构就像

public/
 bundle.js
 index.html
src/
 components/
 pages/
 style/
 App.js
 index.js
 package.json
 webpack.config.js

我的 webpack.config.js 是

const path = require('path');

var config = {
    entry: path.resolve(__dirname, 'src', 'index.js'),
    output: {
        path: path.resolve(__dirname, 'public'),
        filename: 'bundle.js'
    },
    devServer: {
        contentBase: path.resolve(__dirname, 'src'),
        publicPath: path.resolve(__dirname, 'public')
    },
    module: {
        rules: [
        {
            test: /\.js$/,
            exclude: /(node_modules|bower_components)/,
            use: [
                { loader: 'babel-loader',
                options: { presets: ['react','env'] } }
            ]
        },
        {
            test: /\.css$/,
            use: [
                { loader: "style-loader?singleton", 
                  options: 
                  { singleton: true } 
                },
                { loader: "css-loader" }
            ]
        }
        ]
    }
};
module.exports = config;

我希望 Webpack 合并多个元素并修复 css 覆盖问题
在 Webpack 中,我已经尝试过style-loader?singleton{ singleton: true }但没有奏效。

编辑 1:查看 extract-text-webpack-plugin

编辑2:

import movieStyle from '../style/MovieDetail.css' 
... 
return (
<div id="CellDetail_right" className={ movieStyle['cell-detail-right'] }>...</div>
) 

好的,我添加了options: { modules: true }它没有用。我的 className 被连字符连接,并且在编译浏览器后呈现没有任何样式或类的组件。浏览器上的 Div 看起来像<div id="CellDetail_right">...<div>

卡洛路易斯

一种解决方案是启用局部范围的 css 以避免样式流血/覆盖。更新您的css-loader选项以包括modules: true

{
    test: /\.css$/,
    use: [
        {
            loader: "style-loader", 
            options: { singleton: true }
        },
        {
            loader: "css-loader",
            options: {
                modules: true,
                camelCase: 'dashes',
                localIdentName: '[path][name]__[local]'
            }
        }
    ]
}

然后,在您的组件中使用:

import styles from '../style/MovieDetail.css';

function MyComponent() {
    return (
        <div className={styles.container}>
            <div className={styles.cellDetailRight}>Some Content</div>
        </div>
    );
}

这可确保尽管您.container在其他 css 文件中定义了更多规则,但此特定规则变为类似._-path-to-component__container.

使用camelCase: 'dashes'in 选项转换您的连字符规则。

类名中的破折号将被骆驼化

您还可以查看我的webpack-demo项目,其中包含用于处理您的场景的配置。检查webpack 配置

阅读有关css-loader 选项的更多信息


在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章