阅读视图

发现新文章,点击刷新页面。

使用 svgfmt 优化 SVG 图标

前言:SVG 图标的常见问题

在日常开发中,我们经常需要使用设计师提供的 SVG 图标。然而,从 Figma 等设计工具导出的 SVG 文件往往存在一些问题:

首先是代码冗余。设计工具导出的 SVG 通常包含大量不必要的标签,如 <defs><g><clipPath> 等容器元素,这些元素在实际使用中往往是多余的。其次,颜色值被写死。SVG 中的颜色通常以 fill="#333333" 这样的形式硬编码,导致无法像 icon font 那样通过 CSS 的 color 属性动态控制图标颜色。此外,文件中还可能包含不必要的属性和元数据,使得文件体积偏大。

这些问题给开发者带来了不少困扰:无法灵活控制图标样式,手动清理每个文件效率低下且容易出错,难以构建统一的图标管理系统。

svgfmt 简介

svgfmt 是一个专门用于优化 SVG 图标的开源工具,它采用 monorepo 架构,包含两个核心包:

  • @svgfmt/cli:命令行工具,提供便捷的文件处理能力,支持单文件和批量处理
  • @svgfmt/core:核心库,可以轻松集成到自定义脚本和构建流程中

svgfmt 能够自动清理冗余标签、移除固定颜色值、合并路径,让 SVG 图标变得更加轻量和易于维护。

使用指南

命令行使用(@svgfmt/cli)

首先安装 CLI 工具:

npm install -g @svgfmt/cli

基础用法

# 格式化单个文件(原地修改)
svgfmt icon.svg

# 批量处理并输出到指定目录
svgfmt "icons/**/*.svg" -o dist/icons

# 处理单个文件并输出到新位置
svgfmt logo.svg -o logo-optimized.svg

自定义转换

svgfmt 支持通过 --transform 参数自定义转换逻辑:

