【发布时间】:2021-05-10 04:06:48
【问题描述】:
我将大约 80 个自定义 SVG 图标导入到 Svelte 前端应用程序中。它以 https://github.com/sveltejs/template 为基础,使用 Rollup 构建,包括 Typescript、Tailwind 和所有现代好东西。
难题是如何将图标添加到应用程序中。作为 SVG,图标是不超过 2kB 的短 XML 文本字符串。
选项 1:作为图片资源
- 将所有图标以
foo.svg上传到public/assets/icons。 - 创建一个精简组件
<Icon type="foo' />,使用<img src="foo.svg>显示图标。
这种方法意味着图标不是代码的一部分。
优点:图标可以由前端代码按需动态加载。无需将所有图标捆绑到应用代码中。
缺点:如果有很多新图标,页面加载速度会很慢,并且浏览器必须获取十几个 1kB 的文件。将应用部署为 PWA 意味着我们需要手动告诉它预先缓存图标。
选项 2:作为应用构建的一部分
- 使用https://github.com/cristovao-trevisan/svelte-icon或https://github.com/codefeathers/rollup-plugin-svelte-svg之类的东西直接将每个图标导入代码:
import Home from './icons/home.svg'; - 创建一个纤细的组件,选择正确的导入组件或 SVG 字符串并显示它。
在这里,图标作为文本字符串与应用程序本身捆绑在一起。
优点:图标作为应用程序包的一部分提供。缓存是不必要的。可以动态修改一些图标代码,例如加载时的颜色、viewBox 等。
缺点:没有必要在应用程序中包含所有图标以减少第一个字节的时间。不能在不增加复杂性的情况下进行捆绑拆分等。使渲染速度变慢,因为 Javascript 代码需要首先将字符串转换为 SVG,而不仅仅是加载图像。
问题
- 从这个分析看来,在应用程序中构建图标是一种更好的方法,但我是否遗漏了什么?
- 如果“图标”是 50-100kB 的详细图像而不是此处的小字符串,那么微积分是否会改变?
【问题讨论】:
-
选项 3:使用仅包含
d路径数据的字符串创建带有<svg-icon>自定义元素的 SVG 客户端;请参阅iconmeister.github.io - 我从未做过 Svelte 版本,因为 Svelte 可以很好地处理<svg-icon>本机元素。我已经从不同的 IconSet 转换了 7000 多个图标 - JS 代码只有 800 字节 GZipped -
附言。如果 "icons" 有 50-100kB,则 "designer" 有问题。我在 16kB 和 300+ Country flags 在 29kB 中做了 52 Playingcards
-
我总是将它们内联(选项 2),但请确保优化所有 svg,这些尺寸确实非常大,您可以使用 svgomg 之类的工具进行优化。如果图标来自设计师,他们的工具也可以导出它们,只需检查 svg,如果您看到很多废话而不是普通路径,则表明它们未优化。
-
专注于移动 3G,速度必须先行(我更喜欢 Danny 的选项 3,就像其他人说的大小对于 svg 来说似乎很大)
-
@StephaneVanraes 你是说 1kb 大还是 50kb 大?
标签: javascript typescript svg svelte rollupjs