Webpack 从 .jsx 文件中删除 css?

Webpack removes css from .jsx files?

我的 webpack 文件看起来像这样(注意 - 现在 - 我需要创建资产的缩小版本和非缩小版本 - 所以这不是错误):

const path = require('path');
const webpack = require("webpack");
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')

const readSass = new ExtractTextPlugin({
    filename: "foo/bar/style.min.css"
});

    config = {
        entry: {
            "main": './main.js',
            "main.min": './main.js',
            "style.min": './style.scss'
        },
        watch: true,
        devtool: "source-map",
        output: {
            path: path.resolve(__dirname, '/dist'),
            filename: '[name].js'
        },
        module: {
            rules: [
                {
                    test: /\.jsx?$/i,
                    loader: 'babel-loader',
                    exclude: /node_modules/,
                    options: {
                        presets: ['es2015', 'react'],
                        minified: true
                    }
                },
                {
                    test: /\.scss|css$/,
                    use: readSass.extract({
                        use: [{
                            loader: "css-loader", options: { minimize: true }
                        }, {
                            loader: "sass-loader"
                        }]
                    })
                }
            ],
        },
        plugins: [
            readSass,
            new UglifyJsPlugin({
                include: /\.min\.js$/
            })
        ],
    }

    module.exports = config;

一切都按预期进行,但有一件事让我很烦恼。

在我的一些 .jsx 文件中,我有 CSS 个从不同的第三方组件加载的模块,例如:

import 'react-plugin/react-plugin.css';

当然我编译的js和css文件不包含这些样式。他们迷路了。来自 style.scss 的所有 css 都在那里,来自 main.js 的所有 js 和其中包含的 jsx 都在那里,但是这些样式没有。

我做错了什么?

你能看到当你也包含 style-loader 时会发生什么吗,就像这样:

$ npm i -D style-loader

//... webpack.config.js
{
  test: /\.scss$/,
  use: [{
    loader: "style-loader"
  }, {
    loader: "css-loader"
  }, {
    loader: "sass-loader"
  }],
  exclude: /node_modules/
},

编辑:如果您需要从那里加载文件,请删除 exclude: /node_modules/

然后确保将其导入到您的 js 入口点:import "../css/main.scss";

那是因为您正在使用 extract-text-webpack-plugin 模块。如果您想将 sass 保留在您的包中,请将您的 webpack 配置修改为:

const path = require('path');
const webpack = require("webpack");
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')


config = {
    entry: {
        "main": './main.js',
        "main.min": './main.js'
    },
    watch: true,
    devtool: "source-map",
    output: {
        path: path.resolve(__dirname, '/dist'),
        filename: '[name].js'
    },
    module: {
        rules: [
            {
                test: /\.jsx?$/i,
                loader: 'babel-loader',
                exclude: /node_modules/,
                options: {
                    presets: ['es2015', 'react'],
                    minified: true
                }
            },
            {
                test: /\.scss|css$/,
                use: ['style-loader', 'css-loader', 'sass-loader']
            }
        ],
    },
    plugins: [
        readSass,
        new UglifyJsPlugin({
            include: /\.min\.js$/
        })
    ],
}

module.exports = config;

并通过以下命令安装 sass-loaderstyle-loadernpm install -D sass-loader style-loader

编辑:我忘了告诉你, 你必须在你的 js 入口点之前包含你的 css 或 sass

require('path/to/your/main.scss')

ReactDOM.render(<App />, document.getElementById('root'))

这样它就被捆绑在一起并且您不必再将 css 包含在 webpack 配置入口点中。

sass 要求尚未声明?可以在测试中使用 ./sass/**/*.css/\ 来调用任何 css 样式翻译自 sass.