从零开始构建一个现代化前端项目:研二狗的踩坑实录

ORM调教师
2025-12-18 20:02
阅读 1581

作者注:我是深圳某211高校软件工程研二学生,目前在实验室接了一个和腾讯云合作的边缘计算可视化项目。平时除了被导师催论文,还得给组里本科生讲技术分享(上周五刚被迫搞了场Rust入门讲座,结果台下睡倒一片)。最近因为想暑期进大厂实习,疯狂刷LeetCode + 搞前端基建,这篇就当是复盘+攒人品了。


起因:产品经理说“就加个小功能”

事情得从去年双11前说起。我们实验室接了个“高大上”的需求:用Web界面实时展示全球边缘节点状态。当时我内心OS:“不就是个ECharts地图嘛?” 结果产品经理(其实是导师兼任)补了一句:“要支持动态拓扑、低延迟更新、暗黑模式,还要适配手机端……对了,下周演示。”

我当场瞳孔地震。要知道我们之前前端还是jQuery + Bootstrap 3 的祖传代码,连Webpack都没配过。更要命的是,隔壁后端同学用Go写的API接口文档居然还在Confluence里手写(还画了UML草图,真的栓Q)。

那晚我盯着VS Code发呆到凌晨三点,突然意识到:这哪是加功能?这是要重构整个前端架构啊!而且——面试官最爱问“你从0到1搭过项目吗?” 这不就是送分题素材?


技术选型:别卷React了,试试新玩具?

先说结论:我最终用了 Vite + Vue 3 + TypeScript + Pinia + UnoCSS。为什么没选React?不是不香,而是……

  1. 团队现状:组里本科生大多只会Vue 2,强行上React学习成本太高(而且没人愿意周末加班学JSX)
  2. 开发体验:Vite的HMR快到离谱,改一行代码0.1秒热更新,对比Webpack动不动30s的编译时间,简直是降维打击
  3. TypeScript友好度:Vue 3的Composition API + TS 写起来贼顺,尤其配合VS Code的智能提示
  4. 轻量化:UnoCSS比Tailwind更灵活,按需生成CSS,打包体积直接砍掉40%

吐槽一句:后端同学听说我用Vue,一脸鄙夷:“现在大厂都用React了,你这简历怕是要挂。” 我反手甩出字节跳动内部技术栈报告——人家TikTok Web端主力还是Vue呢!

关键依赖清单(package.json 精简版)

{
  "dependencies": {
    "vue": "^3.4.0",
    "pinia": "^2.1.7",
    "axios": "^1.6.0"
  },
  "devDependencies": {
    "vite": "^5.0.0",
    "typescript": "^5.3.0",
    "unocss": "^0.58.0",
    "@vitejs/plugin-vue": "^4.5.0"
  }
}

坑点实录:那些让我想砸键盘的瞬间

1. GitHub Actions 自动部署翻车现场

为了显得专业,我配置了GitHub Actions做CI/CD:PR合并后自动build并推到腾讯云COS。结果第一次上线就炸了——本地跑得好好的,线上白屏

Debug两小时才发现:Vite默认把资源路径设为/assets/xxx,但COS的静态托管根路径是/dist/。解决方案是在vite.config.ts里加一行:

export default defineConfig({
  base: './', // 关键!解决相对路径问题
  // ...
})

教训:永远别信“本地能跑就行”,生产环境专治各种不服。

2. 后端API的跨域之痛

后端同学用Gin框架写了个RESTful API,但死活不肯开CORS。理由是:“你们前端自己配代理啊!”

行吧,我在vite.config.ts里加了代理:

server: {
  proxy: {
    '/api': {
      target: 'http://localhost:8080',
      changeOrigin: true,
      rewrite: (path) => path.replace(/^\/api/, '')
    }
  }
}

结果测试环境部署时又挂了——因为测试服域名不是localhost!最后妥协方案:后端加了个Access-Control-Allow-Origin: *(虽然不安全,但导师说“内网项目无所谓”)。


性能优化:让用户少骂一句“加载好慢”

关键指标监控

指标 优化前 优化后 工具
首屏加载 3.2s 1.1s Lighthouse
Bundle Size 2.1MB 890KB Webpack Bundle Analyzer
FCP 2.8s 0.9s Chrome DevTools

具体骚操作

  • 懒加载路由:用Vue Router的defineAsyncComponent拆分页面
  • 图片压缩:所有静态资源走Sharp预处理(脚本写在scripts/build.js里)
  • 防抖搜索:用户输入拓扑节点名时,加500ms防抖避免疯狂请求后端
  • 骨架屏:数据加载时显示灰色块,心理上觉得快很多(用户体验玄学)

最骚的是暗黑模式切换:不用CSS变量硬切,而是用UnoCSS的dark:前缀,配合<html class="dark">动态切换,性能比JS方案高30%!


开发心得:这些事早点知道就好了

  1. 别重复造轮子
    一开始我想自己写WebSocket重连逻辑,结果发现socket.io-client已经处理了断线重连、心跳检测。省下两天时间刷了三道力扣(面试题储备+1)。

  2. TypeScript不是银弹
    组里本科生抱怨TS太难,我就妥协写了// @ts-ignore。结果三天后他自己改代码,类型报错满屏——宁可前期多写interface,也别后期debug到秃头

  3. 和后端对齐字段命名
    他们返回node_status,我前端用nodeStatus,结果axios.interceptors.response里得手动转换。后来统一约定:后端用snake_case,前端用camelCase,中间层自动转换

  4. GitHub不是备份盘
    有次我commit message写“fix bug”,结果一周后根本不知道改了啥。现在强制要求:

    feat(topo): add real-time latency display
    fix(api): handle null response from /nodes
    

面试题关联:面试官可能这么问

  • “你们前端如何保证和后端接口一致?”
    → 答:Swagger生成TS接口定义 + Mock Service Worker拦截请求

  • “首屏加载慢怎么优化?”
    → 答:分包、CDN、关键资源内联、预加载(顺便提一嘴我们用了Vite的preload指令)

  • “如何做错误监控?”
    → 答:Sentry集成 + 自定义window.onerror上报(虽然我们项目小到用不上,但得装懂)


最后:为什么我觉得前端越来越像“全栈”

以前觉得前端就是切页面,现在搞个现代化项目,得操心:

  • 构建工具链(Vite/Rollup配置)
  • CI/CD流水线(GitHub Actions)
  • 性能监控(Lighthouse CI集成到PR)
  • 甚至容器化(Dockerfile里跑npm run build

上周和腾讯的同学吃饭,他说他们前端团队现在要会写简单的Go中间件——因为SSR需要。我听完默默打开了Rust书(别问,问就是“未来已来”)。


写在结尾

这个项目虽然只是实验室demo,但让我彻底告别了“前端=HTML+CSS”的认知。真正的现代化前端,是用户体验、工程化、协作效率的三位一体

现在每次打开控制台看到100分的Lighthouse报告,都会傻笑一下。虽然导师还在催论文,但至少——我的简历上能写“独立搭建高性能前端架构”了(手动狗头)。

彩蛋:如果你在深圳,欢迎来参加我们每月一次的“湾区Rust夜”(虽然是蹭腾讯会议室办的)。上次有个实习生现场用Rust写了个WASM模块替换前端加密逻辑,性能提升5倍…… 啊,跑题了。

共勉:代码会崩,需求会改,但热爱不灭

评论 0

最热最新
暂无评论
ORM调教师Lv.1
0
影响力
0
文章
0
粉丝