从大专生到前端工程师:我在真实项目里摸爬滚打的技术探索实录

生产环境勿扰
2026-01-05 18:34
阅读 2013

去年七月,我揣着大专毕业证和一堆自学笔记,挤进了上海一家中型互联网公司的前端岗。说实话,面试那天我手心全是汗——不是因为紧张,是怕被问“你学历这么低,真能写代码?”但还好,leader看中了我 GitHub 上那个用 Vue3 + TypeScript 重构的 TodoMVC 项目,以及我在本地 Meetup 分享会上讲的那场关于组件抽象的“小演讲”。现在回头看,那场分享简直漏洞百出,但至少证明了我不是只会在 B 站刷教程。

入职三个月后,我就被拉进了一个新项目组——公司要重构核心营销平台,支持高并发、多端适配和快速迭代。产品经理拍着胸脯说:“这次必须上微前端!”运维大哥翻了个白眼:“你们前端又想搞事情?”而我,一个刚转正的小白,只能默默打开 VS Code,心里嘀咕:“微前端?我连 webpack 配置还没啃透呢……”

但没办法,项目 deadline 就在眼前,双11大促等着用。于是,这场名为“技术探索与实践”的硬仗,就这么开始了。


一上来就踩坑:微前端真的香吗?

我们团队一开始热血沸腾地选了 qiankun。文档看起来很友好,阿里背书,社区活跃。我甚至还在周五晚上加班时兴奋地发了条朋友圈:“终于要搞微前端了!#前端进阶 #架构师之路”,结果第二天就被现实打脸。

第一个问题是样式隔离失效。子应用用了 Tailwind CSS,主应用用的是 SCSS,两套全局样式互相污染。页面上按钮忽大忽小,颜色乱跳,测试小姐姐直接在群里@我:“这个页面是不是喝假酒了?”
我查了一晚上,才发现 qiankun 的沙箱对动态插入的 <style> 标签处理不彻底。最后不得不手动加前缀 + Shadow DOM(部分浏览器兼容性差),搞得代码又臭又长。

第二个问题是依赖重复加载。主应用和子应用都引入了 React 18 和 lodash,结果 bundle 体积直接翻倍。用户打开页面慢得像在用 2G 网络。运维在监控面板上看到 Lighthouse 分数掉到 40,直接发了个“💀”表情包。

那一刻我真想砸电脑。但转念一想:这不正是“综合项目”该有的样子吗?没有哪个技术方案是银弹,只有不断试错、权衡、妥协。


综合考量:技术选型不是炫技,而是解决问题

冷静下来后,我和 team leader 坐下来重新梳理需求:

  • 业务目标:支持多个营销活动独立开发、部署、回滚
  • 性能要求:首屏加载 < 2s,Lighthouse > 80
  • 维护成本:团队里有新人,不能太复杂
  • 未来扩展:可能接入小程序/H5/PC三端

基于这些,我们做了几个关键决策:

  1. 放弃纯微前端,改用模块联邦(Module Federation)
    Webpack 5 的 Module Federation 虽然学习曲线陡,但它天然支持共享依赖、按需加载,还能避免样式冲突。更重要的是,它和我们现有的构建流程无缝集成。

  2. 建立统一的 Design Token 系统
    所有子项目强制使用同一套颜色、间距、字体变量。通过 Figma Tokens + Style Dictionary 自动生成 SCSS/JS 变量,彻底杜绝“红色有五种”的尴尬。

  3. 引入 Changesets 管理多包版本
    以前每次发布都要手动改 package.json,现在用 Changesets 自动生成 changelog 和版本号,CI 自动发包。再也不用担心“昨天改了 utils,今天线上崩了”。

这些改动听起来很“高级”,但其实都是被逼出来的。有一次线上事故,就是因为两个子应用用了不同版本的日期格式化函数,导致用户下单时间显示为“1970-01-01”。测试直接在群里艾特全组:“这 bug 能上线,建议产品自己下单试试。”


实战中的最佳实践:可读性比炫技更重要

作为大专出身的程序员,我深知“聪明代码”不如“清晰代码”。很多同学喜欢写一行搞定的链式调用,但我坚持:代码是给人看的,机器只是顺便执行一下

比如在处理异步数据流时,我坚决不用 Promise.all 套三层嵌套,而是拆成明确的步骤:

// bad: 谁看得懂?
const [user, config, banners] = await Promise.all([
  fetchUser(),
  fetchConfig(),
  fetchBanners()
]);

// good: 每一步意图清晰
const user = await fetchUser();
if (!user) throw new Error('未登录');

