如何使用 Next.js 中的 next/image 或 <img> 渲染来自 api 响应的 SVG?
How to render SVGs coming from api response using next/image or <img> in Next.js?
我从 api 响应中得到了一堆 svg,我在 useEffect
中得到了它们。响应看起来像这样
{svg1: 'https://remoteserver.com/assests/svg1.svg', ...and so on}
(这些 svg 不是静态的,来自 /public
文件夹。所以我不会在顶部导入它们。)
我想使用 next/image
或普通 <img>
标签在 nextjs 中呈现它们,将 url 传递到 src
。我知道 next.js 默认情况下不支持 svgs。
<Image alt='SVG from api'
src={response.svg1}
width={'45px'}
height={'45px'}
objectFit='contain' />
根据 docs,dangerouslyAllowSVG
可以做到这一点,但这里存在安全风险,所以我不想走这条路。
我知道像 SVGR and babel-inline-svg 这样的包可以解决这个问题,但它们是为了使用 svgs 作为反应组件。
我也试过 next-images 并在 next.config.js
.
中使用了 withImages
const withImages = require('next-images')
module.exports = withImages({
reactStrictMode: true,
env: {
BASE_URL: process.env.BASE_URL
},
images: {
domains: ['remoteserver.com', 'remoteserver2.com']
},
webpack(config, options) {
return config
}
})
但是当我尝试 next build
时构建失败了。
./static/images/Logo.png
TypeError: unsupported file type: undefined (file: undefined)
我missing/doing哪里错了?有没有其他解决方案?
显然我选择了 dangerouslyAllowSVG 并添加了 CSP headers。
仍然没有从 next/image
加载 <Image />
的 svg。不过,当我使用普通的 <img>
标签时它起作用了。
虽然不确定这是否是最佳解决方案 :)
我从 api 响应中得到了一堆 svg,我在 useEffect
中得到了它们。响应看起来像这样
{svg1: 'https://remoteserver.com/assests/svg1.svg', ...and so on}
(这些 svg 不是静态的,来自 /public
文件夹。所以我不会在顶部导入它们。)
我想使用 next/image
或普通 <img>
标签在 nextjs 中呈现它们,将 url 传递到 src
。我知道 next.js 默认情况下不支持 svgs。
<Image alt='SVG from api'
src={response.svg1}
width={'45px'}
height={'45px'}
objectFit='contain' />
根据 docs,dangerouslyAllowSVG
可以做到这一点,但这里存在安全风险,所以我不想走这条路。
我知道像 SVGR and babel-inline-svg 这样的包可以解决这个问题,但它们是为了使用 svgs 作为反应组件。
我也试过 next-images 并在 next.config.js
.
withImages
const withImages = require('next-images')
module.exports = withImages({
reactStrictMode: true,
env: {
BASE_URL: process.env.BASE_URL
},
images: {
domains: ['remoteserver.com', 'remoteserver2.com']
},
webpack(config, options) {
return config
}
})
但是当我尝试 next build
时构建失败了。
./static/images/Logo.png
TypeError: unsupported file type: undefined (file: undefined)
我missing/doing哪里错了?有没有其他解决方案?
显然我选择了 dangerouslyAllowSVG 并添加了 CSP headers。
仍然没有从 next/image
加载 <Image />
的 svg。不过,当我使用普通的 <img>
标签时它起作用了。
虽然不确定这是否是最佳解决方案 :)