从零开始构建一个现代化前端项目:我的实战经验分享
引言:为什么我决定重新搭建一个前端项目?

事情得从去年说起。那时我们团队要启动一个全新的管理系统,目标是打造一个稳定、可扩展、用户体验良好的管理后台。说白了,就是那种用户每天都要用、出错不得的项目。
之前的项目已经有点“老”,技术栈停留在 Vue 2 + Webpack 3 的时代。虽然能跑,但维护成本高、开发效率低,而且随着需求迭代,越来越力不从心。于是公司决定:干脆从零开始搭一个新的项目脚手架。
听起来挺简单的吧?但实际上这个过程比预想中复杂得多。从选型、配置工具链,到解决浏览器兼容性问题、优化性能、保障用户体验,每一步都踩过坑。
今天就借这篇文章,聊聊我是怎么一步步把一个空目录变成一个成熟的现代化前端项目的,希望你在类似场景下少走些弯路。
一、项目背景:为什么我们要从零做起?

我们做的系统是一个 B 端的产品后台,涉及大量数据展示、表单交互和权限控制。虽然之前有过两个类似的项目,但它们各自有痛点:
- 第一个项目基于 Vue 2 + Webpack 3 搭建,但构建慢、代码分割差、依赖老旧
- 第二个项目尝试迁移到 Vite,但在某些旧浏览器上表现不稳定,尤其 IE 兼容是个噩梦
- 团队内部也开始使用 TypeScript,但老项目迁移难度大
- 组件库需要统一风格,不能每个项目都是自定义一套 UI
- 项目结构混乱,没有形成标准化规范,新同事接手困难
所以我们决定——不是改,而是重建。
目标很明确:
- 使用最新的主流框架(Vue 3)
- 快速热更新和打包速度(Vite)
- 支持 TypeScript
- 构建可复用的组件体系(如基于 Element Plus 封装的一套业务组件)
- 提供完整的 CI/CD 流程
- 优化首屏加载性能,提升用户体验
二、遇到的挑战:从零开始从来都不是容易的事

从创建 npm init vite@latest 开始的第一步就不太顺利。你可能会觉得,这有什么难的?但是等你真的开始配置 ESLint、Prettier、Pinia、路由懒加载、TypeScript、API 请求封装……你就会明白,“现代化”并不是加个 vite.config.js 就完事了。
挑战 1:TypeScript 配置的坑太多了
刚开始的时候我以为只要引入 tsconfig.json 就行了,结果发现根本不起作用。比如在模块导入时提示找不到类型定义文件,或者 Vue 文件里写 <script setup> 出现编译错误。
解决方案:
- 安装
typescript,vite-plugin-vue-type-imports - 配置好
tsconfig.json和jsconfig.json - 对于 Vue SFC 组件,确保
unplugin-vue-components正确自动导入组件类型
还有个头疼的地方是环境变量的类型声明。一开始 .env.d.ts 没配好,各种 import.meta.env.xxx 报错,后来才意识到要用 interface ImportMetaEnv 去声明。
挑战 2:组件库与样式冲突的问题
我们选择了 Element Plus 作为基础组件库,并打算基于它做一层业务封装。但问题来了:不同页面引用同一个组件时,样式竟然会冲突!
原因是我们在多个地方同时引入了 el-button,而其全局 CSS 并没有很好地隔离。再加上有些页面用了自己的 SCSS 变量覆盖了默认值,导致按钮的样式在不同页面显示不一致。
解决方案:
- 使用
unplugin-element-plus/vite插件实现按需导入 - 通过 SCSS 变量注入方式统一主题定制(如
$--color-primary: #409EFF) - 使用
scoped或CSS Modules来限制组件样式影响范围 - 为每一个业务组件增加命名空间前缀(如
.my-comp-btn)
挑战 3:IE11 兼容性问题
客户还在用 IE11,别笑,现实就是这么残酷。我们在开发过程中一度忽略了这个问题。直到部署到测试环境才发现,Vite 默认不支持 ES5,甚至连 async/await 在某些情况下都无法运行。
解决方案:
- 使用
vite.config.js中配置build.target为es2015 - 安装
unplugin-babel/vite和core-js,进行 Polyfill 注入 - 手动添加
regenerator-runtime/runtime到入口文件 - 使用 AutoPolyfiller 插件自动识别并补全缺失的语法支持
虽然这些配置让构建变慢了一点,但我们最终实现了对 IE11 的兼容,客户那边也表示满意。
挑战 4:性能优化的细节太多,稍不注意就卡住
刚上线后有一次用户反馈“首页打开太慢”,我们分析发现,第一次访问加载了超过 3MB 的 JS 文件。
这不是开玩笑。
原因分析:
- 主包体积过大
- 没有按需加载路由
- 第三方库未做 code splitting
优化手段:
- 启用动态导入(
defineAsyncComponent()+ lazy route loading) - 使用
vite.config.js的build.rollupOptions做 chunk 分割 - 外部化大型库(如 moment/dayjs)为 CDN 资源
- 图片资源压缩使用
vite-plugin-imagemin - 接口请求使用缓存策略(localCache + localStorage)
最终首页 JS 总大小下降到了 700KB 左右,首屏加载时间从 6 秒缩减到 1.8 秒。
三、解决方案:从架构设计到落地实现
经过一段时间的摸索,我们总结出了一套完整的技术方案,大致如下:
📦 1. 技术栈选择
| 模块 | 技术 |
|---|---|
| 前端框架 | Vue 3 + Script Setup |
| 构建工具 | Vite 4.x |
| 状态管理 | Pinia |
| 路由 | Vue Router 4 |
| 类型检查 | TypeScript |
| 样式方案 | SCSS + PostCSS + Tailwind(部分) |
| 组件库 | Element Plus + 自研业务组件 |
| HTTP 请求 | Axios + 自封装拦截器 |
| 代码规范 | ESLint + Prettier |
| 单元测试 | Vitest + Testing Library |
| 自动化流程 | GitHub Actions / Jenkins |
🧠 2. 项目结构设计(简化版)
project/
│
├── public/ # 静态资源(图片、字体等)
├── src/
│ ├── assets/ # 需要处理的静态资源
│ ├── components/ # 通用组件(UI 层)
│ ├── layouts/ # 页面布局组件
│ ├── pages/ # 页面组件(按功能模块划分)
│ ├── router/ # 路由配置
│ ├── stores/ # Pinia store 管理
│ ├── services/ # 数据接口服务
│ ├── utils/ # 工具函数
│ ├── styles/ # 公共样式文件
│ └── main.ts # 入口文件
│
├── types/ # TS 类型定义
├── .env.* # 环境变量
└── vite.config.ts # Vite 配置文件
这种分层清晰、职责分明的结构,大大提升了协作效率。
🛠️ 3. 开发工具与调试技巧
工欲善其事,必先利其器。以下是我们常用的几个工具和小技巧:
🧩 VSCode 插件推荐
- ESLint: 实时检查代码质量问题
- Prettier: 保存即格式化
- Volar: Vue 3 专用语言支持插件
- Stylelint: CSS/SCSS 代码规范检查
- GitLens: 更方便地查看 Git 记录
🔍 控制台调试技巧
- 使用
performance.now()测量执行耗时 - 使用 Chrome DevTools 的 Performance 面板分析加载瓶颈
- 设置断点追踪异步调用链
- 使用 Vue Devtools 查看组件树和响应式状态变化
四、成果与收益:不仅快了,还更好维护了
经过这次重构,项目整体质量提升非常明显:
| 指标 | 旧项目 | 新项目 | 提升幅度 |
|---|---|---|---|
| 首屏加载时间 | ~6s | ~1.8s | +67% |
| 热更新速度 | ~1.5s | <200ms | +87% |
| 包体积 | 3MB+ | ~800KB | -73% |
| 团队新人上手时间 | 1周+ | 2天内 | +85% |
| 错误率(生产环境) | 较多 | 显著减少 | 下降约 60% |
更关键的是,我们现在有了更标准的开发规范、更灵活的组件复用机制,以及可扩展性强的基础架构。
五、经验总结:给你的几点建议
如果你正在准备或已经开始从零构建前端项目,以下是我结合自身经历总结的一些实用建议:
✅ 技术选型要符合实际需求,不要盲目追新
- 不要一看 Vue 3 发布就立刻升级,除非你准备好迁移成本
- 如果团队还没掌握 TypeScript,那就先从小项目练起再全面推行
- 对于企业级产品,兼容性和稳定性有时候比“最新特性”更重要
✅ 做好基础架构设计,提前制定编码规范
- 建立统一的目录结构
- 编写
.editorconfig+.eslint+.prettier规则 - 定义好 API 请求封装模板
- 建议使用 Conventional Commits 规范提交信息
✅ 关注用户体验,从第一行代码做起
- 表单控件要有合理的占位符、验证规则和错误提示
- 页面切换时做好加载动画,避免让用户干瞪眼
- 对于长时间操作,建议加入骨架屏或局部 loading
✅ 不要忽略性能优化
- 合理使用异步加载、代码分割、路由懒加载
- 图片要压缩,字体文件尽可能裁剪
- 第三方库优先考虑 Tree Shaking 支持良好的版本
✅ 写文档!写文档!写文档!
- 写清楚项目启动步骤
- 写一份快速上手指南
- 记录常见问题 FAQ
- 文档放在 README.md 里最显眼的位置
结语:从零起步虽难,但值得
从零开始搭建前端项目的过程,像是在拼一张巨大的拼图。你不知道哪一块应该最先放进去,也不知道最后是否能严丝合缝。
但当一切配置完成、第一个页面跑起来的时候,那种成就感,是改一行代码永远体会不到的。
现在回头看看当时一个个踩过的坑、深夜修改配置文件的日志,其实都成了宝贵的经验财富。
希望这篇文章对你有所启发。如果你也在经历类似的过程,欢迎留言交流;如果是新手刚接触这块,也不要害怕,从最小可行性项目开始,一步一步来,总会建成高楼。
坚持下去,你会感谢那个不怕麻烦、愿意折腾的自己。
最后贴一句我在重构时常常告诉团队的话:
“项目可以慢慢做,但架构必须一开始就设计好。”

评论 0