【问题标题】:TypeError: CleanwebpackPlugin is not a constructorTypeError: CleanwebpackPlugin 不是构造函数
【发布时间】:2019-10-27 07:20:51
【问题描述】:

我正在尝试通过 webpack-server-dev 预览 vue Web 应用程序。我正在关注本指南 https://medium.com/the-web-tub/creating-your-first-vue-js-pwa-project-22f7c552fb34

该指南解释说该插件用于删除 dist 目录中旧的和未使用的文件。我已经尝试用 const { CleanWebpackPlugin } = require('clean-webpack-plugin') 替换 const CleanWebpackPlugin = require('clean-webpack-plugin') 一些帖子建议。我也尝试查看https://github.com/johnagan/clean-webpack-plugin 上的文档,但没有成功,因为我对此很陌生。

当我尝试npm run dev 时出现此错误

    new CleanWebpackPlugin(['dist']),
    ^

TypeError: CleanWebpackPlugin is not a constructor
    at module.exports (C:\Users\Eson\Desktop\pwa-vue-app-1\webpack.config.js:56:5)
    at handleFunction (C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-cli\bin\utils\prepareOptions.js:21:13)
    at prepareOptions (C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-cli\bin\utils\prepareOptions.js:9:5)
    at requireConfig (C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-cli\bin\utils\convert-argv.js:119:14)
    at C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-cli\bin\utils\convert-argv.js:125:17
    at Array.forEach (<anonymous>)
    at module.exports (C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-cli\bin\utils\convert-argv.js:123:15)
    at Object.<anonymous> (C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-dev-server\bin\webpack-dev-server.js:79:40)
    at Module._compile (internal/modules/cjs/loader.js:776:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:829:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

这是 webpack.config.js 文件

const path = require('path')

const { VueLoaderPlugin } = require('vue-loader')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const CleanWebpackPlugin = require('clean-webpack-plugin')

module.exports = (env, argv) => ({
  mode: argv && argv.mode || 'development',
  devtool: (argv && argv.mode || 'development') === 'production' ? 'source-map' : 'eval',

  entry: './src/app.js',

  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js'
  },

  node: false,

  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
      {
        test: /\.js$/,
        loader: 'babel-loader'
      },
      {
        test: /\.css$/,
        use: [
          'vue-style-loader',
          'css-loader'
        ],
        exclude: /\.module\.css$/
      }
    ]
  },

  resolve: {
    extensions: [
      '.js',
      '.vue',
      '.json'
    ],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': path.resolve(__dirname, 'src')
    }
  },

  plugins: [
    new CleanWebpackPlugin(['dist']),
    new VueLoaderPlugin(),
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, 'static', 'index.html'),
      inject: true
    }),
    new CopyWebpackPlugin([{
      from: path.resolve(__dirname, 'static'),
      to: path.resolve(__dirname, 'dist'),
      toType: 'dir'
    }])
  ],

  optimization: {
    splitChunks: {
      chunks: 'all',
      minSize: 30000,
      maxSize: 0,
      cacheGroups: {
        vendors: {
          test: /[\\/]node_modules[\\/]/,
          priority: -10
        },
        default: {
          minChunks: 2,
          priority: -20,
          reuseExistingChunk: true
        }
      }
    },
    runtimeChunk: {
      name: entrypoint => `runtime~${entrypoint.name}`
    },
    mangleWasmImports: true,
    removeAvailableModules: true,
    removeEmptyChunks: true,
    mergeDuplicateChunks: true
  },

  devServer: {
    compress: true,
    host: 'localhost',
    https: true,
    open: true,
    overlay: true,
    port: 9000
  }
});

