阅读视图

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

四年前端分享给你的高效开发工具库

作为一名拥有四年前端开发经验的工程师,我主要在互联网 C 端项目工作,常常需要处理金额计算、数据加密、表单校验、时间处理、状态持久化等问题。 在这类项目中,选对工具能大大提升开发效率、降低 bug 率。

本文整理了我在实际项目中长期使用、验证过的高频实用库,涵盖数值处理、加密、校验、时间管理、状态持久化、XML 解析以及代码辅助开发工具。

希望这份清单能帮助你在项目中少踩坑、快开发!


1. 数字精度处理:decimal.js

核心问题:
JavaScript 原生浮点数计算会产生精度问题,例如:

console.log(0.1 + 0.2); // 0.30000000000000004

在涉及金额或积分计算时,这种误差可能造成严重问题。

为什么选择 decimal.js

  • 支持任意精度,不会出现浮点数误差。
  • API 简单易用,比 big.js 功能更完整。

示例 1:基础计算

import Decimal from 'decimal.js';

// 金额计算
const total = new Decimal(0.1).plus(0.2).toString();
console.log(total); // "0.3"

示例 2:金融场景 - 保留两位小数

const price = new Decimal(19.995);
console.log(price.toFixed(2)); // "20.00"

示例 3:大数字计算

const largeNumber = new Decimal('123456789123456789').mul(2);
console.log(largeNumber.toString()); // "246913578246913578"

适用场景:

  • 金融项目、支付、订单金额计算
  • 大数字统计(积分、虚拟币等)

2. 数据加密与哈希:crypto-js

核心问题:
前端经常需要做数据安全处理,比如密码加密接口签名Token 加密等。

为什么选择 crypto-js

  • 内置常用加密算法(MD5、SHA1、SHA256、AES、HmacSHA256 等)。
  • 前后端通用,方便与后端保持一致。
  • 体积小,易集成。

示例 1:MD5 加密

import CryptoJS from 'crypto-js';

const password = 'mySecretPassword';
const hash = CryptoJS.MD5(password).toString();
console.log(hash); // f857606c76b9d72353257dbd273c9b9e

示例 2:SHA256 签名

const data = 'userId=123&timestamp=1695712312';
const signature = CryptoJS.SHA256(data).toString();
console.log(signature);

示例 3:AES 加解密

const secretKey = 'abcdef123456';
const encrypted = CryptoJS.AES.encrypt('Sensitive Data', secretKey).toString();
console.log(encrypted);

const decrypted = CryptoJS.AES.decrypt(encrypted, secretKey).toString(CryptoJS.enc.Utf8);
console.log(decrypted); // "Sensitive Data"

适用场景:

  • 登录密码加密
  • 接口安全签名
  • 敏感数据存储(如手机号、身份证号)

3. 表单与数据校验:validator

核心问题:
表单提交前,需要验证邮箱、手机号、URL、身份证号等是否合规。

为什么选择 validator

  • 超过 130 个校验函数,几乎涵盖所有常见场景。
  • 链式调用简单,覆盖率高。

示例 1:校验邮箱

import validator from 'validator';

console.log(validator.isEmail('test@example.com')); // true
console.log(validator.isEmail('not-an-email')); // false

示例 2:校验手机号

// 第二个参数指定地区
console.log(validator.isMobilePhone('13800000000', 'zh-CN')); // true
console.log(validator.isMobilePhone('12345', 'zh-CN')); // false

示例 3:复杂规则组合

function validatePassword(password) {
  return (
    validator.isLength(password, { min: 8 }) &&
    validator.isAlphanumeric(password) &&
    validator.matches(password, /[A-Z]/)
  );
}

console.log(validatePassword('Test1234')); // true

适用场景:

  • 表单验证
  • 数据格式检查(手机号、URL、IP 等)

4. 日期时间处理:moment.js

核心问题:
处理日期和时间,比如格式化、计算时间差、处理时区等。

为什么选择 moment.js

  • 功能强大,API 设计简单。

示例 1:格式化日期

import moment from 'moment';

console.log(moment().format('YYYY-MM-DD HH:mm:ss')); // 2025-09-27 00:55:01

示例 2:计算时间差

const start = moment('2025-09-01');
const end = moment('2025-09-26');

console.log(end.diff(start, 'days')); // 25

示例 3:显示相对时间

console.log(moment('2025-09-25').fromNow()); // "一天前"

适用场景:

  • 订单时间、出行时间、飞机起飞到达时间等
  • 日历、排班等复杂业务

5. 状态持久化:pinia-plugin-persistedstate

核心问题:
使用 Vue + Pinia 时,刷新页面会导致状态丢失。

为什么选择它

  • 无需自己手动写 localStorage/sessionStorage 逻辑。
  • 可配置存储位置、加密策略。

示例:

import { defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
  state: () => ({
    token: '',
    userInfo: {},
  }),
  persist: {
    storage: localStorage, // 默认 localStorage
  },
});

适用场景:

  • 登录状态保存
  • 表单缓存
  • 用户偏好设置

6. XML 转 JSON:x2js

核心问题:
在旅游、电商、酒店预订等行业,后端可能返回 XML 数据,前端需要解析成 JSON。

为什么选择 x2js

  • 轻量、易用。
  • 比 DOMParser 更直观。

示例:

import X2JS from 'x2js';

const x2js = new X2JS();
const xmlData = `<root><hotel><name>Hilton</name></hotel></root>`;
const jsonObj = x2js.xml2js(xmlData);

console.log(jsonObj.root.hotel.name); // Hilton

适用场景:

  • 旅游、酒店预订、机票系统静态的详情描述
  • 解析第三方 XML 接口

