You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 14中如何同时配置SVGR与默认图片加载器?

解决Next.js 14中@svgr/webpack与默认图片加载器的SVG冲突问题

核心问题分析

Next.js内置图片加载器默认处理SVG文件,添加@svgr/webpack后,需明确区分两种导入场景:带?react后缀的SVG作为组件加载,不带后缀的作为静态资源(URL或base64)加载。之前配置失败大概率是因为未精准定位并修改Next.js内置规则的匹配条件,或是规则结构定位错误。

具体解决步骤

1. 精准配置next.config.js的webpack规则

在next.config.js中通过webpack函数修改规则,确保两种导入方式匹配对应加载器:

/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack(config) {
    // 收集所有处理SVG的内置规则(包括oneOf分组内的规则)
    const svgRules = [];
    config.module.rules.forEach(rule => {
      if (rule.test?.test?.('.svg')) svgRules.push(rule);
      if (rule.oneOf) {
        rule.oneOf.forEach(oneOfRule => {
          if (oneOfRule.test?.test?.('.svg')) svgRules.push(oneOfRule);
        });
      }
    });

    // 修改内置SVG规则,排除带?react的请求
    svgRules.forEach(rule => {
      rule.resourceQuery = { not: [/react/] };
    });

    // 添加SVGR规则,仅处理带?react的SVG
    config.module.rules.push({
      test: /\.svg$/i,
      issuer: /\.[jt]sx?$/, // 仅在JS/TSX文件中生效
      resourceQuery: /react/, // 匹配带?react的导入
      use: ['@svgr/webpack'],
    });

    return config;
  },
};

export default nextConfig;

2. 清除缓存并验证

修改配置后,先清除webpack缓存再重启开发服务器:

npx next clean
npm run dev

3. 排查其他冲突

  • 暂时注释其他自定义SVG相关规则,验证是否存在多规则冲突
  • 确认@svgr/webpack版本与Next.js 14兼容,建议使用最新稳定版

关键注意点

Next.js的webpack规则多嵌套在oneOf分组中,直接修改顶层规则可能无效,必须精准定位所有处理SVG的内置规则,通过resourceQuery排除带?react的请求;同时让SVGR规则仅匹配带该后缀的导入,实现两种场景互不干扰。

内容的提问来源于stack exchange,提问作者tremby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 23:12:11