类型错误:MiniCssExtractPlugin 不是构造函数

2024-04-10

[webpack-cli] TypeError: MiniCssExtractPlugin is not a constructor
    at module.exports (/home/andrey/smartadmin-app/webpack.config.js:70:9)
    at loadConfigByPath (/home/andrey/smartadmin-app/node_modules/webpack-cli/lib/webpack-cli.js:1745:27)
    at async WebpackCLI.loadConfig (/home/andrey/smartadmin-app/node_modules/webpack-cli/lib/webpack-cli.js:1830:30)
    at async WebpackCLI.createCompiler (/home/andrey/smartadmin-app/node_modules/webpack-cli/lib/webpack-cli.js:2185:18)
    at async Command.<anonymous> (/home/andrey/smartadmin-app/node_modules/@webpack-cli/serve/lib/index.js:98:30)
    at async Promise.all (index 1)
    at async Command.<anonymous> (/home/andrey/smartadmin-app/node_modules/webpack-cli/lib/webpack-cli.js:1672:7)

我遇到了这个错误,不明白为什么会发生。我没有更改任何软件包版本并且刚刚完成npm install,我心碎了。

{
  "name": "react-typescript",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "view-file": "ts-node --project ts.node.config.json ./webpack/createViewFile.ts",
    "build-dev": "webpack --env mode=development && npm run build-storybook",
    "build-dev-server": "webpack --env mode=development",
    "build-prod": "webpack --env mode=production",
    "lint": "eslint 'client/**'",
    "storybook": "start-storybook -p 5000",
    "build-storybook": "build-storybook -o ./public/storybook",
    "start": "webpack serve --open"
  },
  "dependencies": {
    "axios": "0.24.0",
    "clsx": "1.1.1",
    "dotenv": "8.6.0",
    "react": "17.0.2",
    "react-dom": "17.0.2",
    "react-hook-form": "7.19.5",
    "react-router-dom": "6.0.2",
    "react-string-replace": "0.4.4",
    "webpack-cli": "4.9.1"
  },
  "devDependencies": {
    "@babel/core": "7.16.0",
    "@storybook/addon-actions": "6.4.0-rc.2",
    "@storybook/addon-docs": "6.4.0-rc.2",
    "@storybook/addon-essentials": "6.4.0-rc.2",
    "@storybook/addon-links": "6.4.0-rc.2",
    "@storybook/builder-webpack5": "6.4.0-rc.2",
    "@storybook/manager-webpack5": "6.4.0-rc.2",
    "@storybook/preset-scss": "1.0.3",
    "@storybook/react": "6.4.0-rc.2",
    "@types/express": "4.17.13",
    "@types/node": "16.11.7",
    "@types/react": "17.0.33",
    "@types/react-dom": "17.0.10",
    "@typescript-eslint/eslint-plugin": "5.2.0",
    "@typescript-eslint/parser": "5.2.0",
    "babel-loader": "8.2.3",
    "clean-webpack-plugin": "4.0.0",
    "compression-webpack-plugin": "9.0.0",
    "copy-webpack-plugin": "9.1.0",
    "css-loader": "6.5.1",
    "eslint": "7.32.0",
    "eslint-config-airbnb": "18.2.1",
    "eslint-config-prettier": "8.3.0",
    "eslint-plugin-import": "2.25.2",
    "eslint-plugin-jsx-a11y": "6.4.1",
    "eslint-plugin-prettier": "4.0.0",
    "eslint-plugin-react": "7.26.1",
    "eslint-plugin-react-hooks": "1.7.0",
    "html-webpack-plugin": "5.5.0",
    "mini-css-extract-plugin": "2.4.4",
    "prettier": "2.4.1",
    "sass": "1.43.4",
    "sass-loader": "12.3.0",
    "style-loader": "3.3.1",
    "terser-webpack-plugin": "5.2.4",
    "ts-loader": "9.2.6",
    "ts-node": "10.4.0",
    "typescript": "4.4.4",
    "webpack": "5.64.1",
    "webpack-dev-server": "4.7.3",
    "webpack-manifest-plugin": "4.1.1",
    "webpack-nano": "1.1.1"
  }
}