# 使用转换文件
svgfmt icons/*.svg --transform ./transform.js

# 使用内联代码
svgfmt icons/*.svg -t 'svg => svg.replace(/<svg/, "<svg class=\"icon\"")'

转换文件示例(transform.js):

export default function(svg) {
  return svg.replace(/<svg/, '<svg class="icon"');
}

// 或者使用命名导出
export function transform(svg) {
  return svg.replace(/<svg/, '<svg data-processed="true"');
}

编程方式使用(@svgfmt/core)

在项目中安装核心库:

npm install @svgfmt/core

基础示例

import { format } from '@svgfmt/core';

const svgContent = `<svg>...</svg>`;
const optimizedSvg = await format(svgContent);

高级配置

import { format } from '@svgfmt/core';

const result = await format(svgContent, {
  // 提高路径追踪精度(默认 600)
  traceResolution: 800,
  
  // 自定义转换函数
  transform: (svg) => {
    return svg.replace(/<svg/, '<svg class="custom-icon"');
  }
});

对于需要异步处理的场景,transform 函数也支持异步:

const result = await format(svgContent, {
  transform: async (svg) => {
    // 执行异步操作
    const processed = await someAsyncOperation(svg);
    return processed;
  }
});

优化效果对比

让我们看一个实际的优化案例:

优化前

<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  <g opacity="0.6" clip-path="url(#clip0_144244_67656)">
    <circle cx="6" cy="6" r="5" stroke="#333" style="stroke:#333;stroke-opacity:1;" />
    <path d="M6 3.5V6L7.25 7.25" stroke="#333" style="stroke:#333;stroke-opacity:1;" />
  </g>
  <defs>
    <clipPath id="clip0_144244_67656">
      <rect width="12" height="12" fill="#333" style="fill:#333;fill-opacity:1;" />
    </clipPath>
  </defs>
</svg>

优化后

<svg viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg">
  <path
    d="M5.660 0.521 C 4.899 0.566,4.190 0.760,3.500 1.111 C 2.479 1.630,1.630 2.479,1.111 3.500 C 0.702 4.303,0.516 5.086,0.516 6.000 C 0.516 6.748,0.635 7.374,0.904 8.050 C 1.386 9.261,2.332 10.295,3.500 10.889 C 4.085 11.187,4.680 11.369,5.332 11.451 C 5.675 11.494,6.325 11.494,6.668 11.451 C 8.173 11.262,9.516 10.479,10.410 9.270 C 10.792 8.753,11.059 8.227,11.248 7.620 C 11.517 6.754,11.562 5.741,11.369 4.842 C 11.027 3.241,9.959 1.853,8.500 1.111 C 7.617 0.662,6.653 0.461,5.660 0.521 M6.720 1.549 C 7.447 1.673,8.126 1.965,8.720 2.408 C 8.964 2.590,9.410 3.036,9.592 3.280 C 10.040 3.880,10.330 4.559,10.454 5.298 C 10.505 5.599,10.505 6.401,10.454 6.702 C 10.330 7.441,10.040 8.120,9.592 8.720 C 9.410 8.964,8.964 9.410,8.720 9.592 C 8.120 10.040,7.441 10.330,6.702 10.454 C 6.401 10.505,5.599 10.505,5.298 10.454 C 4.559 10.330,3.880 10.040,3.280 9.592 C 3.035 9.410,2.589 8.963,2.408 8.720 C 1.955 8.111,1.671 7.445,1.546 6.702 C 1.495 6.401,1.495 5.599,1.546 5.298 C 1.671 4.556,1.955 3.891,2.408 3.280 C 2.588 3.036,3.036 2.588,3.280 2.408 C 3.968 1.898,4.680 1.618,5.560 1.512 C 5.729 1.492,6.537 1.517,6.720 1.549 M5.500 4.845 L 5.500 6.190 6.200 6.890 L 6.900 7.590 7.245 7.245 L 7.590 6.900 7.045 6.355 L 6.500 5.810 6.500 4.655 L 6.500 3.500 6.000 3.500 L 5.500 3.500 5.500 4.845"
    fill-rule="evenodd"
  />
</svg>

主要改进包括:

  • 移除冗余标签:去除了不必要的 <defs><g><clipPath> 等容器元素
  • 颜色属性移除:删除固定的 fill 属性,图标将继承父元素的 color,可以通过 CSS 灵活控制
  • 路径合并:多个子元素被智能合并为单一路径

实践场景

集成到开发流程

package.json 中添加脚本命令:

{
  "scripts": {
    "optimize-icons": "svgfmt raw-icons/**/*.svg -o src/assets/icons",
    "build": "npm run optimize-icons && vite build"
  }
}

这样在每次构建前都会自动优化图标文件。

配合构建工具使用

在构建脚本中使用编程 API:

import { formatPattern } from '@svgfmt/cli';

// 在构建时自动优化图标
async function buildIcons() {
  const summary = await formatPattern('icons/**/*.svg', {
    output: 'dist/icons'
  });

  console.log(`优化完成: ${summary.success}/${summary.total}`);
  
  // 检查单个文件结果
  for (const result of summary.results) {
    if (result.success) {
      console.log(`✓ ${result.input}${result.output}`);
    } else {
      console.error(`✗ ${result.input}: ${result.error}`);
    }
  }
}

buildIcons();

自定义转换示例

创建一个转换文件 transform.js,为所有 SVG 添加统一属性:

export default function(svg) {
  return svg
    .replace(/<svg/, '<svg class="icon"')
    .replace(/viewBox/, 'preserveAspectRatio="xMidYMid meet" viewBox');
}

然后在命令行中使用:

