在 react 里面使用 svg
一、在 create-react-app 創建的項目中
方式 1、
import logo from './logo.svg'; <img src={logo} />
缺點在於不能在修改顏色,這里其實就是直接用 img 加載了 svg 文件
方式 2、
import {ReactComponent as ComLogo} from './logo.svg'; <ComLogo />
這里可以看見,實際上就是渲染了一個 SVG ,自定義的程度會很高。不過有版本需要:
react-scripts 版本要大於 @2.0.0
react 版本大於 @16.3.0
具體可以參考官方文檔
二、自己從零開始配置的 webpack 項目
如果使用上面的第二種方式引入,發現竟然是 undefined , 進過研究發現需要一些配置。
注意 1、 typescript 項目 需要在項目根目錄 加一個 custom.d.ts 文件聲明。
寫入:
declare module '*.svg' { import React = require('react'); export const ReactComponent: React.FunctionComponent<React.SVGProps<SVGSVGElement>>; const src: string; export default src; }
然后在 tsconfig.json 中加入:
注意 2 、通過對 create-react-app 進行 eject , 查看配置發現,還需要給 webpack 加入配置:
[ require.resolve('babel-plugin-named-asset-import'), { loaderMap: { svg: { ReactComponent: '@svgr/webpack?-svgo,+ref![path]', }, }, }, ],
最后安裝:
yarn add babel-plugin-named-asset-import yarn add @svgr/webpack
三、如果 在 create-react-app 使用了 @craco/craco 進行修改 webpack 配置。
那么一樣需要安裝
@svgr/webpack
然后配置如下:
module.exports = { plugins: [ ], // ... 其他配置 webpack: { configure: (config, { env, paths }) => { // 需要在這里添加 config.module.rules.push({ test: /\.svg$/, use: ["@svgr/webpack"] }); return config; } } };