7. 元素定位代码:code-inspector-plugin

核心问题:
当页面出现问题时,想快速定位前端代码位置,但大型项目文件多,手动查找非常耗时。

如果是vue开发者,其实还有一个vue devtools,只能定位到组件级,没法定位到元素的具体行,这儿就不展开说了,因为它的功能不只是定位元素,更多的是调试响应式数据的,Respect!

为什么选择 code-inspector-plugin

  • 点击页面元素,直接跳转到对应的代码文件行(IDE 自动打开)。
  • 特别适合多人协作和大型项目调试。
  • 同事用了都叫好, 还说我怎么不早点分享

示例:Vite 配置 (注意只在开发环境配置)

// vite.config.js
import { defineConfig } from 'vite';
import { codeInspectorPlugin } from 'code-inspector-plugin';

export default defineConfig({
  plugins: [
      codeInspectorPlugin({
          bundler: 'vite',
          showSwitch: true, //开启后会出来一个按钮,点击按钮之后点击想看的元素就能定位了
        }),
  ],
});

使用方式:

  1. 启动项目后,按住 Ctrl + 鼠标左键 点击页面元素。
  2. VSCode 会直接打开对应组件文件。

适用场景:

  • 大型项目调试
  • 新人快速熟悉项目
  • 组件层级深

8. 总结与建议

以上是我在 C 端项目中高频使用的工具库,它们在解决实际问题上都非常高效、稳定。 当然除了这些,还有i18n以及lodash等等,这里就不一一叙述了。

选库建议:

  1. 以业务需求为导向:先明确问题,再选工具。
  2. 关注社区活跃度:定期维护的库更靠谱。
  3. 团队统一标准:减少重复选择,避免兼容性问题。
库名 主要用途 体积 特点
decimal.js 数字精度计算 任意精度,金融常用
crypto-js 加密/哈希 前后端通用,支持多种算法
validator 数据校验 场景覆盖全,表单友好
moment.js / dayjs 日期时间处理 大/小 moment 功能全,dayjs 轻量
pinia-plugin-persistedstate 状态持久化 与 Pinia 完美集成
x2js XML 转 JSON 旅游、酒店行业常用
code-inspector-plugin 代码定位辅助 开发效率提升神器

结语

选对工具不仅能提高开发效率,还能让项目更加稳定、可维护。
希望这篇文章能为你提供一些参考,让你在前端开发的日常工作中更加得心应手。 如果你有其他高频使用的工具库,也欢迎在评论区分享,一起交流!

如何优雅忽略 components.d.ts的更新

大家好,我是奈德丽

在使用 Vue3 + Vite 的项目中,unplugin-vue-components是一个非常实用的插件,它可以 自动按需导入组件,免去手动 import 的麻烦。同时,它会生成一个 components.d.ts 文件,为 TypeScript 提供全局组件类型提示。

不过,很多团队会遇到一个问题:

每次新增组件,components.d.ts 都会变动,需要提交到 Git,非常烦人。有没有办法不提交,又不影响功能?

本文就来分享一个 完整、优雅的解决方案


1️⃣ 背景与问题

为什么我会这么反感?

每次用到新组件,它都会自动更新一次,奈何我这项目就是一个javascript项目,typescript都没用到,我不喜欢在js项目里看到ts文件,你给我生成一个components.d.ts,而且我压根就不想去提交这个文件的更新

image.png

  1. 文件每次更新组件都会变化
  2. Git 会跟踪,导致每次都要提交
  3. 对于 CI/CD 或团队协作,非常麻烦

2️⃣ 解决方案

奈德丽语录:看到什么不爽,那就干掉他

步骤 1:忽略文件

.gitignore 中添加:

# 忽略自动生成的组件类型声明
src/components.d.ts

注意:如果文件之前已经提交到 Git,仅仅添加 .gitignore 不会生效,需要先从 Git 索引中移除。


步骤 2:从 Git 中移除(保留本地)

执行:

git rm --cached src/components.d.ts

解释:

  • --cached 表示 只从 Git 索引中删除
  • 本地文件仍然保留
  • 确保路径和实际文件一致

步骤 3:提交更改

git add .gitignore
git commit -m "chore: 忽略自动生成的 components.d.ts"
git push

✅ 完成后:

  • 本地 IDE 仍然可以补全组件类型
  • Git 不再跟踪 components.d.ts
  • 新增组件不会再频繁修改提交

步骤 4:可选优化

在vite.config.js中可以增加对Components的配置,有一个dts属性,可以指定components.d.ts的生成目录,如果不设置的化,默认会自动生成到根目录下

方案 A:生成到临时目录

可以把类型文件生成到 node_modules/.types,彻底不提交:

Components({
  dts: 'node_modules/.types/components.d.ts',
})
  • IDE 仍然识别
  • Git 自动忽略 node_modules

项目配置图及效果如图 image.png

方案 B:关闭文件生成

像我们项目没有用到typescript,所以可以直接选择关闭类型生成

Components({
  dts: false, // 不生成 d.ts 文件
})

3️⃣ 小结

  • components.d.ts类型声明文件,不影响运行时
  • 可以安全地 从 Git 中移除并忽略
  • 本地 IDE 的类型提示依然有效
  • 可根据团队喜好选择生成路径或关闭生成

忍了一年多,我终于对i18n下手了

过去一年,我主要参与国际机票业务的开发工作,因此每天都要和多语言(i18n)打交道。熟悉我的朋友都知道,我这个人比较“惜力”(并不是,实际上只是忍不下去了),那一起来看看我是怎么来优化多语言管理模式的
❌