从 Vue 到简历:我在北京通勤路上折腾出的实战笔记

线上救火队
2026-04-26 18:36
阅读 449

上周五晚上十一点,我坐在回天通苑的地铁上,耳机里放着《前端早读课》的播客,脑子里却还在想今天被产品经理怼的那个需求:“这个组件能不能做得像 Llama 那样智能一点?”我一脸懵——Llama 是 Meta 的大模型啊大哥!但转念一想,也许他只是想要个“更聪明”的交互体验。这让我意识到:技术再酷,也得落地到项目里才有价值

作为一个在北京每天通勤一小时的前端工程师,我最近正处在要不要跳槽的纠结期。一方面,当前公司用的技术栈稳定得有点“古董”(Vue 2 + webpack 4,懂的都懂);另一方面,我又担心跳出去后面对一堆新玩意儿手忙脚乱。为了给自己攒点底气,我决定把 Vue.js 生态系统彻底摸一遍,顺便搞个小项目练练手——既能写进简历,又能传到 GitHub 上装点门面(别笑,这年头没几个 Star 真的不好找工作)。

起手式:为什么选 Vue?不是 React?

说实话,React 我也学过,Hooks 写起来确实优雅。但在我们这种传统行业公司,Vue 的模板语法对新人更友好,而且团队里老哥们习惯了选项式 API,一时半会儿改不了。更重要的是——Vue 的文档是真的香!中文社区活跃,遇到问题搜一下基本都有答案。不像某些框架,报错信息长得像加密电报。

于是,我决定以 Vue 3 为核心,搭配 Vite、Pinia、Vue Router 等官方生态工具,构建一个“智能任务管理面板”。名字我都想好了:LlamaTask(蹭个热点,产品经理应该会满意吧?)。

踩坑实录:从“Hello World”到线上事故

1. 组合式 API 的真香与真坑

一开始我死活不用 <script setup>,觉得“太激进”。直到某次重构一个表单组件时,发现逻辑复用简直地狱——mixins 冲突、this 指向混乱,改个字段要查半天。咬牙切齿切换到组合式 API 后,世界清净了。

<script setup>
import { ref, computed } from 'vue'
import { useTaskStore } from '@/stores/task'

const taskStore = useTaskStore()
const newTask = ref('')
const isValid = computed(() => newTask.value.trim().length > 0)

function addTask() {
  if (isValid.value) {
    taskStore.add(newTask.value)
    newTask.value = ''
  }
}
</script>

这段代码现在看很简单,但当时我卡在 refreactive 的选择上纠结了半小时。后来明白:简单状态用 ref,复杂对象用 reactive。别想太多,先跑起来再说。

2. Pinia:比 Vuex 更清爽的状态管理

我们项目之前用 Vuex,配置文件长得像毕业论文。迁移到 Pinia 后,store 文件直接变成函数式写法,测试也方便多了。

// stores/task.ts
import { defineStore } from 'pinia'

export const useTaskStore = defineStore('task', {
  state: () => ({
    tasks: [] as string[],
    filter: 'all' as 'all' | 'active' | 'completed'
  }),
  getters: {
    filteredTasks: (state) => {
      if (state.filter === 'active') return state.tasks.filter(t => !t.completed)
      if (state.filter === 'completed') return state.tasks.filter(t => t.completed)
      return state.tasks
    }
  },
  actions: {
    add(task: string) {
      this.tasks.push({ text: task, completed: false })
    }
  }
})

重点来了:Pinia 支持 TypeScript 推导!不用再写 interface 套娃,IDE 自动提示爽到飞起。上周上线时,测试小姐姐居然没提一个 bug,我差点以为她请假了。

3. Vite:快到让我怀疑人生

以前启动项目要等 30 秒,现在 vite dev 秒开。HMR(热更新)快得离谱,改一行 CSS 都不用刷新页面。最夸张的是 build 时间——从 webpack 的 90 秒降到 8 秒!那天我激动地在群里发了个“Vite 牛逼”,结果运维小哥回我:“你是不是又没关 sourcemap?” 😅

性能优化:别让用户等成化石

做技术博客的人总爱谈性能,但真实项目里,往往是为了应付老板的 KPI。不过这次我是认真的——LlamaTask 要跑在低端安卓机上也不能卡

我做了三件事:

  1. 懒加载路由:首页只加载核心组件

    // router/index.ts
    const Home = () => import('@/views/Home.vue')
    
  2. 虚拟滚动:任务列表超过 100 条就上 vue-virtual-scroller

  3. 防抖输入:搜索框加 300ms debounce,避免疯狂触发计算

效果如何?用 Lighthouse 测了一下:

指标 优化前 优化后
FCP 2.1s 0.8s
TTI 3.5s 1.2s
Bundle Size 1.8MB 620KB

虽然离 PWA 还差得远,但至少比隔壁组那个“首屏白屏 5 秒”的项目强多了(手动狗头)。

GitHub 与简历:让代码替你说话

折腾完这一套,我把 LlamaTask 传到了 GitHub。README 写得贼认真,连部署链接和 Lighthouse 报告截图都放上了。还特意加了个 CONTRIBUTING.md,假装自己是个开源大佬。

其实我心里清楚:面试官不会细看你几百行代码,但他们一定会看你的工程规范和文档意识。比如:

  • 是否用 ESLint + Prettier 统一风格?
  • 是否有单元测试(哪怕只有 20% 覆盖率)?
  • 是否用语义化 commit(feat: add task input validation)?

这些细节,在简历上写“熟悉前端工程化”可比干巴巴的“精通 Vue”有力得多。

最后:跳还是不跳?

写这篇文章的时候,我已经收到了两家公司的面试邀约。一家要求 Vue 3 + TypeScript + 微前端经验,另一家直接问:“你 GitHub 上那个 LlamaTask 能讲讲设计思路吗?”

说实话,我还没决定去哪家。但至少现在,我不再是那个听到“Llama”就发慌的小前端了。技术人的底气,从来不是来自跳槽,而是来自亲手写过的每一行代码

如果你也在迷茫期,不妨试试:找个周末,关掉微信,开个新 repo,用最新的技术栈做个玩具项目。不为别的,就为下次写简历时,能理直气壮地写上一句:

主导 Vue 3 全家桶项目从 0 到 1,GitHub 获得 XX Star(哪怕只有 2 个)

毕竟,在这个卷成麻花的前端圈,能跑起来的代码,永远比完美的计划更有说服力

P.S. 地铁到站了,下篇可能聊聊“如何用 Vue + Web Worker 实现本地 AI 推理”——开玩笑的,Llama 跑不动,但 TinyLLM 或许可以?

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