svgfmt icons/*.svg --transform ./transform.js -o dist/icons

注意事项

在使用 svgfmt 时,有几点需要注意:

  1. 仅支持单色图标:该工具专为单色图标设计。多色 SVG 在路径追踪过程中会被转换为单色,因为工具会将 SVG 转换为 PNG 再转回 SVG,这个过程会丢失颜色信息。

  2. 路径精度配置traceResolution 参数控制路径追踪的精度,默认值为 600。提高该值可以获得更精细的路径,但会增加处理时间。建议的取值范围是 600-1200。

  3. 文件覆盖提醒:使用命令行工具时,默认会覆盖原文件。建议在处理前先备份原始文件,或使用 -o 参数指定输出目录。

  4. 复杂图形检查:对于复杂的多色插图或渐变效果的 SVG,建议在优化后手动检查结果,确保视觉效果符合预期。

  5. 工具组合:svgfmt 可以与其他 SVG 工具配合使用,如 SVGO(进一步优化)、svgr(转换为 React 组件)等,构建完整的 SVG 处理流程。

总结

svgfmt 通过自动化的方式解决了 SVG 图标在实际使用中的常见问题,让图标文件更轻量、更易维护。无论是通过命令行快速处理一批图标,还是将其集成到构建流程中实现自动化优化,svgfmt 都能显著提升开发效率。

项目已在 GitHub 开源,包含完整的文档和示例。如果你在项目中遇到 SVG 图标管理的问题,不妨试试 svgfmt,欢迎使用和贡献代码。

鸣谢

博客文章

MacBook Pro M5 首发评测:苹果最接近「游戏本」的一次?

在过去的很长时间里,「用 Mac 打游戏」一直是网络上一个长久不衰的梗。

但是伴随着近几年苹果深耕 macOS 软件生态、开始主动加大和游戏厂商的合作力度之后,我们得以在 Mac 上见到越来越多经典 IP,「用 Mac 打游戏」听起来似乎不是那么离谱了。

而这背后的一切,除了苹果难得的主动合作态度之外,更要归功于 Apple Silicon 自身在性能和功耗方面的提升。

这不,苹果又在前两天发布了使用 M5 处理器的三款新品:iPad Pro、MacBook Pro 以及 Vision Pro。

爱范儿收到的这台 14 寸 MacBook Pro 是 10+10 核心的 M5 标准版,内存规格为 M5 所支持的最大容量 32GB,以及 1TB 的硬盘,和一块纳米纹理玻璃的抗眩光屏幕:

和今年有抗眩光涂层的 iPhone 17 Pro 相比,MacBook Pro 上纳米纹理玻璃 + 抗反射涂层的组合,无论是在泛光的室外还是充满点光源的室内,消除反光的效果都相当出色。

但 M5 MacBook Pro 的外围硬件和前代其实没有区别,真正让它脱颖而出的,还得是机身里的这块 M5 处理器。

今年的 M5,是继 M3 和 M4 以来,苹果连续第三年推出 3nm 处理器了。M5 的制造工艺换成了 A19 Pro 同款的第三代台积电 3 纳米工艺(N3P)。

换句话说,和 A19 Pro 师出同门的新架构,让 M5 的能效比得到了进一步提升,也让 MacBook 原本就很强的离电续航更上一层楼,哪怕是 14 寸机型也能做到「电脑续航比人长」。

更重要的是,今年 M5 处理器的升级大部分集中在 GPU 上。N3P 工艺优秀的能效比,让这一次 MacBook Pro 的性能释放更加大胆。

就拿 macOS 平台上最主流的 3A 大作《赛博朋克 2077》来说,M5 的 MacBook Pro 使用游戏默认的「for this mac」配置时,能够在大部分画质选项为中或高的前提下实现离电 30 帧的表现。

而打开 FSR 和帧生成后,2077 则可以以接近游戏默认的「中画质」配置里跑到稳定 50-60 帧左右,同时维持你在星巴克的座位不变,不用接电源。

类似的情况也出现在 App Store 上的《控制:终极合辑》,以及爱范儿编辑部最近都在玩的《逃离鸭科夫》中。只需要一点点画质微调,M5 MacBook Pro 都可以稳在 60 帧以上:

换个角度看,这个体验其实已经接近了当年 GTX 1660 的表现。App Store 和 Steam 上越来越丰富的游戏库,满足了 Mac 用户在出差高铁上也能玩玩搜打撤的愿望。

另一方面,M5 最大的升级点还在于它为每颗 GPU 核心都内置了「新一代神经网络加速器」,相当于让 M5 有了个 10 核的 NPU。

这样一来,M5 的 AI 性能——尤其是本地 AI 性能,就有了相当坚实的基础。

以苹果在官方视频中演示过的 Msty Studio 为例,作为一款功能类似 Ollama 但模型库更丰富的「开源模型本地化部署工具」,Msty Studio 最主要的功能,就是可以让你的 Mac 在断网情况下跑语言模型。

我们以最体现性能的「首词元响应速度」表现为标准可以看到,纯本地运行的 DeepSeek-R1:8b 在 10 核心 GPU 的 M5 上运行时,对于相同的一段生成指令,它的速度追平了 24 核 GPU 的 M1 Max

相当于 M5 用不到一半的核心数量,就可以获得与两三年前 Pro 甚至 Max 规格的 Apple Silicon 相当,同时发热量和功耗还控制在一个相当优秀的水平。

更重要的是,类似的表现也可以在其他本地化的 AI 场景中复现。

比如在纯本地运行的 AI 视频画质增强工具 VidHex 中,在进行视频细节增强时,10 核的 M5 同样出现了追平甚至反超 24 核 M1 Max 的现象。

但在测试过这么多本地 AI 工具之后,我们也不由得产生了一个疑惑:

开源的本地 AI 模型虽然免费,但部署起来比较麻烦,其中很多也没有非常直观的图形界面、必须在终端里面用 CLI(命令行界面)去微调——

而那些收费的本地 AI 工具,实际上就是在卖一个打包好的 GUI(图形界面)。现在云端模型不仅性能更强,价格也逐渐亲民,你觉得「本地化部署和运行 AI 模型」能够对你的电脑购买决策产生影响吗?

总之,对于 M5 的端侧 AI 性能,爱范儿认为:苹果官网上宣传的「相比 M1 有四到六倍的提升」是比较贴切的,不仅是可以稳定的「10 核打 24 核」,同时还有更优秀的发热和功耗控制。

M5 这样一来,就很难不让人期待明年 M5 Pro 和 M5 Max 的表现了,或许可以催生另一批多台 Mac Studio 组网做超算的潮流。

不过就在前两个月,M4 家族的 MacBook Pro 刚刚经历过一轮国补,新的 M5 基础款并不能和 M4 Pro/Max 形成替代关系。

因此今年值得升级 M5 基础版 MacBook Pro 的,更多还是那些仍在坚守 M1 或 M2 系列的老用户,就比如爱范儿编辑部那位还在用 M1 Max 的编辑。

至于爆料中那个模具更新、去除刘海的新 MacBook,则至少要到明年的 M6 机型才有希望了。如果你是 M4 家族的用户,那么小挤一管牙膏的 M5 并不是具有说服力的换机理由。

总之,爱范儿今年对于 M5 MacBook Pro 的结论,依然与前两代相同:

Mac 依然是一个「你必须非常明确自己的需求」才值得入手的优秀工具——如果你不确定自己需不需要一台 Mac,那么就是不需要

#欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。

爱范儿 | 原文链接 · 查看评论 · 新浪微博


突发!苹果发布 3 款新品:价格很贵,AI 很强

进入十月份的苹果动作频频。

前两天库克还在亲自下场,在 Apple Store 抖音直播间宣发国行 iPhone Air,这不,就在刚刚,苹果又直接在官网上架了今年的新款 MacBook——

搭载 M5 处理器的 MacBook Pro,「真的快,不是梦」:

只不过特别的是,往年的 Apple Silicon 处理器 Mac 都是全系列同时发布,但今年苹果的步调发生了一些变化——

在本次的 MacBook Pro 上,我们没有见到 M5 Pro 或者 M5 Max,而是只有 10+10 核规格的基础版 M5 处理器。

与前期的预测一致,M5 处理器基于 3nm 的台积电工艺打造,与今年能效提升明显的 A19 Pro 处理器属于同代制程,工艺红利明显。

M5 的架构也保持了 10 核心 CPU、10 核心 GPU 的组合。根据苹果官网的图表,今年 M5 的 LLM 提示词处理性能为 M1 的 6.4 倍、3D 渲染性能为 M1 的 6.8 倍:

这样的进步幅度,与更早期爆料出的 M5 iPad Pro 跑分之间相互印证——

是的,那个前阵子被俄罗斯老哥开盒的 M5 iPad Pro 也在今晚发布了,售价 8999 元起,而配置拉满的 2TB 版本售价则来到了让人咋舌的 22499 元。

总的来看,可以看到苹果自研的 GPU 在这一代得到了非常明显的提升,编辑部那个喜欢用 MacBook 玩 2077 的同事估计要坐不住了

只不过在外观方面,M5 MacBook Pro 就完全没有什么惊喜了——

依然是这个从 2021 年开始陪伴我们的刘海屏模具,依然是 14 或 16 寸的 miniLED 屏幕,HDR 峰值亮度 1600 尼特,并且可以选配抗眩光的纳米纹理玻璃版本。

和 M4 时代的限制一样,这一次的 M5 MacBook Pro 仍然有 16/24/32GB 三档内存可选,最大可选的硬盘则升级到了 4TB。

这样选配下来,起步 16+512GB 的 14 寸 M5 MacBook Pro 售价仍然为 12999 人民币,各项配置全部拉满之后,售价最高可以顶到 2.6 万元——

虽然起步价格和 M4 版本的 MacBook Pro 一致,最重要的处理器升级相当于白送。但仔细想想,这仍然是一个相当让人肉疼的价格,仅凭 Apple Silicon 并不能摊平 miniLED 显示屏等等主要零件的成本。

我们可以看到的是,苹果为了维持 M 系列处理器的更新升级,投入了巨大研发经费。

除了依靠 iPad 去走量之外,就只能通过让 M 系列处理器共享近似制程这种方式,来尽量摊平前期的投入——

目前看来,今年的 M5 MacBook Pro 虽然在 GPU 和 NPU 性能上得到了大跃进,可以毫无疑问地加冕目前最强苹果游戏本,但它距离我们期待中的无刘海触屏 OLED 屏幕 MacBook Pro 仍然有着距离。

不过对于的国补大背景来说,「买新不买旧」依然是选购 Mac 时的金科玉律。

M5 的 MacBook Pro 虽然看上去强势,但下单时要为屏幕等等外围硬件付出很多额外成本,但是别忘了——

过不了多久,我们就可以等到 GPU 大进步、能效比更出色的 M5 MacBook Air 和 Mac mini 了。

除了 MacBook Pro 和 iPad Pro 之外,同样用上了 M5 处理器的,还有 2025 款 Apple Vision Pro:

搭配前文提到的 M5 处理器 GPU 性能大进步,今年的 M5 Vision Pro 虽然外形没有什么变化,但是「可提供更快的性能、更清晰的整个系统细节以及更长的电池续航时间」。

根据苹果 Newsroom 的介绍,使用 M5 处理器的 Vision Pro 可以在屏幕上渲染比上一代多 10% 的像素数量、实现 120Hz 的刷新率以及最低 12ms 的视频延迟,真实性更上一层楼。

苹果还宣称:M5 内部的 16 核神经网络引擎可以让 AI 功能在系统体验上的运行速度提升高达 50%(比如转换空间照片),第三方 app 的运行速度也有显著提升:

此外,M5 优秀的能效比也让 Vision Pro 的普通使用续航来到了 2.5 小时,纯视频播放则可以坚持 3 小时,让你能够沉浸在虚拟世界的时间更长了——

比如 Spectrum SportsNet 就借助 visionOS 的 Apple Immersive,将 NBA 赛场上的沉浸式空间视频带到了 Vision Pro 上。

并且不止 NBA,根据苹果宣布,包括棒球、MotoGP,甚至是奥迪 F1 和红牛的新影片都将在未来几个月上线 Apple Immersive,让 Vision Pro 的内容消费能力值回票价:

搭载 M5 芯片的 Vision Pro 将于 10 月 17 日接受预订、10 月 22 日起发售,起步的 256GB 机型售价仍为 29999 元人民币。

#欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。

爱范儿 | 原文链接 · 查看评论 · 新浪微博


❌