类型错误:CleanwebpackPlugin不是一个构造函数。

90

我正在尝试通过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配置文件吗? - Mladen Skrbic
1
我在我的帖子中添加了我正在使用的webpack.config.js文件。 - ECallpani
1
当您使用正确的导入时,出现了什么错误信息? - Etheryte
1
文档显示构造函数接受一个对象,而您正在尝试提供一个数组。您是否尝试按照文档建议进行更改,并且去除该无效参数? - crashmstr
1
@SachinSingh 那是一个可怕的想法。降低两个主要版本而不是只修复问题?不行!如果现在想要避免这个问题,只需要回到插件的上一个版本,而不是改变使用的webpack版本。 - crashmstr
显示剩余7条评论
13个回答

134

正确的导入方式如下:

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

然后,不要传递一个包含分发文件夹的数组,将其更改为

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

5
我按照你的建议去做了,但我仍然收到以下错误提示:CleanWebpackPlugin不是一个构造函数。 - AKJ
2
我正在使用版本^1.0.1。我通过简单地执行以下操作成功使其工作:const CleanWebpackPlugin = require('clean-webpack-plugin');没有花括号。 - AKJ
@AKJ,您正在使用较低版本,一旦升级到3.0.0版本,您可能会遇到此问题。 - rpmansion
@AKJ 你把 new CleanWebpackPlugin(['dist']) 改为了 new CleanWebpackPlugin() 吗? - zumafra
2
花括号似乎是重要的部分。 - David Gardiner
显示剩余2条评论

55

我也有同样的问题,我是用以下方法解决的:


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


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


20
我今天遇到了同样的问题。如你所见,文档和实际代码之间存在不匹配。实际上,在他们合并的 最新提交 中,你可以看到他们同时更新了文档和代码: enter image description here 同时也更新了代码: enter image description here 所以我只需要从 const CleanWebpackPlugin = require('clean-webpack-plugin') 切换到:
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

它很好用。

我认为你可能陷入了某些问题中。重新安装npm包并重试,应该可以解决问题。

我在他们的公共存储库中写了一些内容,因为当突然发生这样的更改时,你通常会在存储库中找到自己的答案,可能在最后提交中。而且,阅读一些你使用的代码是有益的,特别是如果它有助于你解决问题 :)


17
使用更新后的版本,您需要执行以下操作来包含它:
```javascript const { CleanWebpackPlugin } = require('clean-webpack-plugin'); ```
然后在插件数组中,替换以下配置。
plugins: [
     new CleanWebpackPlugin(['dist']),
]

使用

plugins: [
     new CleanWebpackPlugin(),
]

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

9

如果最近更新的 nativescript-vue 出现此错误,我通过更改 webpack.config.js(app 文件夹中的顶级文件)来解决它。与上面一样,现在它反映了 CleanWebpackPlugin 文档 中的语法。

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

并且

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

8

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

如果版本大于 1,则会发生这种情况。

例如:

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

4

2

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

虽然下面的方法帮助我解决了问题:

我先卸载了clean-webpack-plugin,然后再将其作为依赖重新安装。在此之前,我已经将其安装为开发依赖。

卸载后,通过以下方式重新安装:npm install --save clean-webpack-plugin

加上这段代码:

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

"最初的回答":问题已解决!希望能对你有所帮助。

1
今天我也遇到了同样的问题,后来发现我还需要删除webpack.config.js文件。
删除该文件后,我需要重新运行npm install
-> 应用程序成功启动。

--

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

1
这可能是一个奇怪的异常原因 - 但我在为新的 Linux 机器设置旧项目时遇到了这个问题。原来是我的项目没有安装 dev 依赖项(默认情况下,如果 npm 配置设置为 production,则在运行 npm install 时不会安装 dev 依赖项,尽管我不确定我的设置为什么),我的 Webpack CLI 是 4 版本,但我的项目版本为 2.6.1,所以它使用了 Webpack 4,但我的 webpack.config 是为 2 版本编写的。因此,请确保已安装 dev 依赖项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接