webpack.optimize.UglifyJsPlugin已被删除

我正在研究一个udemy课程项目,并将我的软件包和模块升级到最新版本,包括webpack4。但是,在运行npm run-build时,我的终端出现以下错误。

我设法使我的开发环境运行良好。但是,当我尝试运行NPM run build时,出现以下错误。

Error: webpack.optimize.UglifyJsPlugin has been removed,please use config.optimization.minimize instead.

我尝试在我的webpack.config.prod.js文件的Module Exports中添加最小化器,并按照许多论坛的建议安装'uglifyjs-webpack-plugin',但我仍然遇到相同的错误。

Package.json

  "name": "Burger-Builder-App","version": "0.1.0","private": true,"dependencies": {
    "autoprefixer": "9.7.1","axios": "^0.19.0","babel-core": "6.26.3","babel-eslint": "10.0.3","babel-jest": "24.9.0","babel-loader": "8.0.6","babel-preset-react-app": "^9.0.2","babel-runtime": "6.26.0","case-sensitive-paths-webpack-plugin": "2.2.0","chalk": "2.4.2","css-loader": "^2.1.1","dotenv": "8.2.0","enzyme": "^3.10.0","enzyme-adapter-react-16": "^1.15.1","eslint": "6.6.0","eslint-config-react-app": "^5.0.2","eslint-loader": "3.0.2","eslint-plugin-flowtype": "4.3.0","eslint-plugin-import": "2.18.2","eslint-plugin-jsx-a11y": "6.2.3","eslint-plugin-react": "7.16.0","eslint-plugin-react-hooks": "^2.2.0","extract-text-webpack-plugin": "3.0.2","file-loader": "4.2.0","fs-extra": "8.1.0","html-webpack-plugin": "^4.0.0-beta.8","jest": "24.9.0","object-assign": "4.1.1","postcss-flexbugs-fixes": "4.1.0","postcss-loader": "3.0.0","promise": "8.0.3","prop-types": "^15.7.2","react": "^16.11.0","react-dev-utils": "^9.1.0","react-dom": "^16.11.0","react-redux": "^7.1.3","react-router-dom": "^5.1.2","react-test-render": "^1.1.2","redux": "^4.0.4","redux-thunk": "^2.3.0","style-loader": "1.0.0","sw-precache-webpack-plugin": "0.11.5","uglifyjs-webpack-plugin": "^2.2.0","url-loader": "2.2.0","webpack": "4.41.2","webpack-dev-server": "3.9.0","webpack-manifest-plugin": "2.2.0","whatwg-fetch": "3.0.0"
  },"scripts": {
    "start": "node scripts/start.js","build": "node scripts/build.js","test": "node scripts/test.js --env=jsdom"
  },"jest": {
    "collectCoverageFrom": [
      "src/**/*.{js,jsx}"
    ],"setupFiles": [
      "<rootDir>/config/polyfills.js"
    ],"testMatch": [
      "<rootDir>/src/**/__tests__/**/*.js?(x)","<rootDir>/src/**/?(*.)(spec|test).js?(x)"
    ],"testEnvironment": "node","testURL": "http://localhost","transform": {
      "^.+\\.(js|jsx)$": "<rootDir>/node_modules/babel-jest","^.+\\.css$": "<rootDir>/config/jest/cssTransform.js","^(?!.*\\.(js|jsx|css|json)$)": "<rootDir>/config/jest/fileTransform.js"
    },"transformIgnorePatterns": [
      "[/\\\\]node_modules[/\\\\].+\\.(js|jsx)$"
    ],"moduleNameMapper": {
      "^react-native$": "react-native-web"
    },"moduleFileExtensions": [
      "web.js","js","json","web.jsx","jsx","node"
    ]
  },"babel": {
    "presets": [
      "react-app"
    ]
  },"eslintConfig": {
    "extends": "react-app"
  }
}

Webpackdevserver.config.js

