这13个前端库,帮我在工作中赢得了不少摸鱼时间

前言

平时开发的过程中,常常会使用到一些第三方库来提高开发效率,我总结了自己工作这么久以来经常用到的 13 个库,希望对大家有帮助~

antd

image.png

全称应该是Ant Design,这是一个 React 的组件库,旨在提供一套常用的组件库解决方案,用 React 的同学可能对他不会陌生,就像用 Vue 的同学不会对 Element UI 陌生一样。

虽然现在也出现了更多新颖的组件库,但是无论是在公司还是自己做一些东西,只要是中后台的产品,我们都会使用它。

image.png

它提供了 75 个组件,包括常用的按钮、下拉、输入框、菜单、分页、时间选择器、级联选择器、对话框、进度条等等,常用的不常用的组件基本都有,我觉得基本上能涵盖 90% 的常规开发场景。

支持国际化以及自定义主题色,可以让我们轻松拓展。

image.png

除了拥有不俗的样式以及交互效果之外,还向外输出了一套设计理念,包括 Icon 、颜色、字体大小、阴影等,也是我们值得借鉴和学习的地方。

axios

image.png

这可以说是我每天都用到的库,相信各位同学对它也不会陌生。这是一个基于 Promisehttp 请求库,也就是我们常说的调接口,就是用它来调用。

它支持浏览器端和 node 端,除此之外,它支持我们自定义请求和响应的拦截器,这可以让我们在发送请求前或收到响应后执行额外的操作。比如,可以在请求发送前添加认证信息,或在收到响应后处理数据。

它提供了取消请求的功能,我们可以在请求发送后取消请求,避免不必要的网络请求或资源浪费。

以下是我自己常用的一种封装 axios 的手法:

let _BASE_URL = "/api";
import { message } from "antd";
import _axios from "axios";const axiosInstance = _axios.create({withCredentials: true, // 是否允许带cookie这些
});
axiosInstance.interceptors.request.use((request) => {request.headers['Authorization'] = getAuthorization();return request;
});
axiosInstance.interceptors.response.use((response: any) => {const data = response.data;if (data.code === 401) {const loginUrl = `${location.protocol}//${location.host}/login?redirect_url=${encodeURIComponent(location.href)}`;location.replace(loginUrl);} else if (data.code !== 200) {message.error(data.msg);return Promise.reject(data.msg);}return response.data;},(error) => {// 超出 2xx 范围的状态码都会触发该函数。对响应错误时调用。console.error("请求错误: ", error);message.error(error?.message);return Promise.reject(error);}
);export const BASE_URL = _BASE_URL;
export const axios = axiosInstance;

封装一个 axiosInstance ,然后再新建一个请求模块文件,比如说我们对用户相关的接口都可以放在 user 模块中:

import { BASE_URL, axios } from ".";
export const register = (params: {account: string;password: string;code: string;
}) => {return axios.post(`${BASE_URL}/user/register/${params.code}`, {account: params.account,password: params.password,});
};export const login = (params: { account: string; password: string }) => {return axios.post(`${BASE_URL}/user/login`, params);
};

然后再在代码里面如下使用 user 模块中的接口:

  try {setLoading(true);await login({ account: fields.account, password: fields.password });message.success("登录成功");} finally {setLoading(false);}

dayjs

image.png

dayjs是一个十分强大的日期处理库,它只有 2KB ,十分轻巧。API设计支持链式调用,非常灵活,而且兼容所有的浏览器。

以下是 dayjs 中使用的时候常见的 10 个例子,仅供参考

import dayjs from "dayjs";// 1. 获取当前日期
const currentDate = dayjs();
console.log(currentDate.format('YYYY-MM-DD')); // 输出当前日期,如:2024-04-30// 2. 获取当前时间
const currentTime = dayjs();
console.log(currentTime.format('HH:mm:ss')); // 输出当前时间,如:14:30:00// 3. 获取指定日期
const specifiedDate = dayjs('2023-01-15');
console.log(specifiedDate.format('YYYY-MM-DD')); // 输出指定日期,如:2023-01-15// 4. 格式化日期
const formattedDate = dayjs('2024-04-30');
console.log(formattedDate.format('dddd, MMMM D, YYYY')); // 输出格式化后的日期,如:Saturday, April 30, 2024// 5. 添加/减去时间
const addedTime = dayjs().add(7, 'days');
console.log(addedTime.format('YYYY-MM-DD')); // 输出添加 7 天后的日期,如:2024-05-07// 6. 计算两个日期之间的差值
const date1 = dayjs('2024-01-01');
const date2 = dayjs('2024-02-01');
const diffInDays = date2.diff(date1, 'days');
console.log(diffInDays); // 输出两个日期之间的天数差,如:31// 7. 检查日期是否在某个范围内
const targetDate = dayjs('2024-04-30');
const startDate = dayjs('2024-04-01');
const endDate = dayjs('2024-05-01');
const isWithinRange = targetDate.isBetween(startDate, endDate);
console.log(isWithinRange); // 输出 true,因为目标日期在范围内// 8. 获取一周中的第几天
const dayOfWeek = dayjs().day();
console.log(dayOfWeek); // 输出今天是一周中的第几天,0 表示星期日,1 表示星期一,依此类推// 9. 获取月份的天数
const daysInMonth = dayjs('2024-02-01').daysInMonth();
console.log(daysInMonth); // 输出该月份的天数,如:29// 10. 获取两个日期之间的所有日期
const startDate = dayjs('2024-04-01');
const endDate = dayjs('2024-04-05');
const allDates = [];
let currentDate = startDate;
while (currentDate.isBefore(endDate) || currentDate.isSame(endDate, 'day')) {allDates.push(currentDate.format('YYYY-MM-DD'));currentDate = currentDate.add(1, 'day');
}
console.log(allDates); // 输出包含所有日期的数组,如:['2024-04-01', '2024-04-02', '2024-04-03', '2024-04-04', '2024-04-05']

lodash

lodash 是一个 js 工具库,提供了许多工具函数,用于简化常见的编程需求。

以下是我对它特点的一些理解:

  1. 集合处理:提供了许多用于处理数组和对象的方法,如排序、过滤、查找、分组等,使得对集合进行操作变得非常方便。
  2. 函数工具:包含了许多函数工具,如节流、防抖、柯里化等。
  3. 类型检查:提供了一系列用于类型检查的函数,如 isStringisArrayisObject 等。
  4. 深拷贝: 提供了强大的深拷贝函数,兼容了函数、日期、正则对象等。
  5. 字符串处理:提供了许多用于字符串处理的方法,如截取、拼接、格式化等。
  6. 数学运算:提供了一些常见的数学运算函数,如求和、求平均数、最大值、最小值等。

下面举几个我常用的lodash函数:

深拷贝

import { cloneDeep } from "lodash"const originalObject = { name: '名字', age: 30, hobbies: ['唱', '跳'] };
const clonedObject = cloneDeep(originalObject);
console.log(clonedObject); // 输出一个深拷贝后的对象

数组去重

import { uniq } from "lodash"const numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];
const uniqueNumbers = uniq(numbers);
console.log(uniqueNumbers); // 输出 [1, 2, 3, 4]

函数防抖

import { debounce } from "lodash"const debouncedFunction = debounce(() => {console.log('防抖函数');
}, 1000);debouncedFunction();

对象深度比较

import { isEqual } from "lodash"const object1 = { a: { b: 2 } };
const object2 = { a: { b: 2 } };
const res = isEqual(object1, object2);
console.log(res); // 输出 true,因为两个对象的内容相同

xss

xss是一个用于处理 HTML 和防止 XSS 攻击的库,一般提交一些富文本内容的时候我们都会用它过滤一下。

它通过过滤和转义,可以去除输入的 HTML 字符串中的不安全的标签;同时支持白名单配置,用于指定允许出现的标签和属性;而且它是一个轻量级的库,体积十分小巧,引入也不会对项目造成什么影响;并且它在浏览器端跟 Node 端都能使用。

下面是一些使用的例子:

import xss from "xss";
const userInput = '<script>alert("恶意代码");</script><p>这是用户输入的文本内容</p>'; 
const output = xss(userInput);
console.log(output); // &lt;script&gt;alert("恶意代码");&lt;/script&gt;<p>这是用户输入的文本内容</p>

再举一个白名单的使用例子,下面是没设置白名单的代码

import xss from "xss";const userInput = '<script>alert("恶意代码");</script><p>这是用户输入的文本内容</p><a href="javascript:alert(\'XSS攻击\')">恶意链接</a>';const output = xss(userInput);console.log(output); // &lt;script&gt;alert("恶意代码");&lt;/script&gt;<p>这是用户输入的文本内容</p><a href>恶意链接</a>

这里是设置了白名单的代码:

import xss from "xss";const userInput = '<script>alert("恶意代码");</script><p>这是用户输入的文本内容</p><a href="http://example.com">正常链接</a><a href="javascript:alert(\'XSS攻击\')">恶意链接</a>';
const options = {whiteList: {a: ['href']},onTagAttr: (tag, name, value, isWhiteAttr) => {if (tag === 'a' && name === 'href' && !/^https?:\/\//.test(value)) {return `${name}="#"`;}}
};const output = xss(userInput, options);
console.log(output); //&lt;script&gt;alert("恶意代码");&lt;/script&gt;&lt;p&gt;这是用户输入的文本内容&lt;/p&gt;<a href="http://example.com">正常链接</a><a href="#">恶意链接</a>

更详尽的用法请参考他的文档

classnames

classnames是用来处理 css 类名组合的一个库,提供了一种方便的方式来动态添加或者移除类名,实现样式的灵活控制。

比如说我们的一个按钮,它有按下跟 hover 两种状态,对应不同的样式。对于没有用 classnames 来说,可能会这么写

let btnClass = 'btn';
if (isPressed) btnClass += ' btn-pressed';
else if (isHovered) btnClass += ' btn-over';return (<button className={btnClass}>按钮</button>
);

这种写法都算好的,更常见的是在 className 中用三元表达式+模版字符串来拼接,更是惨不忍睹。用上 classnames 之后,常常可以这么写:

const btnClass = classnames({btn: true,'btn-pressed': isPressed,'btn-over': !isPressed && isHovered,
});
return (<button className={btnClass}>按钮</button>
);

copy-text-to-clipboard

copy-text-to-clipboard是一个轻量级的复制文本到剪贴板的库,仅仅只有 0.2KB ,提供了简单的 API ,非常易用,每周也是有着 37W+ 的下载量。

它兼容了不同的浏览器,没有任何外部依赖,在一些浏览器中,复制文本到剪贴板需要用户授权,该库提供了相应的错误处理机制。

import copy from 'copy-text-to-clipboard';button.addEventListener('click', () => {copy('复制一些东西');
});

uuid

uuid 用于生成符合 RFC 4122 标准的 UUID(通用唯一标识符)UUID 是一种全局唯一的标识符,在分布式系统中的是唯一的。

uuid 库支持多种 UUID 版本,包括 版本 1版本 3版本 4版本 5 ,每种版本都有不同的生成算法和格式。它提供了简洁的 API ,使得生成 UUID 变得非常简单和方便。

同时,它在生成 UUID 时具有很高的性能,可以快速生成大量的 UUID

它也是支持多端的,包括浏览器端跟 Node.js ,不仅如此,它还支持多种 UUID 的表示格式,包括标准的 UUID 字符串、二进制格式、数组格式等。

import { v4 as uuidv4 } from 'uuid';
uuidv4(); //  d702159f-384c-4d09-bf16-89f42e27ca30

Quill

image.png

我相信做过中后台产品的同学一定会遇到的一个场景,就是有一个编辑框需要用到富文本编辑框,但是呢,他又不需要跟那些在线文档功能那么齐全强大,这个时候我们一般就是去找一些开源的富文本组件来解决。

这个时候我一般都会选择quill,它提供了丰富的编辑功能,包括文本样式(粗体、斜体、下划线等)、列表、链接、图像插入、表格、代码块等。

而且提供了丰富的事件和钩子,我们可以监听编辑器的各种操作事件,实现自定义的业务逻辑和交互效果。

以及它支持插件和扩展,可以通过第三方插件或自定义扩展来增强编辑器的功能和特性,满足更复杂的编辑需求

使用起来也很简单,如果你仅仅是需要一个能用的富文本框,并不需要定制什么东西,那下面的示例就已经满足

image.png

crypto-js

crypto-js提供了多种加密算法和常用的加密功能。包括对称加密算法(如 AESDES )、哈希算法(如 MD5SHA-1SHA-256 )等。

除了提供多种加密算法之外,它的 API 设计也十分简单易用,以及对于各个平台的兼容性也十分好。

它的性能也很好,在加解密的过程中,可以快速处理大量的数据,不会对性能造成明显影响。

举一些例子,比如常用的MD5哈希算法:

import CryptoJS from "crypto-js";
const data = 'Hello, world!';
const md5Hash = CryptoJS.MD5(data);
console.log(md5Hash.toString());

对称加密:

import CryptoJS from "crypto-js";const key = CryptoJS.enc.Utf8.parse("1234567890123456");
const iv = CryptoJS.enc.Utf8.parse("1234567890123456");const plaintext = "Hello, world!";const ciphertext = CryptoJS.AES.encrypt(plaintext, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7,
});console.log("加密后的数据:", ciphertext.toString()); //yWUReRP6G/jD2zWIXJMtTw==const decrypted = CryptoJS.AES.decrypt(ciphertext, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7,
});console.log("解密后的数据:", decrypted.toString(CryptoJS.enc.Utf8)); //Hello, world!

viewerjs

图片预览需求想必很多同学都遇到过,这里介绍一个功能强大的图片预览库——viewerjs。

该库支持缩放、拖动、旋转等交互功能,可以通过鼠标或触摸屏进行操作,自由调整图片的大小和位置;而且支持缩略图导航功能,可以通过缩略图预览图片,快速导航到指定的图片。

它还提供了丰富的定制选项,可以根据需要自定义显示效果、交互行为和样式样式,满足不同项目的需求。

image.png

image.png

localforage

localstorage 相信大家都知道,但是它只有 5M 的存储空间,如果想在浏览器本地存储更多的东西,那就应该使用 indexDB 或者 WebSQL

localforage就是一个封装浏览器存储引擎的库,它的设计目的就是为了让开发者能够以简易的API来使用浏览器的本地存储来存储数据。

它可以自动地选择合适的存储引擎( IndexedDBWebSQLlocalStorage )来进行数据存储。

它支持自动数据类型转换,可以将对象、数组等复杂数据结构转换成适合存储的格式,并在取出数据时自动转换回原始格式。

它支持异步操作,所有的存储操作都是非阻塞的,可以避免因为数据存取操作而阻塞 UI 线程,支持回调函数的方式和 Promise 的方式来处理异步。

读操作:

try {const value = await localforage.getItem('key');console.log(value);
} catch (err) {console.log(err);
}

写操作:

try {const value = await localforage.setItem('key', [1, 2, 3]);
} catch (err) {console.log(err);
}

vconsole

我们平时在开发的时候一般都是 F12 打开开发者工具来调试,但是当我们的 Web 项目跑在真机移动端中,是没有这个开发者工具的。那应该怎么调试呢?

这个时候就可以用到vconsole这个库,它可以在手机浏览器中实时查看日志、错误信息、网络请求等调试信息,帮助我们快速定位和解决问题。

image.png

在引入的时候,我有一个小技巧可以分享,最好是使用 cdn的 方式引入,这样你就很容易根据一些特征去做动态导入,这种包没必要打包进主包里面。

比如说:

  const loadVConsole = () => {const url = "https://unpkg.com/vconsole@latest/dist/vconsole.min.js";if (!location.href.includes("debug")) {return;}const script = document.createElement("script");script.src = url;script.onload = () => {new window.VConsole();};document.body.appendChild(script);};

