【React】React18+Typescript+craco配置最小化批量引入Svg并应用的组件

React18+Typescript+craco配置最小化批量引入Svg并应用的组件

    • 前言
    • 创建React + Typescript项目
    • 通过require.context实现批量引入Svg
    • 安装[@types/webpack-env](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.zh-Hans.md)解决类型报错
    • 安装[craco](https://craco.js.org/docs/getting-started/#start-configuring),覆盖React原有的webpack配置文件
    • 修改package.json脚本快捷方式为craco启动项目
    • 安装[svg-sprite-loader](https://github.com/JetBrains/svg-sprite-loader)生成Svg雪碧图
    • 安装[svgo-loader](https://github.com/svg/svgo-loader)去除Svg的fill和stroke属性
    • 新增craco.config.js配置文件
    • 封装Icon组件应用Svg图标
    • 在index.tsx入口文件中引入批量引入Svg的函数
    • 在App.tsx中引入Icon组件并应用
    • 修改tsconfig.json新增别名@解决报错
    • 启动项目,目录结构如下
    • 参考
    • 总结

前言

无论是哪种 Web UI 框架都不可避免的要与 Svg 打交道,那么批量引入才更方便管理 Svg

创建React + Typescript项目

npx create-react-app my-ts-app --template typescript

通过require.context实现批量引入Svg

// src/assets/icons/index.ts
const requireAll = (requireContext: __WebpackModuleApi.RequireContext) => requireContext.keys().map(requireContext)
const icons = require.context('./', false, /\.svg$/)
requireAll(icons)export {}

在这里插入图片描述

安装@types/webpack-env解决类型报错

npm install --save @types/webpack-env

安装craco,覆盖React原有的webpack配置文件

npm i -D @craco/craco @craco/types

修改package.json脚本快捷方式为craco启动项目

"scripts": {
-  "start": "react-scripts start"
+  "start": "craco start"
-  "build": "react-scripts build"
+  "build": "craco build"
-  "test": "react-scripts test"
+  "test": "craco test"
}

安装svg-sprite-loader生成Svg雪碧图

npm install svg-sprite-loader -D

安装svgo-loader去除Svg的fill和stroke属性

npm install svgo-loader --save-dev

新增craco.config.js配置文件

const path = require('path');module.exports = {webpack: {alias: {'@': path.resolve(__dirname, 'src'),},configure: (webpackConfig) => {const oneOfRule = webpackConfig.module.rules.find((rule) => rule.oneOf)if (oneOfRule) {oneOfRule.oneOf.splice(0, 0, {test: /\.svg$/,include: path.resolve(__dirname, "src/assets/icons"),use: [{loader: 'svg-sprite-loader',options: {symbolId: "icon-[name]"}},{loader: 'svgo-loader', options: {plugins: [{name: 'removeAttrs',params: {attrs: '(fill|stroke)'}}]}}]})}return webpackConfig},}
}

封装Icon组件应用Svg图标

// src/components/Icon/index.tsx
import React from "react";
import classes from './index.module.css'interface IconProps {name: stringwidth: stringheight?: stringfill?: string
}const Icon = ({ name, width, height, fill }: IconProps) => {return (<svg className={classes.icon} aria-hidden="true" width={width} height={height}><use xlinkHref={'#icon-' + name} style={{color: fill}}></use></svg>)
}export default Icon
/* src/components/Icon/index.module.css */
.icon {vertical-align: -0.15em;fill: currentColor;overflow: hidden;font-size: 0;
}

在index.tsx入口文件中引入批量引入Svg的函数

// src/index.tsx
import '@/assets/icons/index';

在App.tsx中引入Icon组件并应用

// src/App.tsx
import React from 'react';
import Icon from '@/components/Icon/index'
import './App.css';function App() {return (<div className="App"><Icon name='p_ding' width="30px" height='30px' fill="red" /><Icon name='p_book' width="30px" height='30px' /></div>);
}export default App;

在这里插入图片描述

修改tsconfig.json新增别名@解决报错

{"compilerOptions": {"target": "es5","lib": ["dom","dom.iterable","esnext"],"allowJs": true,"skipLibCheck": true,"esModuleInterop": true,"allowSyntheticDefaultImports": true,"strict": true,"forceConsistentCasingInFileNames": true,"noFallthroughCasesInSwitch": true,"module": "esnext","moduleResolution": "node","resolveJsonModule": true,"isolatedModules": true,"noEmit": true,"jsx": "react-jsx","baseUrl": "./src","paths": {"@/*": ["./*"]}},"include": ["src"]
}

在这里插入图片描述

启动项目,目录结构如下

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

参考

  • https://ryanhutzley.medium.com/dynamic-svg-imports-in-create-react-app-d6d411f6d6c6
  • https://github.com/airbnb/babel-plugin-inline-react-svg/issues/51
  • https://blog.shianqi.com/2017/12/13/Webpack/SVG-sprite/
  • https://pganalyze.com/blog/building-svg-components-in-react
  • https://juejin.cn/post/6844904194747400199
  • https://blog.csdn.net/qq_44883318/article/details/132202175
  • https://juejin.cn/post/7035808121272893477
  • https://github.com/dilanx/craco/issues/395
  • https://segmentfault.com/a/1190000023807589
  • https://blog.csdn.net/qq_39953537/article/details/93760188
  • https://juejin.cn/post/7207336474150273061
  • https://juejin.cn/post/6918723151732391950#heading-0
  • https://juejin.cn/post/6981836039463632932
  • https://segmentfault.com/a/1190000039850941

总结

  1. 配置别名需要tsconfig.json和craco.config.js一起配合
  2. 批量引入组件或者资源通过require.context函数实现
  3. module css实现组件的私有样式,相当于Vue中 scoped 作用域

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/306498.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据中心的网络架构设计,打造高效、安全的数字底座

数据中心的网络架构设计 一、数据中心网络架构设计原则 网络,作为数据中心的核心支柱,其结构精妙,由众多二层接入设备与少量三层设备共同编织而成。过去,数据中心网络规模有限,仅凭数十台设备的简单互连便能实现信息的畅通无阻。然而,随着技术与应用需求的飞速增长,数据…

16. 网络编程(1)

Hi,大家好!从本节开始我们学习网络编程相关的知识。基于TCP服务器和客户端实现流程框架。 本节目录: 网络编程在软件开发中具有相当重要的作用,涉及到各方各面: 网络通信: Linux系统作为一个多用户、多任务的操作系统,网络通信是其重要的功能之一。通过网络编程,可以实现…

Rust面试宝典第2题:逆序输出整数

题目 写一个方法&#xff0c;将一个整数逆序打印输出到控制台。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如&#xff1a;123的逆序输出为321&#xff0c;8600的逆序输出为68&#xff0c;-609的逆序输出为-906。 解析 这道题本身并没有什么…

域控软件安全隔离关键技术剖析:MCU域 VS SOC域

安全隔离的需求 功能安全开发中&#xff0c;软件阶段由软件V模型左边的软件安全需求SSR开始。SSR是从技术安全需求TSR中提取出软件的功能安全需求&#xff0c;大多数情况下具有不同的ASIL等级。 图1 功能安全软件开发V模型 随后&#xff0c;软件安全需求会被分配到软件架构中的…

LeetCode110:平衡二叉树

题目描述 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 解题思想 使用递归依次计算左子树的高度和右子树的高度 代码 class Solution { public:int height(TreeNode* node) {if (node nullptr) return 0;int leftT height(node->left);if (leftT -1) return -1;…

Kivy 学习2

from kivy.app import App from kivy.uix.button import Button from kivy.uix.floatlayout import FloatLayout from kivy.graphics import Rectangle, Colorclass FloatLayoutApp(App):def build(self):def update_rect(layout, *args):设置背景尺寸&#xff0c;可忽略layout…

PlayerSettings.WebGL.emscriptenArgs设置无效的问题

1&#xff09;PlayerSettings.WebGL.emscriptenArgs设置无效的问题 2&#xff09;多个小资源包合并为大资源包的疑问 3&#xff09;AssetBundle在移动设备上丢失 4&#xff09;Unity云渲染插件RenderStreaming&#xff0c;如何实现多用户分别有独立的操作 这是第381篇UWA技术知…

【动态规划】【01背包】Leetcode 1049. 最后一块石头的重量 II

【动态规划】【01背包】Leetcode 1049. 最后一块石头的重量 II 解法 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 解法 &#x1f612;: 我的代码实现> 动规五部曲 ✒️确定dp数组以及下标的含义 dp[j]表示容量为…

Maven的scope详解

依赖范围介绍 maven 项目不同的阶段引入到classpath中的依赖是不同的&#xff0c;例如&#xff0c;编译时&#xff0c;maven 会将与编译相关的依赖引入classpath中&#xff0c;测试时&#xff0c;maven会将测试相关的的依赖引入到classpath中&#xff0c;运行时&#xff0c;mav…

路由器端口映射是什么意思?

路由器端口映射是一种网络配置技术&#xff0c;在私有网络中允许外部网络访问特定的服务或应用程序。通过将路由器的端口映射到内部客户端设备&#xff0c;可以实现从公共网络访问内部网络资源的目的。 天联组网介绍 天联是一款异地组网内网穿透产品&#xff0c;由北京金万维科…

数据治理项目——深铁集团数据治理规划

目录 一、前言 二、数据治理内容与主要措施 2.1 实施背景 2.2 主要举措 2.2.1 制定数据战略目标 2.2.2 绘制数据治理蓝图 2.2.3 绘制数据治理制度 2.2.4 梳理数据资产目录 三、 应用效果 3.1 数据资产可视化管理 3.2 数据标准治理 3.3 集团大数据平台优化建设 一、…

若依vue中关于字典的使用

文章目录 字典管理页面列表点击某个字典类型展示具体字典数据修改某一条字典数据 字典的应用一般用于select多选框中代码实现根据字典Dict的value获取Label&#xff0c;类似于通过key获得value 源码解析 字典管理页面 列表 点击某个字典类型展示具体字典数据 修改某一条字典数…

力扣HOT100 - 189. 轮转数组

解题思路&#xff1a; 三次反转。 先反转一次&#xff0c;再根据 k 拆分成两部分各反转一次。 class Solution {public void rotate(int[] nums, int k) {k % nums.length;reverse(nums, 0, nums.length - 1);reverse(nums, 0, k - 1);reverse(nums, k, nums.length - 1);}pu…

关于DNS解析那些事儿,了解DNS解析的基础知识

DNS&#xff0c;全称Domain Name System域名系统&#xff0c;是一个将域名和IP地址相互映射的一个分布于世界各地的分布式数据库&#xff0c;而DNS解析就是将域名转换为IP地址的过程&#xff0c;使人们可以轻松实现通过域名访问网站。DNS解析是网站建设非常关键的一步&#xff…

防火墙搭建内网 安装路由器

经典网络情况 也就是网吧 先配置网段 科普&#xff1a;子网掩码代表IP前面几位不能动 安装防火墙虚拟机 配置两个网卡 第一个 第二个桥接 设置子网掩码 虚拟机有DHCP 可以不用防火墙的DHCP 配置有网站的ip地址和网关 利用防火墙映射出去外网 然后看防火墙外网ip 然后…

[lesson20]初始化列表的使用

初始化列表的使用 类成员的初始化 C中提供了初始化列表对成员变量进行初始化 语法规则 注意事项 成员的初始化顺序与成员的声明顺序相同成员的初始化顺序与初始化列表中的位置无关初始化列表先于构造函数的函数体执行 类中的const成员 类中的const成员会被分配空间的类中…

C++ primer 第十八章

C语言的三大特性&#xff1a;异常处理、命名空间、多重继承。 1.异常处理 异常处理机制允许我们能够将问题的检测与解决过程分离开来。 1.1、抛出异常 在C语言中&#xff0c;我们通过抛出一条表达式来引发一个异常。 当执行一个throw时&#xff0c;程序的控制权从throw转移…

(学习日记)2024.04.12:UCOSIII第四十节:软件定时器函数接口讲解

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

ArcGIS和ArcGIS Pro快速加载ArcGIS历史影像World Imagery Wayback

ArcGIS在线历史影像网站 World Imagery Wayback(网址:https://livingatlas.arcgis.com/wayback/)提供了数期历史影像在线浏览服务,之前不少自媒体作者在文中宣称其能代表Google Earth历史影像。 1、一点对比 (1)同一级别下的版本覆盖面 以下述区域为例,自2014年2月20…

java 邮件发送表格

邮件发送表格 问题导入效果图 实现方案1. 拼接HTML文件&#xff08;不推荐&#xff09;2. excel 转HTML使用工具类来转化依赖工具类代码示例 使用已工具包 如 aspose-cells依赖代码示例 3.使用模板生成流程准备模板工具类代码示例 问题导入 在一些定时任务中&#xff0c;经常会…