Reactで動的にSVGを読み込む以下のようなコンポーネントを作りました。
react-svg-loaderを使っています。
結果として、ビルドで警告が出てブラウザでエラーが発生し、SVGの表示ができません。
どのようにしたらsrcを動的に決め、SVGを表示できるでしょうか?
作ったコンポーネント
lazySVG.tsx
typescript
1import * as React from "react"; 2 3export interface Props extends React.SVGProps<SVGSVGElement> { 4 src: string; 5} 6 7const LazySVG = React.memo(({ src, ...svgProps }: Props) => { 8 const SVG = React.lazy(() => import(src)); 9 10 return ( 11 <React.Suspense fallback={null}> 12 <SVG {...svgProps} /> 13 </React.Suspense> 14 ); 15}); 16 17export default LazySVG;
ビルドで発生する警告
WARNING in ./src/lazySVG.tsx 9:62-75 Critical dependency: the request of a dependency is an expression
ブラウザで発生するエラー
Uncaught Error: Cannot find module './rsrc/hoge.svg'
ビルド環境
package.json
json
1{ 2 "dependencies": { 3 "react": "^16.8.6", 4 "react-dom": "^16.8.6", 5 }, 6 "devDependencies": { 7 "react-svg-loader": "^3.0.3", 8 "ts-loader": "^5.3.3", 9 "typescript": "^3.4.1", 10 "webpack": "^4.29.6", 11 } 12}
webpack.js
javascript
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /.tsx?$/, 6 use: { 7 loader: "ts-loader", 8 options: { 9 transpileOnly: true 10 } 11 }, 12 exclude: /node_modules/ 13 }, 14 { 15 test: /.svg$/, 16 use: ["react-svg-loader"] 17 } 18 ] 19 }, 20};
その他補足
const SVG = React.lazy(() => import(src));
の行で直接パスを書くと正常に動作します。
例:const SVG = React.lazy(() => import("./rsrc/hoge.svg"));
回答1件
あなたの回答
tips
プレビュー