当然,这个 cdn 包的资源最好你自己维护一份。

最后

以上就是我开发工作过程中经常会用到的一些库,你平时会用到那些库呢?评论区一起交流一下吧!

如果你觉得有意思的话,点点关注点点赞吧~

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

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

相关文章

小小“创新券” 有大担当

科技创新券&#xff0c;就是企业在进行项目研发过程中&#xff0c;政府为企业免费发放给企业的一种“权益凭证”&#xff0c;它可以帮助企业向高校、科研院所、科技服务机构等机构购买服务&#xff0c;将大型设备和其他科技创新资源充分利用起来&#xff0c;并通过产研合作等方…

DAOS: A Scale-Out High Performance Storage Stack for Storage Class Memory——论文泛读

Supercomputing Frontiers 2020 Paper 分布式元数据论文阅读笔记整理 问题 企业、政府和学术界出现的数据密集型应用程序将现有的I/O模型扩展到了极限。现代I/O工作负载的特点是元数据与未对齐和碎片化数据的结合比例越来越高。传统的存储堆栈为这些工作负载提供了较差的性能…

✅什么是最左前缀匹配?为什么要遵守?

在 MySQL 中&#xff0c;最左前缀匹配指的是在查询时利用索引的最左边部分进行匹配。当你执行查询时&#xff0c;如果查询条件涉及到组合索引的前几个列&#xff0c;MySQL 就能够利用该复合索引来进行匹配。 组合索引即由多个字段组成的联合索引&#xff0c;比如 idx_col1_col2…

AIGC 003-Controlnet升级你的SD让图像生成更加可控!

AIGC 003-Controlnet升级你的SD让图像生成更加可控&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 ControlNet 论文 (Adding Conditional Control to Text-to-Image Diffusion Models) 提出了一种名为 ControlNet 的神经网络结构&#xff0c;旨在为大型文本到图…

StackExchange.Redis跑起来,为什么这么溜?

StackExchange.Redis 是一个高性能的 Redis 客户端库&#xff0c;主要用于 .NET 环境下与 Redis 服务器进行通信&#xff0c;大名鼎鼎的stackoverflow 网站就使用它。它使用异步编程模型&#xff0c;能够高效处理大量请求。支持 Redis 的绝大部分功能&#xff0c;包括发布/订阅…

创意学习剪辑利器:一键添加动图水印,轻松提升视频专业度与创意新境界!

在数字化时代&#xff0c;视频已成为我们生活中不可或缺的一部分。无论是学习分享、工作展示还是生活记录&#xff0c;视频都以其直观、生动的形式&#xff0c;赢得了广大用户的喜爱。然而&#xff0c;如何在众多的视频中脱颖而出&#xff0c;展现出自己的专业度和创意&#xf…

[AI OpenAI] OpenAI 安全更新

AI 首尔峰会中分享我们的实践 我们自豪地构建并发布了在能力和安全性方面都处于行业领先地位的模型。 超过一亿用户和数百万开发者依赖于我们安全团队的工作。我们将安全视为我们必须在多个时间范围内投资并取得成功的事项&#xff0c;从使今天的模型与我们未来预期的更具能力…

谷歌浏览器使用vue插件查看表单提交的数据

1.查看组件&#xff1a; 对应代码里主页面引用的组件名&#xff1a; 表单名称&#xff0c;对应组件里form表单名&#xff1a; 左边的层次结构&#xff1a; 右边层次结构&#xff1a;

Excel/WPS《超级处理器》同类项处理,合并同类项与拆分同类项目

在工作中处理表格数据&#xff0c;经常会遇到同类项处理的问题&#xff0c;合并同类项或者拆分同类项&#xff0c;接下来介绍使用超级处理器工具如何完成。 合并同类项 将同一列中的相同内容合并为一个单元格。 1&#xff09;用分隔符号隔开 将AB列表格&#xff0c;合并后为…

Spring中@Component注解

Component注解 在Spring框架中&#xff0c;Component是一个通用的注解&#xff0c;用于标识一个类作为Spring容器管理的组件。当Spring扫描到被Component注解的类时&#xff0c;会自动创建一个该类的实例并将其纳入Spring容器中管理。 使用方式 1、基本用法&#xff1a; Co…

企业微信hook接口协议,ipad协议http,已读消息

已读消息 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信send_userid是long要发送的人idisRoom是bool是否是群消息 请求示例 {"uuid":"1753cdff-0501-42fe-bb5a-2a4b9629f7fb","send_userid":788130255…

Unity学习日志

目录 获取相机可视范围的世界坐标(2D) 视口转世界坐标和屏幕转世界坐标的区别: 屏幕转世界坐标 视口转屏幕坐标 视口转屏幕结合3D数学实现可视范围的怪物生成 transform.up游戏对象的方向问题 其实还有一种不用Translate的写法: 修改 transform.up 的行为和影响 C#抽象…

全国各城市间驾车耗时和距离矩阵数据集(更新至2022年)

数据简介&#xff1a;城市之间距离越远&#xff0c;耗时越长。经济发达地区的交通状况较好。各城市之间的驾车耗时和距离存在差异。有些城市之间的交通非常便捷&#xff0c;而有些城市之间的交通则较为不便。这表明中国的交通网络发展尚不平衡&#xff0c;需进一步优化。特别是…

Excel如何统计非数值内容行数

需要用到sum函数&#xff0c;具体公式如下&#xff1a; SUM(IF(ISNONTEXT(G4:G199),0,1))

Go 语言简介 -- 高效、简洁与现代化编程的完美结合

在现代软件开发领域&#xff0c;选择合适的编程语言对于项目的成功至关重要。Go 语言&#xff08;又称 Golang &#xff09;自 2009 年由Google发布以来&#xff0c;以其简洁的语法、高效的并发模型以及强大的性能&#xff0c;迅速成为开发者们的新宠。Go语言不仅融合了传统编译…

icloud照片怎么恢复到相册?2个方法,轻松解决烦恼

在现代生活中&#xff0c;照片承载着我们的回忆和珍贵的时刻&#xff0c;而iCloud提供了便捷的云存储服务&#xff0c;让用户可以方便地备份和同步手机上的照片、视频等文件。 然而&#xff0c;有时候我们可能会不小心删除了在iCloud上的照片&#xff0c;或者想要将iCloud照片…

使用B2M 算法批量将可执行文件转为灰度图像

参考论文 基于二进制文件的 C 语言编译器特征提取及识别 本实验使用 B2M 算法将可执行文件转为灰度图像&#xff0c;可执行文件转为灰度图的流程如图 4-3 所示。将 可执行文件每 8 位读取为一个无符号的的整型常量&#xff0c;一个可执行文件得到一个一维向量&#xff0c; …

基于51单片机多功能太阳能充电器设计

1 绪论1.1 本课题研究背景及现状 当代社会随着一些不可再生资源如煤炭&#xff0c;石油等日益减少&#xff0c;使得各国社会经济越来越受能源问题的约制&#xff0c;因此许多国家开始逐渐的实行“阳光计划”&#xff0c;开发洁净的能源如太阳能&#xff0c;用以成为本国经济发…

ANOVA方差分析是什么?优思学院教你如何正确使用

ANOVA&#xff08;方差分析&#xff09;是一种统计方法&#xff0c;用来研究三个或三个以上样本平均数的差异是否显著。它可以帮助研究者判断不同组间的均值是否存在统计学上的显著差异。简单来说&#xff0c;如果我们想比较多个不同处理或条件对某个变量的影响&#xff0c;ANO…

【网络层】网络攻击 ARP 欺骗

文章目录 ARP 欺骗原理实战体验 ARP 欺骗原理 ARP&#xff08;地址解析协议&#xff09;欺骗是一种网络攻击技术&#xff0c;它利用了ARP协议的工作机制来欺骗网络中的主机。ARP协议用于将IP地址转换为物理MAC地址&#xff0c;以便在局域网内部进行数据包的传输。ARP欺骗的基本…