我正在使用 rollup 捆绑一个 react npm 包,该包包含一个图标组件,该组件将名称作为道具并返回一个图标,该名称由反应组件包装。这是组件代码:
import sprite from './public/sprite.svg';
function Icon({ name }) {
return <svg className="svg-wrapper">
<use href={`${sprite}#${name}`} />
</svg>
);
}
文件夹结构如下:
- src
- - public
- - - sprite.svg
- - icons
- - - some-icon.svg
- - - some-other-icon.svg
- - index.tsx # component with the code mentioned above
这是我的汇总配置:
export default {
plugins: [
esbuild({
sourceMap: false,
target: "esnext"
}),
image(),
svgicons({
inputFolder: "src/icons",
output: "public/sprite.svg"
}),
json()
]
}
这在 Chrome 中运行良好(尽管它确实将所有 svg 内联在href
其中,我认为这是这种方法的目的),但在 Safari 中它会触发以下错误:
Unsafe attempt to load URL data:image/svg+xml,%3c%3fxm ....
Domains, protocols and ports must match.
问题是,如前所述,这是一个 npm 包,它将图标打包为 js 包的一部分(内联),因此对该组件的服务方式没有太多控制,因为这是由浏览器缓存处理的(也是关键之一使用这种方法的要点)。我对 CORS 非常熟悉,我知道也许避免使用data:image/svg+xml
uri 链接可以解决这个问题,但会增加这个包的构建步骤的复杂性(需要使用 svgr/svgo 构建图标,然后有某种查找表根据名称道具返回正确的图标,即)。
所以,最终我的问题是,使用 react 组件库中的 sprite 方法是否有一种避免此类问题和跨浏览器不一致的万无一失的方法?提前感谢您提供的任何帮助。