const errorOverlayMiddleware = require('react-dev-utils/errorOverlayMiddleware');
const noopServiceWorkerMiddleware = require('react-dev-utils/noopServiceWorkerMiddleware');
const config = require('./webpack.config.dev');
const paths = require('./paths');

const protocol = process.env.HTTPS === 'true' ? 'https' : 'http';
const host = process.env.HOST || '0.0.0.0';

module.exports = function(proxy,allowedHost) {
  return {
    // Webpackdevserver 2.4.3 introduced a security fix that prevents remote
    // websites from potentially accessing local content through DNS rebinding:
    // https://github.com/webpack/webpack-dev-server/issues/887
    // https://medium.com/webpack/webpack-dev-server-middleware-security-issues-1489d950874a
    // However,it made several existing use cases such as development in cloud
    // environment or subdomains in development significantly more complicated:
    // https://github.com/facebookincubator/create-react-app/issues/2271
    // https://github.com/facebookincubator/create-react-app/issues/2233
    // While we're investigating better solutions,for now we will take a
    // compromise. Since our WDS configuration only serves files in the `public`
    // folder we won't consider accessing them a vulnerability. However,if you
    // use the `proxy` feature,it gets more dangerous because it can expose
    // remote code execution vulnerabilities in backends like Django and Rails.
    // So we will disable the host check normally,but enable it if you have
    // specified the `proxy` setting. Finally,we let you override it if you
    // really know what you're doing with a special environment variable.
    disableHostCheck:
      !proxy || process.env.DANGEROUSLY_DISABLE_HOST_CHECK === 'true',// Enable gzip compression of generated files.
    compress: true,// Silence Webpackdevserver's own logs since they're generally not useful.
    // It will still show compile warnings and errors with this setting.
    clientLogLevel: 'none',// By default Webpackdevserver serves physical files from current directory
    // in addition to all the virtual build products that it serves from memory.
    // This is confusing because those files won’t automatically be available in
    // production build folder unless we copy them. However,copying the whole
    // project directory is dangerous because we may expose sensitive files.
    // Instead,we establish a convention that only files in `public` directory
    // get served. Our build script will copy `public` into the `build` folder.
    // In `index.html`,you can get URL of `public` folder with %PUBLIC_URL%:
    // <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
    // In JavaScript code,you can access it with `process.env.PUBLIC_URL`.
    // Note that we only recommend to use `public` folder as an escape hatch
    // for files like `favicon.ico`,`manifest.json`,and libraries that are
    // for some reason broken when imported through Webpack. If you just want to
    // use an image,put it in `src` and `import` it from JavaScript instead.
    contentBase: paths.appPublic,// By default files from `contentBase` will not trigger a page reload.
    watchContentBase: true,// Enable hot reloading server. It will provide /sockjs-node/ endpoint
    // for the Webpackdevserver client so it can learn when the files were
    // updated. The Webpackdevserver client is included as an entry point
    // in the Webpack development configuration. Note that only changes
    // to CSS are currently hot reloaded. JS changes will refresh the browser.
    hot: true,// It is important to tell Webpackdevserver to use the same "root" path
    // as we specified in the config. In development,we always serve from /.
    publicPath: config.output.publicPath,// Webpackdevserver is noisy by default so we emit custom message instead
    // by listening to the compiler events with `compiler.plugin` calls above.
    quiet: true,// Reportedly,this avoids CPU overload on some systems.
    // https://github.com/facebookincubator/create-react-app/issues/293
    watchOptions: {
      ignored: /node_modules/,},// Enable HTTPS if the HTTPS environment variable is set to 'true'
    https: protocol === 'https',host: host,overlay: false,historyApiFallback: {
      // Paths with dots should still use the history fallback.
      // See https://github.com/facebookincubator/create-react-app/issues/387.
      disableDotRule: true,public: allowedHost,proxy,setup(app) {
      // This lets us open files from the runtime error overlay.
      app.use(errorOverlayMiddleware());
      // This service worker file is effectively a 'no-op' that will reset any
      // previous service worker registered for the same host:port combination.
      // We do this in development to avoid hitting the production cache if
      // it used the same host and port.
      // https://github.com/facebookincubator/create-react-app/issues/2272#issuecomment-302832432
      app.use(noopServiceWorkerMiddleware());
    },};
};

webpack.config.prod.js

const autoprefixer = require('autoprefixer');
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const ManifestPlugin = require('webpack-manifest-plugin');
const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin');
const eslintFormatter = require('react-dev-utils/eslintFormatter');
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
const paths = require('./paths');
const getclientEnvironment = require('./env');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

// Webpack uses `publicPath` to determine where the app is being served from.
// It requires a trailing slash,or the file assets will get an incorrect path.
const publicPath = paths.servedPath;
// Some apps do not use client-side routing with pushState.
// For these,"homepage" can be set to "." to enable relative asset paths.
const shouldUseRelativeAssetPaths = publicPath === './';
// Source maps are resource heavy and can cause out of memory issue for large source files.
const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false';
// `publicUrl` is just like `publicPath`,but we will provide it to our app
// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.
// Omit trailing slash as %PUBLIC_URL%/xyz looks better than %PUBLIC_URL%xyz.
const publicUrl = publicPath.slice(0,-1);
// Get environment variables to inject into our app.
const env = getclientEnvironment(publicUrl);

// Assert this just to be safe.
// Development builds of React are slow and not intended for production.
if (env.stringified['process.env'].NODE_ENV !== '"production"') {
  throw new Error('Production builds must have NODE_ENV=production.');
}

// Note: defined here because it will be used more than once.
const cssFilename = 'static/css/[name].[contenthash:8].css';

// ExtractTextPlugin expects the build output to be flat.
// (See https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/27)
// However,our output is structured with css,js and media folders.
// To have this structure working with relative paths,we have to use custom options.
const extractTextPluginOptions = shouldUseRelativeAssetPaths
  ? // Making sure that the publicPath goes back to to build folder.
    { publicPath: Array(cssFilename.split('/').length).join('../') }
  : {};

// This is the production configuration.
// It compiles slowly and is focused on producing a fast and minimal bundle.
// The development configuration is different and lives in a separate file.
module.exports = {
  mode: 'production',optimization: {
      minimizer: [
        // we specify a custom UglifyJsPlugin here to get source maps in production
        new UglifyJsPlugin({
          cache: true,parallel: true,uglifyOptions: {
            compress: false,ecma: 6,mangle: true
          },sourceMap: true
        })
      ]
    },// Don't attempt to continue if there are any errors.
  bail: true,// We generate sourcemaps in production. This is slow but gives good results.
  // You can exclude the *.map files from the build during deployment.
  devtool: shouldUseSourceMap ? 'source-map' : false,// In production,we only want to load the polyfills and the app code.
  entry: [require.resolve('./polyfills'),paths.appIndexJs],output: {
    // The build folder.
    path: paths.appBuild,// Generated JS file names (with nested folders).
    // There will be one main bundle,and one file per asynchronous chunk.
    // We don't currently advertise code splitting but Webpack supports it.
    filename: 'static/js/[name].[chunkhash:8].js',chunkFilename: 'static/js/[name].[chunkhash:8].chunk.js',// We inferred the "public path" (such as / or /my-project) from homepage.
    publicPath: publicPath,// Point sourcemap entries to original disk location (format as URL on Windows)
    devtoolModuleFilenameTemplate: info =>
      path
        .relative(paths.appSrc,info.absoluteResourcePath)
        .replace(/\\/g,'/'),resolve: {
    // This allows you to set a fallback for where Webpack should look for modules.
    // We placed these paths second because we want `node_modules` to "win"
    // if there are any conflicts. This matches Node resolution mechanism.
    // https://github.com/facebookincubator/create-react-app/issues/253
    modules: ['node_modules',paths.appNodeModules].concat(
      // It is guaranteed to exist because we tweak it in `env.js`
      process.env.NODE_PATH.split(path.delimiter).filter(Boolean)
    ),// These are the reasonable defaults supported by the Node ecosystem.
    // We also include JSX as a common component filename extension to support
    // some tools,although we do not recommend using it,see:
    // https://github.com/facebookincubator/create-react-app/issues/290
    // `web` extension prefixes have been added for better support
    // for React Native Web.
    extensions: ['.web.js','.js','.json','.web.jsx','.jsx'],alias: {

      // Support React Native Web
      // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
      'react-native': 'react-native-web',plugins: [
      // Prevents users from importing files from outside of src/ (or node_modules/).
      // This often causes confusion because we only process files within src/ with babel.
      // To fix this,we prevent you from importing files out of src/ -- if you'd like to,// please link the files into your node_modules/ and let module-resolution kick in.
      // Make sure your source files are compiled,as they will not be processed in any way.
      new ModuleScopePlugin(paths.appSrc,[paths.appPackageJson]),],module: {
    strictExportPresence: true,rules: [
      // TODO: Disable require.ensure as it's not a standard language feature.
      // We are waiting for https://github.com/facebookincubator/create-react-app/issues/2176.
      // { parser: { requireEnsure: false } },// First,run the linter.
      // It's important to do this before Babel processes the JS.
      {
        test: /\.(js|jsx)$/,enforce: 'pre',use: [
          {
            options: {
              formatter: eslintFormatter,eslintPath: require.resolve('eslint'),loader: require.resolve('eslint-loader'),include: paths.appSrc,{
        // "oneOf" will traverse all following loaders until one will
        // match the requirements. When no loader matches it will fall
        // back to the "file" loader at the end of the loader list.
        oneOf: [
          // "url" loader works just like "file" loader but it also embeds
          // assets smaller than specified size as data URLs to avoid requests.
          {
            test: [/\.bmp$/,/\.gif$/,/\.jpe?g$/,/\.png$/],loader: require.resolve('url-loader'),options: {
              limit: 10000,name: 'static/media/[name].[hash:8].[ext]',// Process JS with Babel.
          {
            test: /\.(js|jsx)$/,loader: require.resolve('babel-loader'),options: {

              compact: true,// The notation here is somewhat confusing.
          // "postcss" loader applies autoprefixer to our CSS.
          // "css" loader resolves paths in CSS and adds assets as dependencies.
          // "style" loader normally turns CSS into JS modules injecting <style>,// but unlike in development configuration,we do something different.
          // `ExtractTextPlugin` first applies the "postcss" and "css" loaders
          // (second argument),then grabs the result CSS and puts it into a
          // separate file in our build process. This way we actually ship
          // a single CSS file in production instead of JS code injecting <style>
          // tags. If you use code splitting,however,any async bundles will still
          // use the "style" loader inside the async code so CSS from them won't be
          // in the main CSS file.
          {
            test: /\.css$/,loader: ExtractTextPlugin.extract(
              Object.assign(
                {
                  fallback: require.resolve('style-loader'),use: [
                    {
                      loader: require.resolve('css-loader'),options: {
                        importLoaders: 1,minimize: true,sourceMap: shouldUseSourceMap,modules: true,localIdentName: '[name]__[local]__[hash:base64:5]'
                      },{
                      loader: require.resolve('postcss-loader'),options: {
                        // Necessary for external CSS imports to work
                        // https://github.com/facebookincubator/create-react-app/issues/2677
                        ident: 'postcss',plugins: () => [
                          require('postcss-flexbugs-fixes'),autoprefixer({
                            browsers: [
                              '>1%','last 4 versions','Firefox ESR','not ie < 9',// React doesn't support IE8 anyway
                            ],flexbox: 'no-2009',}),extractTextPluginOptions
              )
            ),// Note: this won't work without `new ExtractTextPlugin()` in `plugins`.
          },// "file" loader makes sure assets end up in the `build` folder.
          // When you `import` an asset,you get its filename.
          // This loader don't uses a "test" so it will catch all modules
          // that fall through the other loaders.
          {
            loader: require.resolve('file-loader'),// Exclude `js` files to keep "css" loader working as it injects
            // it's runtime that would otherwise processed through "file" loader.
            // Also exclude `html` and `json` extensions so they get processed
            // by webpacks internal loaders.
            exclude: [/\.js$/,/\.html$/,/\.json$/],options: {
              name: 'static/media/[name].[hash:8].[ext]',// ** STOP ** Are you adding a new loader?
          // Make sure to add the new loader(s) before the "file" loader.
        ],plugins: [
    // Makes some environment variables available in index.html.
    // The public URL is available as %PUBLIC_URL% in index.html,e.g.:
    // <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
    // In production,it will be an empty string unless you specify "homepage"
    // in `package.json`,in which case it will be the pathname of that URL.
    new InterpolateHtmlPlugin(HtmlWebpackPlugin,env.raw),// Generates an `index.html` file with the <script> injected.
    new HtmlWebpackPlugin({
      inject: true,template: paths.appHtml,minify: {
        removeComments: true,collapseWhitespace: true,removeRedundantAttributes: true,useShortDoctype: true,removeEmptyAttributes: true,removeStyleLinkTypeAttributes: true,keepClosingSlash: true,minifyJS: true,minifyCSS: true,minifyURLs: true,// Makes some environment variables available to the JS code,for example:
    // if (process.env.NODE_ENV === 'production') { ... }. See `./env.js`.
    // It is absolutely essential that NODE_ENV was set to production here.
    // Otherwise React will be compiled in the very slow development mode.
    new webpack.DefinePlugin(env.stringified),// Minify the code.
    // Note: this won't work without ExtractTextPlugin.extract(..) in `loaders`.
    new ExtractTextPlugin({
      filename: cssFilename,// Generate a manifest file which contains a mapping of all asset filenames
    // to their corresponding output file so that tools can pick it up without
    // having to parse `index.html`.
    new ManifestPlugin({
      fileName: 'asset-manifest.json',// Generate a service worker script that will precache,and keep up to date,// the HTML & assets that are part of the Webpack build.
    new SWPrecacheWebpackPlugin({
      // By default,a cache-busting query parameter is appended to requests
      // used to populate the caches,to ensure the responses are fresh.
      // If a URL is already hashed by Webpack,then there is no concern
      // about it being stale,and the cache-busting can be skipped.
      dontCacheBustUrlsMatching: /\.\w{8}\./,filename: 'service-worker.js',logger(message) {
        if (message.indexOf('Total precache size is') === 0) {
          // This message occurs for every build and is a bit too noisy.
          return;
        }
        if (message.indexOf('Skipping static resource') === 0) {
          // This message obscures real errors so we ignore it.
          // https://github.com/facebookincubator/create-react-app/issues/2612
          return;
        }
        console.log(message);
      },minify: true,// For unknown URLs,fallback to the index page
      navigateFallback: publicUrl + '/index.html',// Ignores URLs starting from /__ (useful for Firebase):
      // https://github.com/facebookincubator/create-react-app/issues/2237#issuecomment-302693219
      navigateFallbackWhitelist: [/^(?!\/__).*/],// Don't precache sourcemaps (they're large) and build asset manifest:
      staticfileGlobsIgnorePatterns: [/\.map$/,/asset-manifest\.json$/],// Moment.js is an extremely popular library that bundles large locale files
    // by default due to how Webpack interprets its code. This is a practical
    // solution that requires the user to opt into importing specific locales.
    // https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
    // You can remove this if you don't use Moment.js:
    new webpack.IgnorePlugin(/^\.\/locale$/,/moment$/),// Some libraries import Node modules but don't use them in the browser.
  // Tell Webpack to provide empty mocks for them so importing them works.
  node: {
    dgram: 'empty',fs: 'empty',net: 'empty',tls: 'empty',child_process: 'empty',};

不太确定如何解决webpack的新问题。任何建议将不胜感激。

mefie 回答:webpack.optimize.UglifyJsPlugin已被删除

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3142749.html

大家都在问