Webpack 2: WARNING in .png, .svg, .. DEPRECATED. Configure optipng's optimizationLevel option in it's own options. (optipng.optimizationLevel)

跟風遠走 提交于 2019-11-29 10:16:44

You now need to specify your options to the specific optimizer. so a previous webpack 1.x loader config like;

loaders: [
  'file-loader?name=assets/[name].[ext]',
  'image-webpack-loader?progressive=true&optimizationLevel=7&interlaced=true'
]

becomes

      use: [
    {
      loader: 'file-loader',
      options: {
        query: {
          name:'assets/[name].[ext]'
        }
      }
    },
    {
      loader: 'image-webpack-loader',
      options: {
        query: {
          mozjpeg: {
            progressive: true,
          },
          gifsicle: {
            interlaced: true,
          },
          optipng: {
            optimizationLevel: 7,
          }
        }
      }
    }]

Note the options object, with the query embedded inside it.

See https://webpack.js.org/guides/migrating/ and deltones comments in this issue; https://github.com/tcoopman/image-webpack-loader/issues/68#issuecomment-275848595

None of the above was working for me, taking inspiration from the official webpack2 configuration example https://github.com/tcoopman/image-webpack-loader/blob/master/test/webpack2.config.js this is what worked for me

  {
    test: /\.(png|jpe?g|gif|svg)$/,
    use: [
      {
        loader: 'file-loader',
        options: {
          // path where the images will be saved
          name: 'assets/img/[name].[ext]'
        }
      },
      {
        loader: 'image-webpack-loader',
        options: {
          mozjpeg: {
            quality: 65
          },
          pngquant:{
            quality: "10-20",
            speed: 4
          },
          svgo:{
            plugins: [
              {
                removeViewBox: false
              },
              {
                removeEmptyAttrs: false
              }
            ]
          },
          gifsicle: {
            optimizationLevel: 7,
            interlaced: false
          },
          optipng: {
            optimizationLevel: 7,
            interlaced: false
          }
        }
      }
    ]
  }

Webpack 2 now supports "query object" syntax, meaning you can make a separete object for the query parameters. Here is how the image-webpack-loader recommends it in their documentation. I updated it with the newest webpack 2 naming standards:

rules: [ // rules is formerly "loaders" in webpack 1
  {
    test: /\.(svg|jpe?g|png|gif|ico)(\?{0}(?=\?|$))/,
    use: [ // use is formerly "loaders" in webpack 1

      // file-loader has a bug where it doesn't yet recognize query object
      // syntax for webpack 2, so the query options `assets/images/[name].[ext]`
      // are ignored until they fix that,    
      // {
      //  loader: 'file',
      //  query: {
      //    name: 'assets/images/[name].[ext]'
      //   }   
      //},

      'file?name=assets/images/[name].[ext]', // or just 'file-loader'
      {
        loader: 'image-webpack',
        query: {
          progressive: true,
          optimizationLevel: 7,
          interlaced: false,
          pngquant: {
            quality: '65-90',
            speed: 4
          }
        }

       // you can also do it like this:
       // query: {
       //    mozjpeg: {
       //       progressive: true,
       //    },
       //    gifsicle: {
       //       interlaced: false,
       //    },
       //    optipng: {
       //       optimizationLevel: 7,
       //    }
       // }
      }
    ]
  }
]

Note that rules is the same as webpack 1 top level loaders, and use is the same as webpack 1 loaders at the individual loader level (the one after test). As you can see, it was confusing before, which is why the schema has been renamed in webpack 2.

This is caused by having params in the query object that now belong in one of the child objects.

for example:

This is bad:

 'file-loader',
                {
                    loader: 'image-webpack-loader',
                    query: {
                        progressive: true,
                        optimizationLevel: 7,
                        pngquant: {
                            quality: '65-90',
                            speed: 4
                        },
                        mozjpeg: {
                            progressive: true
                        },
                        gifsicle: {
                            interlaced: true
                        },
                        optipng: {
                            optimizationLevel: 7
                        }
                    }
                }

where this is good:

                'file-loader',
                {
                    loader: 'image-webpack-loader',
                    query: {
                        pngquant: {
                            quality: '65-90',
                            speed: 4
                        },
                        mozjpeg: {
                            progressive: true
                        },
                        gifsicle: {
                            interlaced: true
                        },
                        optipng: {
                            optimizationLevel: 7
                        }
                    }
                }

The following webpack2 config of image-webpack-loader works fine for me:

{
    loader: 'image-webpack-loader',
    options: {
        progressive: true,
        optipng: {
            optimizationLevel: 7,
        },
        mozjpeg: {
            quality: 65
        },
        gifsicle: {
            interlaced: true,
        },
        pngquant: {
            quality: '65-90',
            speed: 4
        }
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!