跪拜 Guibai
← All articles
Frontend · Backend · Vue.js

A Personal Site Rebuilt After Five Years Mirrors a Decade-Long Journey from Mechanic to Full-Stack Engineer

By 航栈 ·
Read original on juejin.cn ↗ Google Translate ↗ Alt translation

The technical arc — from patching SEO into a multi-page Vue 2 build to running a typed monorepo with native SSR — maps the real-world upgrade path many solo developers face when a side project outgrows its original stack. The career backstory also surfaces a less-documented entry route into software: vocational retraining through UI design, not a CS degree.

Summary

The old site ran on Vue 2, Webpack 4, ThinkPHP 5, and MySQL, serving as a live lab for every new skill picked up over five years. A custom multi-page Webpack build injected server-side SEO metadata into PHP templates, a pragmatic compromise that kept pages indexed without a full SSR rewrite. The new stack moves to Nuxt 4, Vue 3, NestJS, Fastify, Prisma, and a pnpm/Turborepo monorepo, with SSR handled natively and API responsibilities cleanly split behind Nginx.

The upgrade is framed as a ten-year checkpoint. Starting as a 300-yuan-a-month mechanic's apprentice, the builder borrowed money to study UI design, taught himself HTML/CSS/JS after hours, and clawed through unemployment and startup pressure into frontend lead and full-stack roles. Each site feature and update log became a timestamp on that progression.

The piece is less a technical tutorial than a record of what a self-built site absorbs over time: half-finished posts, solved bugs, and the emotional weight of deleting code that once took all night to write.

Takeaways
A Vue 2 + Webpack 4 multi-page app injected SEO metadata by placing compiled HTML into ThinkPHP MVC views, avoiding a full SSR migration.
The new frontend runs Nuxt 4 with Vue 3 and TypeScript; SSR, Open Graph, and JSON-LD structured data are now part of a single rendering pipeline.
The backend moved from ThinkPHP 5 to NestJS 11 on Fastify 5, with MySQL 8 accessed through Prisma and Redis handling caching and deduplication.
pnpm Workspaces and Turborepo organize the frontend, backend, shared types, and database models into one monorepo.
Nginx remains the entry point, routing /api to NestJS, pages to Nuxt SSR, and static assets with separate cache policies.
The builder entered tech as a UI design student after working as a mechanic and waiter, then self-taught frontend and full-stack skills over a decade.
Conclusions

Personal sites that survive five-plus years become de facto career journals; the update logs and half-finished posts often document growth more honestly than a portfolio ever could.

The SEO workaround — injecting title, keywords, and description into multi-page Vue builds via a PHP controller — is a pattern that still applies to any SPA that can't justify a full SSR overhaul.

Upgrading a long-running side project is as much an emotional negotiation as a technical one; the old code carries the context of who wrote it and under what constraints.

Concepts & terms
Multi-page Vue application with Webpack
Instead of a single-page app, multiple HTML entry points are configured and compiled separately by Webpack, each loading its own Vue instance. This allows server-side injection of per-page metadata without a full SSR framework.
Monorepo with pnpm Workspaces and Turborepo
A single repository containing multiple packages (frontend, backend, shared types). pnpm Workspaces link dependencies efficiently, while Turborepo caches and parallelizes build tasks across packages.
Source: juejin.cn ↗ Google Translate ↗ Backup ↗