Javascript 使用Typescript、Webpack4和React,每次我包含一个scss文件时,样式名在className中未定义

Javascript 使用Typescript、Webpack4和React,每次我包含一个scss文件时,样式名在className中未定义,javascript,reactjs,typescript,webpack,sass,Javascript,Reactjs,Typescript,Webpack,Sass,我正在使用Typescript和Webpack4构建一个React应用程序。我试图在我的组件中包含来自scss文件的类名,但是当我这样做时,类名是未定义的 我遇到的一个大问题是,很多在线教程和网页都建议使用ExtractTextPlugin,但这与Webpack4不兼容。这就是为什么我必须使用MiniCssExtractPlugin和css模块的typings加载程序 以下是我在my package.json中的依赖项 "devDependencies": { "@types/react

我正在使用Typescript和Webpack4构建一个React应用程序。我试图在我的组件中包含来自scss文件的类名,但是当我这样做时,类名是未定义的

我遇到的一个大问题是,很多在线教程和网页都建议使用ExtractTextPlugin,但这与Webpack4不兼容。这就是为什么我必须使用MiniCssExtractPlugin和css模块的typings加载程序

以下是我在my package.json中的依赖项

"devDependencies": {
    "@types/react": "^16.4.14",
    "@types/react-dom": "^16.0.7",
    "@types/react-redux": "^6.0.9",
    "@types/redux-saga": "^0.10.5",
    "awesome-typescript-loader": "^5.2.1",
    "css-loader": "^1.0.0",
    "html-webpack-plugin": "^3.2.0",
    "mini-css-extract-plugin": "^0.4.2",
    "node-sass": "^4.9.3",
    "npm-check": "^5.8.0",
    "sass-loader": "^7.1.0",
    "source-map-loader": "^0.2.4",
    "style-loader": "^0.23.0",
    "typescript": "^3.0.3",
    "typings-for-css-modules-loader": "^1.7.0",
    "webpack": "^4.18.1",
    "webpack-cli": "^3.1.0"
},
"dependencies": {
    "es6-promise": "^4.2.5",
    "little-loader": "^0.2.0",
    "query-string": "^6.1.0",
    "react": "^16.5.0",
    "react-dom": "^16.5.0",
    "react-redux": "^5.0.7",
    "redux": "^4.0.0",
    "redux-saga": "^0.16.0"
}
我的webpack.config.js在module=>规则下包含以下内容,以及处理我的typescript文件等的其他内容

{
    test: /\.(s*)css$/,
    use: [
        "style-loader",
        {
            loader: MiniCssExtractPlugin.loader,
            options:
            {
                publicPath: path.resolve(__dirname, './dist')
            }
        },
        {
            loader: 'typings-for-css-modules-loader',
            options:
            {
                importLoaders: 1,
                modules: true,
                namedExport: true,
                camelCase: true,
                localIdentName: '[name]_[local][hash:base64:5]',
                banner: "// *** Generated File - Do not Edit ***"
            }
        },
        {
            loader: "sass-loader",
            options:
            {
                sourceMap: true,
                modules: true
            }
        }
    ]
}
我有一个名为map.styles.scss的scss文件,它只包含以下内容

.map-container {
    margin: 0 auto;
    overflow: hidden;    
}
当webpack构建运行时,它会生成名为map.styles.scss.d.ts的以下文件

// *** Generated File - Do not Edit ***
export const mapContainer: string;
我现在可以在typescript中引用该文件,并对类名进行适当的引用,如下所示

import * as React from 'react';
import * as ReactDOM from 'react-dom';
import * as styles from './map.styles.scss';

export class Map extends React.Component {

    render() {        
        return (                    
            <div ref='map' className={styles.mapContainer}>         
                Loading map...                    
            </div>                  
        );        
    }
}
import*as React from'React';
从“react dom”导入*作为react dom;
从“./map.styles.scss”导入*作为样式;
导出类映射扩展React.Component{
render(){
报税表(
正在加载地图。。。
);        
}
}
问题是,虽然样式是一个对象,但mapContainer是未定义的。因此,在构建我的应用程序时,类名不存在,因为没有应用价值,因此样式不起作用

我发现很奇怪,我可以引用样式,但是我没有得到表示类的字符串。有人能给我指出正确的方向吗?

我发现了问题所在

问题是同时使用MiniCssExtractPlugin和StyleLoader。这将生成样式对象尝试引用的两个文件

其中一个生成了一个键字典,该字典将styles.mapContainer引用与一个值相匹配,另一个包含大量javascript,我对它的作用不是100%清楚

我需要一个有价值字典的。通过取出样式加载器,我只剩下字典文件,而不是另一个,然后因为没有歧义,它提取了本地化的类名

下面是我最后一个用于生成css的webpack配置

{
    test: /\.(s*)css$/,
    use: [
        {
            loader: MiniCssExtractPlugin.loader,
            options:
            {
                publicPath: path.resolve(__dirname, './dist')
            }
        },
        {
            loader: 'typings-for-css-modules-loader',
            options:
            {
                importLoaders: 1,
                modules: true,
                namedExport: true,
                camelCase: true,
                localIdentName: '[name]_[local][hash:base64:5]',
                banner: "// *** Generated File - Do not Edit ***"
            }
        },
        {
            loader: "sass-loader",
            options:
            {
                sourceMap: true,
                modules: true
            }
        }
    ]
}

既然您找到了解决方案,请接受此答案作为正确答案,将问题标记为已解决。