如何在Next.js组件中使用SVG图像?

6
next.config.js 中,我添加了必要的配置以使用 SVG 图像。
const withCSS = require('@zeit/next-css');
const withSass = require('@zeit/next-sass');
const withImages = require('next-images');

module.exports = withCSS(
  withSass(
    {
      webpack: (config) => config,
      distDir: '../_next'
    },
    withImages({
      webpack(config, options) {
        return config;
      }
    })
  )
);

这是我的SVG文件,位于下一个文件夹中 /client/assets/googleIcon.svg

问题可能出现在SVG文件中。我对SVG没有经验,这个SVG是否正确?

<svg version="1.1" width="100%" height="100%" viewBox="0 0 25 25">
  <g fill="none" fillRule="evenodd">
    <path
      d="M20.66 12.693c0-.603-.054-1.182-.155-1.738H12.5v3.287h4.575a3.91 3.91 0 0 1-1.697 2.566v2.133h2.747c1.608-1.48 2.535-3.65 2.535-6.24z"
      fill="#4285F4"
    />
    <path
      d="M12.5 21c2.295 0 4.22-.76 5.625-2.06l-2.747-2.132c-.76.51-1.734.81-2.878.81-2.214 0-4.088-1.494-4.756-3.503h-2.84v2.202A8.498 8.498 0 0 0 12.5 21z"
      fill="#34A853"
    />
    <path
      d="M7.744 14.115c-.17-.51-.267-1.055-.267-1.615s.097-1.105.267-1.615V8.683h-2.84A8.488 8.488 0 0 0 4 12.5c0 1.372.328 2.67.904 3.817l2.84-2.202z"
      fill="#FBBC05"
    />
    <path
      d="M12.5 7.38c1.248 0 2.368.43 3.25 1.272l2.437-2.438C16.715 4.842 14.79 4 12.5 4a8.497 8.497 0 0 0-7.596 4.683l2.84 2.202c.668-2.01 2.542-3.504 4.756-3.504z"
      fill="#EA4335"
    />
  </g>
</svg>

最后我导入了这个文件并尝试以以下方式展示图片:

  1. {googleIcon}
  2. <img src={googleIcon} />

当我运行应用程序时,我收到以下错误:

./assets/googleIcon.svg 2:0
Module parse failed: Unexpected token (2:0)
You may need an appropriate loader to handle this file type.
3个回答

3
我建议将你的svg包装在一个组件中,然后使用这个组件:

function Icon () {
  return (
    <svg version="1.1" width="100%" height="100%" viewBox="0 0 25 25">
      <g fill="none" fillRule="evenodd">
        <path
          d="M20.66 12.693c0-.603-.054-1.182-.155-1.738H12.5v3.287h4.575a3.91 3.91 0 0 1-1.697 2.566v2.133h2.747c1.608-1.48 2.535-3.65 2.535-6.24z"
          fill="#4285F4"
        />
        <path
          d="M12.5 21c2.295 0 4.22-.76 5.625-2.06l-2.747-2.132c-.76.51-1.734.81-2.878.81-2.214 0-4.088-1.494-4.756-3.503h-2.84v2.202A8.498 8.498 0 0 0 12.5 21z"
          fill="#34A853"
        />
        <path
          d="M7.744 14.115c-.17-.51-.267-1.055-.267-1.615s.097-1.105.267-1.615V8.683h-2.84A8.488 8.488 0 0 0 4 12.5c0 1.372.328 2.67.904 3.817l2.84-2.202z"
          fill="#FBBC05"
        />
        <path
          d="M12.5 7.38c1.248 0 2.368.43 3.25 1.272l2.437-2.438C16.715 4.842 14.79 4 12.5 4a8.497 8.497 0 0 0-7.596 4.683l2.84 2.202c.668-2.01 2.542-3.504 4.756-3.504z"
          fill="#EA4335"
        />
      </g>
    </svg>
  )
}

ReactDOM.render(<Icon />, document.getElementById('app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="app" />

如果您确实需要将svg作为图像加载,则需要配置您的webpack。

npm install @svgr/webpack

然后:

module.exports = {
  webpack(config) {
    config.module.rules.push({
      test: /\.svg$/,
      use: ['@svgr/webpack'],
    });

    return config;
  }
};

请查看这个答案

我不能那样做,因为这个图像将被发送到AWS S3,这就是为什么必须作为SVG文件的原因。 - Mark James
1
请明确您的问题。 - soywod
1
我更新了我的回答,请看 https://dev59.com/RFMI5IYBdhLWcg3w2_VT - soywod
问题是我无法显示SVG图像。我安装了用于读取SVG图像的模块,但它不起作用。 - Mark James

2
当我在选项中添加esModule: false时,它可以正常工作。
config.module.rules.push({
  test: /\.(eot|woff|woff2|ttf|svg|png|jpg|gif)$/,
  use: {
    loader: 'url-loader',
    options: {
      limit: 100000,
      name: '[name].[ext]',
      esModule: false,
    },
  },
});

2
你需要将withImages嵌套到withSass函数中。这就是为什么这些函数需要将config作为参数的原因。
如果你需要提供每个参数,它们可以合并成最嵌套的函数参数。
module.exports = withCSS(
  withSass(
    withImages({
      distDir: '../_next',
      webpack(config, options) {
        return config;
      }
    })
  )
);


不错,我修复了那个错误,你知道为什么会出现这个错误吗:"Invariant Violation: Invalid tag: data:image/svg+xml;base64"? - Mark James
1
@MarkJames 你不是在尝试第二种方法吗,<img src={googleIcon} /> - Agney
我已经尝试过了,但仍然不起作用。现在webpack加载器没有问题,只是图片没有显示出来。实际上,我得到的是警告信息而不是错误。 - Mark James
1
很难从这个看出来,但是当在React中直接渲染base64图像时,类似于{googleIcon}的东西通常会导致此警告。 - Agney

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