简体   繁体   English

如何将 SVG 导入 Next.js 组件?

[英]How to import SVG into Next.js component?

I am trying to import an SVG image from file into a Next.js component.我正在尝试将 SVG 图像从文件导入 Next.js 组件。

In the assets folder I have google.svg (icon):在资产文件夹中,我有 google.svg(图标):

<svg className="svgIcon-use" width="25" height="37" 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>

I need to import that SVG inside of this inside of the Next.js component:我需要在 Next.js 组件的内部导入该 SVG:

import googleLogo from '../assets/google.svg';

class Login extends React.Component {
  render() {
    return (
      <LoginLayout title="Login Page">
        <div>
          <Link href="/auth/google">
            <a className="button">
              <div>
                <span className="svgIcon t-popup-svg">
                  {googleLogo}   // <---- import here icon
                </span>
                
              </div>
            </a>
          </Link>
        </div>
      </LoginLayout>
    );
  }
}

I installed this package: https://www.npmjs.com/package/next-images我安装了这个包: https ://www.npmjs.com/package/next-images

and set configuration based on that documentation in next.config.js :并根据next.config.js中的文档设置配置:

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({
    exclude: path.resolve(__dirname, 'client/assets/svg'),
    webpack(config, options) {
      return config;
    }
  })
);

Why my import of SVG does not work?为什么我的 SVG 导入不起作用?

Another approach would be to make a component for your svg.另一种方法是为您的 svg 创建一个组件。 I like this approach because I can easily pass in props for width, height color etc if required on the svg.我喜欢这种方法,因为如果 svg 需要,我可以轻松地传递宽度、高度颜色等的道具。

//GoogleLogo.js
import React from "react";
export default function GoogleLogo() {
  return (
    <svg className="svgIcon-use" width="25" height="37" 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>
  );
}

and in your file from above.并在您的文件中。

  import GoogleLogo from "./GoogleLogo";

  class Login extends React.Component {
    render() {
      return (
        <LoginLayout title="Login Page">
          <div>
            <Link href="/auth/google">
              <a className="button">
                <div>
                  <span className="svgIcon t-popup-svg">
                    <GoogleLogo />
                  </span>

                </div>
              </a>
            </Link>
          </div>
        </LoginLayout>
      );
    }
  }

I've recently added this myself.我最近自己添加了这个。 I followed the example on the Next.js repo.我按照 Next.js 存储库中的示例进行操作。

https://github.com/zeit/next.js/tree/master/examples/svg-components https://github.com/zeit/next.js/tree/master/examples/svg-components

There's a couple of steps -有几个步骤-

  1. You need to install the following dependency :您需要安装以下依赖项:
  • babel-plugin-inline-react-svg babel-plugin-inline-react-svg
  1. Inside your .babelrc you need to add the plugin babel-plugin-inline-react-svg在您的.babelrc ,您需要添加插件babel-plugin-inline-react-svg
  "plugins": [
    "inline-react-svg",
  ]

You should then be able to import your SVG's into your components.然后,您应该能够将 SVG 导入到您的组件中。 Here's a gist of something similar I used it for.这是我用它做的类似事情的要点。

https://gist.github.com/iamchristough/493c60112770058566d559e6860dc4c9 https://gist.github.com/iamchristough/493c60112770058566d559e6860dc4c9

Note - you need to declare it as its own component <GoogleLogo /> if you just did {GoogleLogo} it will error.注意 - 你需要将它声明为它自己的组件<GoogleLogo />如果你刚刚做了{GoogleLogo}它会出错。 Also there is an issue with how babel transforms the SVG so any changes inside the SVG file won't appear. babel 转换 SVG 的方式也存在问题,因此 SVG 文件中的任何更改都不会出现。 You need to rename the file in order for the bundler to see a change.您需要重命名文件才能让捆绑程序看到更改。

You can use @svgr/webpack plugin to convert svg imports to react component.您可以使用@svgr/webpack插件将 svg 导入转换为反应组件。

This will allow you to do the following:这将允许您执行以下操作:

import Icon from './icon.svg';

<Icon />

您可以使用 svgr https://github.com/gregberge/svgr将 svg 转换为组件

I got SVGs working with this next.js config.我让 SVG 使用这个 next.js 配置。

next.config.js next.config.js

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

    return config
  },
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM