深色模式
回看 2018,如果用一个词概括,我会选"体系化"。年初还在为各个项目重复造轮子,年底已经有了一套可复用的工程化体系:统一的构建方案、跨项目共享的组件库、团队级的代码质量规范。技术债清了不少,基建也铺得差不多了。是时候做个复盘。
一、年度技术里程碑
TypeScript 全面落地
年初决心在主推的中后台项目上引入 TypeScript。当时的团队阻力不小——"多写那么多类型有什么用"是最常听到的声音。
推动策略是渐进式:先在新增模块上用,再逐步改造已有代码。两个月后,重构改了接口签名,编辑器立刻标出所有受影响的调用点,团队的态度从质疑变成了依赖。到年底,项目 TypeScript 覆盖率已经超过 70%,核心业务模块全面覆盖。
Webpack 4 迁移
从 Webpack 3 升到 4,不只是改配置。项目编译时间从平均 120 秒降到 40 秒,利用 splitChunks 做了智能分包后,首屏 JS 体积从 680KB 压缩到 420KB。同时搭建了统一的构建配置方案,沉淀成 build-scripts 包,新项目初始化时间从半天降到半小时。
Vue 深入与 React 探索
Vue 方面深入了响应式原理和组件设计模式,主导了内部组件库从设计到发布的全流程。同时开始系统学习 React——不为了替代 Vue,而是为了在技术选型上有更理性的判断。年底拿到一个数据可视化需求,React + D3 的方案比 Vue 实现更顺畅,验证了双框架能力的实际价值。
Node.js BFF 层
年末开始做 BFF(Backend for Frontend)中间层,用 Koa 做了接口聚合和数据转换。虽然还没上线,但已经跑通了完整的链路,验证了前后端分层解耦的可行性。
二、工程化成果
组件库建设
主导完成了 @company/ui 组件库,覆盖表格、表单、筛选器、图表容器等 40 余个业务级组件。设计思路是"封装业务模式而非 UI"——比如 <SmartTable> 封装了排序、筛选、分页的完整交互,业务层只需配置列定义和数据源。
至今已有 5 个在建项目接入,组件复用率达到 60%。新项目 UI 开发工作量平均减少 40%。
构建优化数据
| 指标 | 年初 | 年底 | 提升 |
|---|---|---|---|
| 编译时间 | ~120s | ~40s | 66% |
| 首屏 JS 体积 | 680KB | 420KB | 38% |
| 新项目初始化 | ~4h | ~30min | 87% |
这些数字背后是 HappyPack 多线程构建、SplitChunks 分包、tree-shaking 和 ModuleConcatenationPlugin(作用域提升)的综合运用。
代码质量工具链
接入 ESLint + Prettier 统一代码风格,配合 husky + lint-staged 做提交前检查。团队代码风格争议降到了几乎为零——规则写在配置里,不用在 Code Review 里扯皮。
三、代码质量演进
类型系统和错误处理的变化最能体现成熟度的提升。以一个典型的 API 调用为例:
typescript
// 年初风格:能跑,但脆弱
async function handleSubmit() {
this.loading = true;
const res = await axios.post("/api/order", this.form);
if (res.data.code === 0) {
this.$message.success("提交成功");
this.$router.push("/orders");
}
this.loading = false;
}
// 年底风格:有类型约束、有错误分类、有边界保护
interface OrderForm {
productId: string;
quantity: number;
remark?: string;
}
async function handleSubmit(): Promise<void> {
this.submitting = true;
try {
const order = await orderApi.create<Order>(this.form);
this.$message.success(`订单 ${order.id} 创建成功`);
this.$router.push({ name: "OrderDetail", params: { id: order.id } });
} catch (e) {
if (e instanceof ApiError) {
switch (e.code) {
case "STOCK_INSUFFICIENT":
this.stockError = true;
break;
case "ORDER_LIMIT_EXCEEDED":
this.$message.warning("已达下单上限");
break;
default:
this.$message.error(e.message);
}
} else {
throw e; // 非业务错误交给全局错误处理
}
} finally {
this.submitting = false;
}
}差异不只是"加了类型"。核心变化是:API 调用有返回类型约束,错误有业务分类的处理逻辑,非预期错误不会被吞掉,finally 保证状态一致。写代码的心态从"跑通就行"变成了"让三个月后的自己也能看懂、能改"。
四、团队协作经验
Code Review 文化
年中开始推动团队做 Code Review,初期阻力很大。转折点是第一次通过 Review 发现了一个 N+1 请求的性能问题——前端每次弹窗都会触发 50 次并行请求,改了之后弹窗加载从 3 秒降到 0.5 秒。用实际数据说话,比讲道理有效。
到年底,Code Review 已经变成团队习惯,PR 合并前必须有人 Review。更重要的是,Review 的内容从"少个分号"变成了"这个抽象层级对不对""这个状态管理方案有没有更优解"。
知识分享
在团队内部做了 4 次技术分享:TypeScript 实践、Webpack 优化策略、组件库设计思路、Vue 性能优化。每次分享倒逼自己把知识点体系化梳理。也开始鼓励团队里的其他人做分享,培养"输出倒逼输入"的学习氛围。
五、未完成的遗憾
坦率说,有几块今年做得不够:
测试覆盖率仍然偏低。写了部分核心逻辑的单元测试,但远没有形成常态。组件库的测试还算完整,业务代码几乎没有测试。这不是懒,是优先级判断——今年先解决"从 0 到 1"的工程化基建,测试是"从 1 到 10"的质量保障,排在 2019。
CI/CD 流水线还是运维同事在维护。我对 Jenkins 的理解停留在"配置改了能跑"的层面,还没有系统地掌握自动化部署、环境管理、发布回滚这些流程。这是一个架构师视角必须补齐的能力。
文档体系不够完善。组件库有 README 但没有完整的使用文档和 API 说明,组件间的设计决策也没有记录。接新人来时才发现文档的重要性——很多"为什么这么做"只有写的人知道。
这些问题我都不视为失败,而是看清了"工程化体系建设"和"工程化体系成熟"之间的距离。2019 的目标就是缩短这个距离。
六、2019 规划
技术深耕
- 测试体系化:给组件库补齐完整的单元测试,业务代码测试覆盖率目标 60%+。探索 E2E 测试方案(Cypress 或 Puppeteer)。
- CI/CD 自主掌握:搭建前端专属的 CI/CD 流水线,包含 lint、test、build、deploy 全流程自动化。
- React 深入:不满足于使用层面,深入 hooks 源码和 Fiber 架构。考虑一个新项目用 React 从零搭建,积累跨框架经验。
- 监控与告警:搭建前端监控体系,覆盖错误捕获、性能指标、用户行为追踪。从方案设计开始,不是接第三方 SDK 了事。
架构能力
- 微前端调研:团队项目越来越多,部署和维护成本在上升。需要评估微前端方案(qiankun / Module Federation),看是否适合现有技术栈。
- BFF 层上线:把年末的 Koa BFF 原型打磨到生产可用,真正实现前后端数据层解耦。
- 组件库文档站:搭建组件库文档站(类 Storybook),补齐 API 文档和交互式示例。
团队建设
- 推动 Code Review 规范写入团队 Wiki,新人入职自动了解流程。
- 建立"每周技术分享"机制,覆盖团队成员,不再只靠我一个人输出。
- 开始培养 1-2 个能独立负责技术方向的同事,把"架构"从个人能力变成团队能力。
小结
- TypeScript 全面落地,项目覆盖 70%+,重构效率和代码可靠性显著提升
- Webpack 4 迁移完成,编译速度提升 66%,首屏体积压缩 38%
- 主导组件库建设,40+ 业务组件,5 个项目接入,新项目 UI 工作量减少 40%
- 推动 Code Review 文化落地,从形式化走向实质性技术讨论
- 测试覆盖率、CI/CD、文档体系是明年必须补齐的短板
- 2019 核心方向:质量保障体系化 + 架构能力拓展 + 团队技术传承