Next.js 16 自定义 SVG Icon 组件实现方案 🎨
在现代Web应用中,SVG图标已成为提升用户界面质量的重要组成部分。本文将详细介绍如何在Next.js 16项目中实现一个高性能、可复用的自定义SVG Icon组件,支持动态加载和类型安全。
目录结构
本项目的SVG Icon功能涉及以下核心文件和目录:
src/
├── assets/
│ └── icons/ # 原始SVG图标文件
└── components/
└── Icon/
├── icons/ # 所有SVG图标React组件(自动生成)
│ └── Logo.tsx # Logo SVG组件
├── index.tsx # 主Icon组件
├── constants.ts # 图标路径配置
├── type.d.ts # 类型定义
核心实现
1. 原始SVG文件管理
首先,我们需要将原始SVG图标文件放置在指定目录中:
# 原始SVG文件存放位置
src/assets/icons/
例如,将logo.svg文件放置在此目录下:
src/assets/icons/logo.svg
2. 自动化SVG转换工具
为了将SVG文件转换为React组件,我们使用SVGR工具,它可以将SVG文件自动转换为React组件,并支持TypeScript。
执行以下命令,自动将SVG文件转换为React组件:
npx svgr --typescript --ext=tsx --out-dir src/components/Icon/icons src/assets/icons
执行后,会在src/components/Icon/icons/目录下生成对应的React组件(如Logo.tsx)。
3. 类型定义
在type.d.ts中定义Icon组件的类型,确保类型安全:
// src/components/Icon/type.d.ts
import type {
iconPaths } from './constants';
export type IconNameType = keyof typeof iconPaths;
4. 图标路径配置
在constants.ts中配置所有可用的图标路径:
// src/components/Icon/constants.ts
export const iconPaths = {
logo: () => import('./icons/Logo'),
};
5. SVG图标组件
自动生成的SVG图标组件示例:
// src/components/Icon/icons/Logo.tsx
import React from "react";
const Logo = (props: React.SVGProps<SVGSVGElement>) => (
<svg width={
582} height={
582} viewBox="0 0 582 582" fill="none" {
...props}>
<rect width={
582} height={
582} rx={
291} fill="url(#paint0_linear)" />
<path
d="M157.521 303.421l198.36-196.995c3.706-3.68 9.669.799 7.168 5.383L289.22 247.123c-1.647 3.018.538 6.698 3.976 6.698h127.586c4.11 0 6.095 5.036 3.09 7.84L200.293 470.326c-4.009 3.741-9.976-1.53-6.757-5.97l105.837-146.005c2.17-2.994.031-7.187-3.667-7.187H160.713c-4.043 0-6.06-4.894-3.192-7.743z"
fill="#fff"
/>
<defs>
<linearGradient
id="paint0_linear"
x1={
291}
y1={
0}
x2={
291}
y2={
582}
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#7BCBD4" /

最低0.47元/天 解锁文章
1048

被折叠的 条评论
为什么被折叠?