这是我在使用文档中解释的正确导入时遇到的错误:

      throw new Error(`clean-webpack-plugin only accepts an options object. See:
      ^

Error: clean-webpack-plugin only accepts an options object. See:
            https://github.com/johnagan/clean-webpack-plugin#options-and-defaults-optional
    at new CleanWebpackPlugin (C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\clean-webpack-plugin\dist\clean-webpack-plugin.js:27:13)
    at module.exports (C:\Users\Eson\Desktop\pwa-vue-app-1\webpack.config.js:56:5)
    at handleFunction (C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-cli\bin\utils\prepareOptions.js:21:13)
    at prepareOptions (C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-cli\bin\utils\prepareOptions.js:9:5)
    at requireConfig (C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-cli\bin\utils\convert-argv.js:119:14)
    at C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-cli\bin\utils\convert-argv.js:125:17
    at Array.forEach (<anonymous>)
    at module.exports (C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-cli\bin\utils\convert-argv.js:123:15)
    at Object.<anonymous> (C:\Users\Eson\Desktop\pwa-vue-app-1\node_modules\webpack-dev-server\bin\webpack-dev-server.js:79:40)
    at Module._compile (internal/modules/cjs/loader.js:776:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:829:12)
    at startup (internal/bootstrap/node.js:283:19) 

如果我删除 webpack.config.js 中的第 56 行,我可以毫无问题地运行 Web 应用程序,但我想了解这个问题的根源

【问题讨论】:

  • 你有 webpack 配置文件吗?
  • 我将我正在使用的 webpack.config.js 文件添加到我的帖子中
  • 使用the correct import时的错误信息是什么?
  • 文档显示构造函数接受一个对象,而您正试图给它一个数组。您是否尝试过进行文档建议的更改以及删除该无效参数?
  • @SachinSingh 这是一个可怕的想法。向下两个主要版本而不是仅仅解决问题?没有!如果现在想避免这个问题,只需要返回插件上的一个版本,而不是更改正在使用的 webpack 版本。

标签: javascript vue.js webpack webpack-dev-server


【解决方案1】:

正确的是使用这个导入:

const { CleanWebpackPlugin } = require('clean-webpack-plugin');

然后不是将数组与分发文件夹一起传递,而是将其更改为

plugins: [
     new CleanWebpackPlugin(),
     //...
]

【讨论】:

  • 我按照你的建议做了,但我仍然收到错误:CleanWebpackPlugin 不是构造函数
  • @AKJ 你用的是什么版本的插件?
  • @AKJ 尝试先删除 node_modules 文件夹,然后重新下载包。
  • 我正在使用版本 ^1.0.1。我设法通过简单地这样做来让它工作: const CleanWebpackPlugin = require('clean-webpack-plugin');没有花括号。
  • 大括号似乎很重要
【解决方案2】:

我也遇到了同样的问题,我是这样解决的:


    const { CleanWebpackPlugin } = require('clean-webpack-plugin');


    plugins: [
        new CleanWebpackPlugin({
            cleanAfterEveryBuildPatterns: ['dist']
        })
    ]

【讨论】:

    【解决方案3】:

    我今天遇到了同样的问题,现在。如您所知,文档和实际代码之间存在不匹配。事实上,您可以在 the last commit they merged 中看到这两个文档:

    还有代码:

    所以我刚刚从const CleanWebpackPlugin = require('clean-webpack-plugin')切换到

    const { CleanWebpackPlugin } = require('clean-webpack-plugin');
    

    而且效果很好。

    我想你可能被夹在中间了。重新安装 npm 包,然后重试,它应该可以工作。

    我写了一些你可以在他们的公共存储库中看到的内容,因为经常发生这样的突然变化时,你会在 repo 中找到你自己的答案,可能在最后一次提交中。阅读一些您使用的代码非常有用,特别是如果它可以帮助您解决问题:)

    【讨论】:

      【解决方案4】:

      使用更新,您需要执行以下操作才能包含它

      const { CleanWebpackPlugin } = require('clean-webpack-plugin');

      然后在插件数组中替换添加以下内容

      plugins: [
           new CleanWebpackPlugin(['dist]),
      ]
      

      plugins: [
           new CleanWebpackPlugin(),
      ]
      

      与更新一样,无需传递任何参数,因为它将删除 webpack 的 output.path 目录中的所有文件,以及每次成功重建后所有未使用的 webpack 资产。

      【讨论】:

        【解决方案5】:

        对于那些在 nativescript-vue 的最新更新中发现此错误的人,我通过更改 webpack.config.js(应用文件夹中的顶级文件)来修复它。如上所述,它现在反映了 CleanWebpackPlugin docs 中的语法。

        //const CleanWebpackPlugin = require("clean-webpack-plugin");
          const { CleanWebpackPlugin } = require('clean-webpack-plugin');
        

        //new CleanWebpackPlugin(itemsToClean, { verbose: !!verbose }),
          new CleanWebpackPlugin(),
        

        【讨论】:

          【解决方案6】:

          导入时,使用 { CleanWebpackPlugin } 而不是 CleanWebpackPlugin

          当版本大于 1 时会发生这种情况。

          例子:

          const { CleanWebpackPlugin } = require("clean-webpack-plugin");
          

          【讨论】:

            【解决方案7】:

            CleanWebpackPlugin v3.0.0

            将默认导出替换为命名导出 CleanWebpackPlugin

            [https://github.com/johnagan/clean-webpack-plugin/releases/tag/v3.0.0]

            正确的代码是:

            // es modules
            import { CleanWebpackPlugin } from 'clean-webpack-plugin';
            
            // common js
            const { CleanWebpackPlugin } = require('clean-webpack-plugin');
            

            【讨论】:

              【解决方案8】:

              我对 webpack 不是很熟悉,目前正在学习它

              虽然下面这件事帮助我解决了这个问题

              我只是卸载 clean-webpack-plugin 然后作为依赖重新安装 在此之前,我已安装为开发依赖项

              在卸载并安装它之后:npm install --save clean-webpack-plugin

              加上这个

              const { CleanWebpackPlugin } = require("clean-webpack-plugin");
              

              解决了我的问题!!

              希望对你有帮助

              【讨论】:

                【解决方案9】:

                我今天遇到了同样的问题,我发现我还必须删除 webpack.config.js 文件。

                删除文件后,我不得不重新运行npm install

                -> 应用程序启动成功。

                --

                webpack.config.js 中放置了一些旧的引用。

                【讨论】:

                  【解决方案10】:

                  这可能是一个奇怪的异常原因 - 但我只是在新的 linux 机器上设置一个旧项目时遇到了这个问题。原来我没有为我的项目安装开发依赖项(默认情况下,如果 npm config 设置为生产,则在运行 npm install 时它不会安装开发依赖项 - 尽管我不确定我的确切为什么设置为生产) ,我的 webpack cli 是 4,但我的项目是 2.6.1,所以它使用的是 webpack 4,但我的 webpack.config 是 2。所以请确保安装了你的开发依赖项。

                  【讨论】:

                    【解决方案11】:

                    也要注意这样写

                    const {
                        CleanWebpackPlugin
                    } = require('clean-webpack-plugin');
                    

                    不是这样的:

                    const {
                        cleanWebpackPlugin
                    } = require('clean-webpack-plugin');
                    

                    就我而言,小写字母 C 是个问题。导入的是这个插件的类名,不能随意命名。

                    【讨论】:

                      【解决方案12】:

                      看起来文档坏了,正确的代码是

                      const CleanWebpackPlugin = require('clean-webpack-plugin')

                      【讨论】:

                      猜你喜欢
                      • 2019-08-14
                      • 2018-06-27
                      • 2016-04-16
                      • 2021-11-26
                      • 2018-07-18
                      • 2016-12-20
                      • 2020-10-04
                      相关资源
                      最近更新 更多