React+Webpack项目配置url-loader后无法渲染img图片报错如何解决
错误原因
- resolveLoader配置错误:配置项
resolveLoader.extensions: ["babel-loader"]会限制webpack仅能识别后缀为babel-loader的loader,导致你配置的url-loader无法被正常加载,因此png文件没有对应的处理loader触发报错。 - resolve字段重复定义:配置文件中出现了两个
resolve对象,后面携带fallback的resolve会直接覆盖前面携带extensions的配置,导致配置的模块后缀识别规则失效。 - url-loader配置写法不规范:内联传参的写法在部分webpack版本中存在兼容问题,可能导致配置不生效。
修复步骤
- 先安装必要依赖(如果未安装):
npm install url-loader file-loader --save-dev
- 修改webpack.config.js配置:
- 删除错误的
resolveLoader配置,正常场景不需要自定义该配置 - 合并两个
resolve配置到同一个对象中 - 规范url-loader的参数写法
修改后的完整配置参考:
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: { main: path.join(__dirname, 'client/src/index.js') }, output: { path: path.join(__dirname, 'build'), filename: 'bundle.js' }, plugins: [new HtmlWebpackPlugin({ title: 'Ig Scraper', template: path.join(__dirname, 'client/templates/index.ejs'), filename: 'index.html' })], module: { rules: [ { test: /\.(js|jsx)$/, exclude: /(node_modules|express)/, use: { loader: 'babel-loader', options: { presets: [ "@babel/preset-env", "@babel/preset-react" ] }, } }, { test: /\.(html)$/, use: { loader: 'html-loader', options: { attrs: [':data-src'] } } }, { test: /\.css$/i, use: ['style-loader', 'css-loader'], }, { test: /\.(jpe?g|png|gif|woff|woff2|eot|ttf|svg)(\?[a-z0-9=.]+)?$/, use: [ { loader: 'url-loader', options: { limit: 100000 } } ] } ] }, devServer: {}, resolve: { extensions: ["*", ".js", ".jsx"], fallback: { fs: false } }, devtool: 'source-map', mode: 'development' };
- 配置修改完成后重启webpack devServer即可生效。
可选优化(webpack5场景)
如果你使用的是webpack5版本,可以直接移除url-loader和file-loader依赖,用内置的asset模块替代,配置更简单:
把处理静态资源的rule替换为:
{ test: /\.(jpe?g|png|gif|woff|woff2|eot|ttf|svg)(\?[a-z0-9=.]+)?$/, type: 'asset', parser: { dataUrlCondition: { maxSize: 100 * 1024 // 对应原来的100000 limit配置 } } }
内容的提问来源于stack exchange,提问作者CesarDlr
相关产品推荐
相关产品推荐