我执行的命令是npm run start, 和我的webpack.config.js文件是:

require('dotenv').config();

const TerserPlugin = require('terser-webpack-plugin');
const CompressionPlugin = require('compression-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');

const { WebpackManifestPlugin } = require('webpack-manifest-plugin');
const { execSync } = require('child_process');

const rules = require('./webpack/rules');
const paths = require('./webpack/paths');
const enviroment = require('./webpack/env');

module.exports = (env) => {
  const isProduction = env.mode === enviroment.PRODUCTION;
  const isDevServer = !!env.WEBPACK_SERVE;

  if (isDevServer) {
    return {
      watch: true,
      mode: enviroment.DEVELOPMENT,
      entry: './src/index.tsx',
      stats: {
        errorDetails: true,
      },
      module: {
        rules: [rules.ts(), rules.css()],
      },
      resolve: {
        extensions: ['.tsx', '.ts', '.js'],
        modules: ['node_modules', 'src'],
      },
      output: {
        filename: 'main.js',
        path: paths.public,
        publicPath: paths.public,
      },
      devServer: {
        port: 8080,
        host: 'localhost',
        static: [paths.public],
        compress: true,
        hot: true,
        headers: {
          'Access-Control-Allow-Origin': '*',
        },
        historyApiFallback: {
          index: '/index.html',
        },
        client: {
          overlay: true,
          logging: 'info',
          progress: true,
        },
        devMiddleware: {
          writeToDisk: true,
        },
      },
      plugins: [
        {
          apply(compiler) {
            compiler.hooks.environment.tap('removePublicFolder', () => {
              execSync('rm -rf public');
            });
          },
        },
        new CompressionPlugin(),
        new MiniCssExtractPlugin({
          filename: isDevServer ? 'main.css' : '[name].[hash].css',
          ignoreOrder: true,
        }),
        new webpack.DefinePlugin({
          'process.env': JSON.stringify(process.env),
        }),
        new WebpackManifestPlugin({
          publicPath: '',
        }),
        new CopyPlugin({
          patterns: [
            { from: paths.views, to: paths.public },
            { from: paths.static, to: paths.public },
          ],
        }),
      ],
    };
  }

  return {
    mode: env.mode,
    entry: './src/index.tsx',
    stats: {
      errorDetails: true,
    },
    ...(isProduction && {
      optimization: {
        minimize: true,
        splitChunks: {
          cacheGroups: {
            vendor: {
              test: /[\\/]node_modules[\\/]/,
              name: 'vendor',
              chunks: 'all',
            },
          },
        },
        minimizer: [
          new TerserPlugin({
            extractComments: false,
          }),
        ],
      },
    }),
    module: {
      rules: [rules.ts(), rules.css()],
    },
    resolve: {
      extensions: ['.tsx', '.ts', '.js'],
      modules: ['node_modules', 'src'],
    },
    output: {
      filename: '[name].[contenthash].js',
      path: paths.public,
      publicPath: '/',
    },
    plugins: [
      {
        apply(compiler) {
          compiler.hooks.environment.tap('removePublicFolder', () => {
            execSync('rm -rf public');
          });
        },
      },
      new CompressionPlugin(),
      new MiniCssExtractPlugin({
        filename: isDevServer ? 'main.css' : '[name].[hash].css',
        ignoreOrder: true,
      }),
      new webpack.DefinePlugin({
        'process.env': JSON.stringify(process.env),
      }),
      new WebpackManifestPlugin({
        publicPath: '',
      }),
      {
        apply(compiler) {
          compiler.hooks.done.tap('done', () => {
            execSync('npm run view-file');
            execSync('ls');
          });
        },
      },
      new CopyPlugin({
        patterns: [{ from: paths.static, to: paths.public }],
      }),
    ],
  };
};

