为啥我不能将 primereact 样式导入 webpack 4 react 样板?

Posted

技术标签:

【中文标题】为啥我不能将 primereact 样式导入 webpack 4 react 样板?【英文标题】:Why can't I import primereact styles to webpack 4 react boilerplate?为什么我不能将 primereact 样式导入 webpack 4 react 样板? 【发布时间】:2021-06-15 03:56:13 【问题描述】:

我在运行应用程序时收到此错误:

ERROR in ./node_modules/primereact/resources/themes/saga-blue/theme.css (./node_modules/css-loader!./node_modules/style-loader!./node_modules/css-loader!./node_modules/primereact/resources/themes/saga-blue/theme.css)
Module build failed (from ./node_modules/css-loader/index.js):
Unknown word (2:1)

  1 |
> 2 | var content = require("!!../../../../css-loader/index.js!./theme.css");
    | ^
  3 |
  4 | if(typeof content === 'string') content = [[module.id, content, '']];
  5 |

 @ ./node_modules/primereact/resources/themes/saga-blue/theme.css 2:14-136 21:1-42:3 22:19-141
 @ ./src/index.js

我没有修改任何 common、dev 和 prod webpack。我已经阅读了围绕此发布的其他 2 个问题,但没有一个答案有效。 为了您的方便,我将发布 webpack 配置。

常见:

const path = require('path');
const htmlWebPackPlugin = require('html-webpack-plugin');

module.exports = 
    entry: 
        main: path.resolve(__dirname, "../src", "index.js"),
    ,
    output: 
        filename: '[name].[hash].js',
        path: path.resolve(__dirname, '../dist'),
        publicPath: "/"
    ,
    devServer: 
        port: 3042,
        historyApiFallback: true,
        overlay: true,
        open: true,
    ,
    module: 
        rules: [
            
                test: /\.(js|jsx)$/,
                exclude: [/node_modules/],
                use: [ loader: "babel-loader" ]
            ,
            
                test: /.*\.(gif|png|jp(e*)g|svg)$/i,
                use: [
                    
                        loader: "url-loader",
                        options: 
                            limit: 21000,
                            name: "images/[name]_[hash:7].[ext]"
                        
                    
                ]
            ,
            // Vendor CSS loader
            // This is necessary to pack third party libraries like antd
            
                test: /\.css$/,
                include: path.resolve(__dirname, '../node_modules'),
                use: [
                'style-loader',
                'css-loader'
                ],
            ,
        ]
    ,
    plugins: [
        new HtmlWebPackPlugin(
            template: path.resolve(__dirname, '../public', 'index.html'),
        ),
    ],
    resolve: 
        extensions: ['.js', '.jsx']
    ,

开发人员:

const merge = require('webpack-merge');
const common = require('./webpack.common.js');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

const mapStyle = process.env.MAP_STYLE === 'true';

module.exports = merge (common, 
    mode: 'development',
    devtool: 'inline-source-map',
    devServer: 
        port: 3042,
        historyApiFallback: true,
        overlay: true,
        open: true,
        stats: 'errors-only'
    ,
    module: 
        rules: [
            
                test: /\.css$/,
                use: [
                     loader: "style-loader" ,
                     loader: mapStyle ? "css-loader?sourceMap" : "css-loader" 
                ]
            ,
            
                test: /\.s(a|c)ss$/,
                use: [
                     loader: "style-loader" ,
                     loader: "css-loader" ,
                     loader: "sass-loader" 
                ]
            ,
        ]
    ,
    plugins: [
        new MiniCssExtractPlugin(
            filename: "[name].css",
        ),
    ],
);

产品:

const merge = require('webpack-merge');
const common = require('./webpack.common.js');
const path = require('path');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const ManifestPlugin = require('webpack-manifest-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

const enableBundleAnalyzer = process.env.ENABLE_ANALYZER === 'true';

module.exports = merge(common, 
    mode: 'production',
    devtool: 'source-map',
    module: 
        rules: [
            
                test: /\.css$/,
                use: [
                     loader: MiniCssExtractPlugin.loader ,
                     loader: "css-loader" 
                ]
            ,
            
                test: /\.s(a|c)ss$/,
                use: [
                     loader: MiniCssExtractPlugin.loader ,
                     loader: "css-loader" ,
                     loader: "sass-loader" 
                ]
            ,
        ]
    ,
    optimization: 
        splitChunks: 
            chunks: 'all',
        ,
        runtimeChunk: false,
    ,
    plugins: [
        new CleanWebpackPlugin([path.resolve(__dirname, '../dist')], 
            root: process.cwd(),
            verbose: true,
            dry: false
        ),
        new OptimizeCssAssetsPlugin(),
        new MiniCssExtractPlugin(
            filename: "[name].[hash:8].css",
            chunkFilename: "[id].[hash:8].css"
        ),
        new ManifestPlugin(),
        new BundleAnalyzerPlugin(
            analyzerMode: enableBundleAnalyzer === true ? 'static' : 'disabled',
            openAnalyzer: true,
        ),
    ],
);

这里是我导入它们的地方:

import React from 'react';
import ReactDOM from 'react-dom';
import Provider from 'react-redux';

import App from './components/App';
import store from './app/store';

import './assets/styles/style.sass';
import './assets/styles/style.css';
import './index.scss';

import 'primereact/resources/primereact.min.css';
import 'primeicons/primeicons.css';
import 'primeflex/primeflex.css';

import 'primereact/resources/themes/saga-blue/theme.css';
import '/src/assets/styles/customTheme.scss';

ReactDOM.render(
  <React.StrictMode>
    <Provider store=store>
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById('root')
);

// Check if hot reloading is enable. If it is, changes won't reload the page.
// This is related to webpack-dev-server and works on development only.
if (module.hot) 
  module.hot.accept();

其中一个问题通过说我需要 url-loader 来回答这个问题,但是如您所见,样板文件也包含它。

我希望我给了你足够的信息。提前谢谢你。

【问题讨论】:

【参考方案1】:

我想我已经找到了答案。我需要从 dev 和 prod 配置的 css 加载器规则中排除 node_modules,因为通用配置正在处理它。由于有 2 个冲突的 css 加载器,因此引发了错误。

【讨论】:

以上是关于为啥我不能将 primereact 样式导入 webpack 4 react 样板?的主要内容,如果未能解决你的问题,请参考以下文章

故事书未显示样式

覆盖 PrimeReact 样式

PrimeReact 和样式化组件

有没有办法在 PrimeReact 树中使用自定义图标?

为啥我不能为我的 React 服务器端渲染应用导入 CSS 文件?

为啥我不能将 apache.thrift 导入 IntelliJ 项目?