1. lodash — 工具函数库
npm install lodash
npm install -D @types/lodash
import _ from "lodash";
// pick / omit —— 提取或排除对象属性
const user = { id: 1, name: "Alice", password: "secret", role: "admin" };
const safe = _.omit(user, ["password"]); // { id, name, role }
const brief = _.pick(user, ["id", "name"]); // { id, name }
// debounce —— 防抖(常用于搜索输入)
const search = _.debounce((query: string) => {
console.log("搜索:", query);
}, 300);
// cloneDeep —— 深拷贝(比 structuredClone 兼容性更好)
const original = { a: { b: [1, 2, 3] } };
const copy = _.cloneDeep(original);
// groupBy —— 分组
const orders = [
{ product: "手机", category: "电子" },
{ product: "耳机", category: "电子" },
{ product: "T恤", category: "服装" },
];
const grouped = _.groupBy(orders, "category");
// { "电子": [...], "服装": [...] }
提示:如果只用少量函数,考虑用 lodash-es 配合 tree-shaking 减小打包体积。
2. dayjs — 日期处理
dayjs 是 moment.js 的轻量替代品(仅 2KB),API 几乎完全兼容。
npm install dayjs
import dayjs from "dayjs";
import relativeTime from "dayjs/plugin/relativeTime";
import "dayjs/locale/zh-cn";
dayjs.extend(relativeTime);
dayjs.locale("zh-cn");
// 解析与格式化
const now = dayjs();
console.log(now.format("YYYY-MM-DD HH:mm:ss")); // "2026-03-30 14:30:00"
// 日期操作
const nextWeek = now.add(7, "day");
const lastMonth = now.subtract(1, "month");
// 相对时间(需要 relativeTime 插件)
console.log(dayjs("2026-03-28").fromNow()); // "2 天前"
// 比较
const deadline = dayjs("2026-04-15");
console.log(deadline.isAfter(now)); // true
console.log(deadline.diff(now, "day")); // 16
3. zod — 运行时数据验证
zod 可以在运行时验证数据结构,并自动推导出 TypeScript 类型——一处定义,两处使用。
npm install zod
import { z } from "zod";
// 定义 schema
const CreateUserSchema = z.object({
name: z.string().min(2).max(50),
email: z.string().email(),
age: z.number().int().min(0).max(150).optional(),
role: z.enum(["admin", "user", "guest"]).default("user"),
});
// 自动推导类型(无需手写 interface)
type CreateUserInput = z.infer<typeof CreateUserSchema>;
// 验证外部数据
function handleCreateUser(rawBody: unknown): CreateUserInput {
const result = CreateUserSchema.safeParse(rawBody);
if (!result.success) {
console.error("验证失败:", result.error.flatten());
throw new Error("Invalid input");
}
return result.data; // 类型安全的 CreateUserInput
}
🔄 对比 Java/Python:zod 类似 Java 的 Bean Validation 或 Python 的 pydantic,但与 TypeScript 类型系统集成更紧密——schema 即类型。
4. winston / pino — 日志库
生产环境需要结构化日志。winston 功能全面,pino 追求极致性能。
npm install winston
import winston from "winston";
const logger = winston.createLogger({
level: "info",
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
),
}),
new winston.transports.File({ filename: "logs/error.log", level: "error" }),
new winston.transports.File({ filename: "logs/combined.log" }),
],
});
logger.info("服务已启动", { port: 3000 });
logger.error("数据库连接失败", { host: "localhost", error: "ECONNREFUSED" });
高性能场景推荐 pino——JSON 序列化速度比 winston 快 5 倍以上。
5. dotenv — 环境变量管理
npm install dotenv
创建 .env 文件(加入 .gitignore):
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
API_KEY=sk-xxxxxxxxxxxx
PORT=3000
import "dotenv/config"; // 在入口文件顶部导入
// 类型安全的环境变量读取
function getEnv(key: string): string {
const value = process.env[key];
if (!value) throw new Error(`缺少环境变量: ${key}`);
return value;
}
const dbUrl = getEnv("DATABASE_URL");
const port = Number(getEnv("PORT"));
6. vitest — 测试框架
vitest 兼容 Jest API,但速度更快,原生支持 TypeScript 和 ESM。
npm install -D vitest
// math.ts
export function add(a: number, b: number): number { return a + b; }
export function divide(a: number, b: number): number {
if (b === 0) throw new Error("除数不能为零");
return a / b;
}
// math.test.ts
import { describe, it, expect } from "vitest";
import { add, divide } from "./math";
describe("math 模块", () => {
it("add 正确相加", () => {
expect(add(2, 3)).toBe(5);
expect(add(-1, 1)).toBe(0);
});
it("divide 除零抛异常", () => {
expect(() => divide(10, 0)).toThrow("除数不能为零");
});
});
npx vitest # 监听模式
npx vitest run # 单次运行
npx vitest --coverage # 覆盖率报告
7. commander — CLI 工具构建
npm install commander
import { Command } from "commander";
const program = new Command();
program
.name("mytool")
.version("1.0.0")
.description("一个示例 CLI 工具");
program
.command("greet <name>")
.option("-l, --lang <language>", "语言", "zh")
.description("向某人打招呼")
.action((name: string, opts: { lang: string }) => {
const msg = opts.lang === "zh" ? `你好,${name}!` : `Hello, ${name}!`;
console.log(msg);
});
program.parse(); // 解析 process.argv
npx ts-node cli.ts greet Alice --lang en
# Hello, Alice!
8. 框架选型参考
Express
最成熟的生态系统,中间件丰富。适合快速原型和中小项目。
风格:极简 · 学习成本:低
Fastify
高性能,内置 JSON Schema 验证。吞吐量比 Express 高 2-3 倍。
风格:插件化 · 学习成本:中
Koa
Express 原班团队打造,基于 async/await。更精简,但生态不如 Express。
风格:极简 · 学习成本:低
NestJS
企业级框架,装饰器 + 依赖注入。深受 Angular 和 Spring Boot 启发。
风格:全栈/重量级 · 学习成本:高
📝 本章要点
lodash 处理数据结构
omit/pick/groupBy/cloneDeep 是高频工具
dayjs 替代 moment.js
2KB 轻量,API 兼容,插件扩展
zod = 验证 + 类型推导
一处定义 schema,自动获得 TypeScript 类型
vitest 是 TS 测试首选
兼容 Jest,速度快,原生 ESM 支持