另外我会附上./webpack/rules.js,为了更清楚:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

const paths = require('./paths');

const css = () => {
  return {
    test: /\.scss$/,
    use: [
      MiniCssExtractPlugin.loader,
      {
        loader: 'css-loader',
        options: {
          modules: true,
        },
      },
      {
        loader: 'sass-loader',
        options: {
          sassOptions: {
            indentWidth: 4,
            includePaths: [paths.styles],
          },
        },
      },
    ],
  };
};

const ts = () => {
  return {
    test: /\.tsx?$/,
    exclude: /node_modules/,
    use: [
      {
        loader: 'ts-loader',
        options: {
          configFile: 'tsconfig.json',
        },
      },
    ],
  };
};

module.exports = {
  ts,
  css,
};

对此有一个未解决的问题创建反应应用程序存储库。看起来像这条评论 https://github.com/facebook/create-react-app/issues/11930#issuecomment-1013480827有一个临时修复,将以下内容添加到文件中包.json:

如果您正在使用以下内容,则可以使用Yarn https://yarnpkg.com/:

"resolutions": {
    "mini-css-extract-plugin": "2.4.5"
},

对于 npm 使用以下命令:

npm i -D --save-exact [email protected] /cdn-cgi/l/email-protection

Update: 截至 1 月 17 日 https://github.com/facebook/create-react-app/issues/11930#issuecomment-1014860805,看来这个问题已被 mini-css-extract-plugin v2.5.1 修复。您应该能够删除上面创建的版本引脚并且npm i or yarn install更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型错误:MiniCssExtractPlugin 不是构造函数 的相关文章