const config = await fetchConfig({ userId: user.id });
const banners = await fetchBanners({ region: config.region });

再比如组件命名,我拒绝用 XxxContainerXxxWrapper 这种模糊词汇。我们的规范是:组件名必须体现业务语义
<PromotionBanner /><BannerWrapper /> 好一万倍——哪怕你是个实习生,也能猜出它是干嘛的。

这种“啰嗦”的风格起初被老同事吐槽:“你是不是写 Java 写多了?”但后来当我们要紧急修复某个 banner 的点击埋点时,所有人都夸我命名清晰。毕竟,在凌晨两点排查线上 bug 时,没人有心情去 reverse-engineer 你的“精巧设计”。


性能优化:不是加个懒加载就完事了

很多人以为前端性能优化就是“图片懒加载 + 代码分割”。但在真实项目中,真正的瓶颈往往藏在细节里

我们在做首屏优化时发现,即使代码拆得再细,LCP(最大内容绘制)还是卡在 2.8s。Profiler 显示,问题出在大量重复的 DOM 查询和重排

举个例子:一个商品列表页,每项都有倒计时组件。最初实现是每个组件都独立 setInterval,结果 50 个商品就有 50 个定时器,CPU 直接飙到 60%。

解决方案?全局时间驱动 + React.memo 精细化控制更新

// 全局时间上下文
const TimeContext = createContext({ now: Date.now() });

// 倒计时组件只在时间变化超过 1 秒时才 re-render
const Countdown = memo(({ targetTime }) => {
  const { now } = useContext(TimeContext);
  const diff = Math.max(0, targetTime - now);
  
  if (diff <= 0) return <span>已结束</span>;
  
  const seconds = Math.floor(diff / 1000) % 60;
  return <span>{seconds}s</span>;
}, (prev, next) => {
  // 只有当秒数变化时才更新
  return Math.floor(prev.targetTime / 1000) === Math.floor(next.targetTime / 1000);
});

配合 requestAnimationFrame 驱动全局时间更新,CPU 占用降到 5% 以下,LCP 直接干到 1.4s。

这种优化没法靠“框架自动完成”,只能靠对浏览器渲染机制的理解 + 大量 profiling。所以上周我还专门去参加了字节办的前端性能 Meetup,坐在角落疯狂记笔记——虽然旁边清北硕士们聊的是 WASM 和 WebGPU,但我至少学会了怎么用 Performance API 抓帧。


工具链升级:自动化是打工人的续命丹

以前我觉得“会写业务代码就行”,直到被重复劳动折磨到崩溃。

比如每次上线前都要手动检查:

  • 是否漏了埋点
  • 图片有没有压缩
  • 接口有没有 mock 数据残留

现在,我们搞了一套轻量级 CI 规则:

检查项 工具 触发时机
代码规范 ESLint + Prettier pre-commit
埋点完整性 自定义 AST 插件 PR 提交时
图片压缩 imagemin-webpack-plugin build 时
敏感信息扫描 git-secrets push 时

最得意的是那个埋点检查插件。它会扫描所有 trackEvent 调用,比对埋点文档里的事件 ID 列表。如果发现文档里没有的事件,直接阻断合并请求。上周实习生加了个 click_banner_v2 但没登记,CI 直接红了,避免了一次线上埋点丢失事故。

产品经理知道后居然夸我:“你们前端现在越来越严谨了!”——虽然我知道他下一句就是“那能不能顺便把那个动画做得更炫一点?”


写在最后:技术探索的本质是“解决问题”

回看这半年,我从一个连 npm script 都配不好的小白,到现在能主导模块拆分、性能优化、工具链建设,最大的感悟是:技术本身不值钱,解决业务问题的能力才值钱

大专学历确实让我在简历关吃亏,但一旦进入项目,代码不会骗人。你写的组件是否易维护?你的方案是否扛得住流量高峰?你的错误边界是否兜住了?这些才是职场硬通货。

最近我在准备下一个分享主题:“如何让非技术同事理解前端复杂度”。因为太多人觉得“改个按钮颜色要三天?是不是在摸鱼?”——其实背后可能是主题系统重构、多端兼容测试、灰度发布策略……

但没关系。只要项目跑得稳,用户点得爽,老板看得见,我的价值就立住了。

对了,上周团建吃饭时,leader 悄悄问我:“有没有兴趣带一个新人?”
我愣了一下,笑着说:“好啊,正好教他怎么优雅地拒绝产品经理的‘就改一点点’需求。”

技术这条路,我才刚上车。但至少,方向盘在我手里。

评论 0

最热最新
暂无评论
生产环境勿扰Lv.1
0
影响力
0
文章
0
粉丝