随机推荐

  • Android - 包括 GitHub 库 ActionBar PullToRefresh

    我在包含来自 GitHub 的库时遇到问题 这是图书馆 https github com chrisbanes ActionBar PullToRefresh https github com chrisbanes ActionBar Pu
  • 我正在尝试通过外部 api 从 json 数据获取键值对,并使用 Angular 和 TypeScript 显示它。我怎样才能实现这个目标?

    我想从我的 api 获取结果对象中的每个键值对以显示在我的前端上 即 类别 类型 难度 问题正确答案 我已正确设置服务和组件 我需要做的就是获取 json 并显示每一对 该方法名称称为 fetchQuestions 如下所示 我只需简单地以
  • 是否可以一次性增加 YouTube api 的配额?

    我正尝试将大约 4 000 个视频添加到 YouTube 播放列表中 使用基于成本的配额系统 我每天只能添加大约 200 个 这意味着我需要大约三周的时间来完成这个项目 此外 我需要添加的视频列表将继续增长 直到我最终确定播放列表 因为它在
  • CF10-jpg的文件格式

    在开发一个允许交换多个第三方应用程序的图像并从而为这些应用程序创建单独的 皮肤 的工具时 我偶然发现了一种 jpg 格式 我似乎无法找到任何合适的信息 当在十六进制编辑器中查看它时 它以标签 CF10 开头 搜索互联网只提供了一个能够处理此
  • 如何在 WAI 服务器中执行关闭命令?

    我想为我的 web 应用程序实现一个 正常关闭 命令 与我的第一直觉相反 即只是要求人们终止该进程 我的前两次尝试包括 liftIO exitSuccess E yield responseLBS statusOK G contentTyp
  • 颜色生成功能

    让我们考虑以下场景 一个可以生成从白色到红色 从白色到蓝色 从白色到粉色 从白色到橙色等代码颜色的函数 颜色代码采用 RGB 格式 值从 0 到 255 有任何想法吗 您能给我伪代码或此类算法的链接吗 听起来你在追求线性插值 http en
  • MySQL 行格式:固定和动态之间的区别?

    MySQL 根据列数据类型将表的行格式指定为固定或动态 如果表具有可变长度列数据类型 例如 TEXT 或 VARCHAR 则行格式是动态的 否则 它是固定的 我的问题是 两种行格式有什么区别 其中一个比另一个更有效率吗 这种差异实际上只对
  • 如何将我的 WordPress 帖子分享到 Instagram [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有谁知道如何使用Instagram API将我的 WordPress 网站上的照片分享到我的 Instagram 帐户 根据Insta
  • Azure 数据工厂检查复制记录的行数

    我正在设计一个 ADF 管道 用于将 SQL 表中的行复制到 Azure Data Lake 中的文件夹 之后 SQL 中的行应该被删除 但是对于发生的删除操作 我想知道复制的行数是否与我在管道开头选择的行数相同 有没有办法获取复制操作的行
  • 具有多个 Oracle 客户端版本的 cx_Oracle

    我正在运行 Python 2 7 并在 Linux 64 位操作系统上使用 cx Oracle 我需要能够针对 11 2 或 12 1 Oracle 客户端运行 因为我无法确定哪个客户端将安装在部署的目标上 我知道有针对每个 Oracle
  • OSX 上的单调时钟

    CLOCK MONOTONIC似乎不可用 所以clock gettime已经出局了 我在一些地方读到 mach absolute time 可能是正确的方法 但在读到它是一个 cpu 相关值 后 它立即让我想知道它是否在下面使用 rtdsc
  • JPA Criteria api 通过嵌入式 ID 加入

    我有以下实体 Entity Table name place revision public class PoiRevision OneToMany mappedBy pk revision cascade CascadeType ALL
  • Django - 多个用户配置文件

    最初 我的 UserProfile 是这样开始的 from django db import models from django contrib auth models import User class UserProfile mode
  • 在 X-Editable 中通过 Ajax 提交数据

    我正在尝试使用 Ajax 提交数据X 可编辑 https vitalets github io x editable docs html并且在运行 url 参数中定义的 php 脚本时遇到问题 实际上 我从工作中得到了基本的例子 Html
  • 使用正则表达式解析 C 风格注释,避免回溯

    我想匹配 JavaScript 文件中的所有块注释和多行注释 这些是 C 风格注释 我有一个效果很好的模式 然而 它会产生一些回溯 从而显着减慢速度 尤其是在较大的文件上 图案 r n 例子 https www regex101 com r
  • 是否有像 numpy.clip(a, a_min, a_max) 这样的函数,其中 a_min 和 a_max 之外的值被包裹而不是饱和?

    对于给定的整数 numpy 数组 我可以使用 numpy clip a a min a max 将该数组中的值饱和到任意最小值和最大值 我想知道是否有一个 numpy 函数或技巧来执行此操作 以便它不会使值饱和 而是将它们包装起来 我知道
  • 编译 PortAudio 示例时出错

    我在 Ubuntu 上 我正在尝试运行 PortAudio 示例 但出现许多错误 如下所述 我已将头文件portaudio h放在程序的目录中 我对此一无所知 我认为这是链接器错误 请帮忙 tmp cc5EbTlT o 功能中main pa
  • 在文本框中显示格式化的 xml

    我一直在寻找一种在文本框中显示格式化 xml 的方法 到目前为止我发现的所有内容都指向从文件中读取 xml 并对其进行格式化 但是我想显示保存在数据库字段中的 xml 这个想法是 用户将记录返回到 gridview gridview 将显示
  • 浏览图像文件并将其显示在 kivy 窗口中

    我是 Kivy 的初学者 尝试使用 kivy fileChooser 浏览图像文件 然后将其显示在窗口上 下面你找到了我的代码 但它无法完成任务 它只是在控制台上显示 PNG 请和我一起检查一下 import kivy from kivy
  • 类型错误:MiniCssExtractPlugin 不是构造函数

    webpack cli TypeError MiniCssExtractPlugin is not a constructor at module exports home andrey smartadmin app webpack con