
简介Vue.js 是当前流行的前端框架之一这份“VUE前端小例子”资源面向刚开始接触 Vue 的开发者通过一个简洁的资产管理应用帮助理解 Vue 实例、数据绑定、计算属性、组件化、模板语法等核心概念并顺带涉及路由与状态管理的初步用法适合作为入门实践或课程设计参考。资源压缩包仅 45KB共包含 39 个文件其中 15 个 js 脚本负责逻辑与构建配置9 个 vue 组件展示组件化写法另有 JSON 配置、PNG 图片及项目说明等结构完整便于对照学习。目前该资源已有 4209 人学习下载。解开压缩包后读者可以查看 webpack 构建配置、router 路由设置、Vue 组件目录以及静态资源组织方式对理解一个真实 Vue 工程的基本骨架很有帮助同时代码中的布局和响应式处理也能为前端样式实现提供借鉴整体上是一份麻雀虽小、五脏俱全的入门级示例。 直接开工这篇博文就当是我这个老前端最近带新人重构一个内部管理系统时顺手整理出来的一份实战笔记。项目不大但五脏俱全从环境搭建到打包部署把Vue开发里那些高频的坑和技巧都串起来了。给正在学Vue的、准备面试的、或者刚接手项目的朋友做个参考。1. 项目整体设计与思路拆解1.1 为什么是Vue以及项目定位这次要做的“VUE前端小例子”其实是一个轻量级的后台管理系统前端。选Vue不是因为它比React高一等纯粹是务实团队现有成员最熟的就是Vue而且项目本身是配合Spring Boot做前后端分离Vue的生态路由、状态管理、UI库能让我们用最小的成本把页面堆出来。这个例子的核心诉求有三点一是把登录鉴权跑通账号密码登录 路由守卫二是把最常见的列表增删改查做透三是把文件上传、视频播放、消息推送这些“高频但容易翻车”的功能做成可以复用的模块。对新手来说跟着这个例子走一遍基本就等于把Vue开发的主干线摸清了。1.2 选项式API和组合式API怎么选盯着这个项目我一开始就面临一个选择题用选项式Options API还是组合式Composition API我的建议是新项目直接用组合式老项目维护用选项式也完全没问题。组合式API最大的优势是把同一个业务逻辑的代码收拢在一起不用再“数据在data里、方法在methods里”来回跳。比如做一个用户列表搜索条件、列表数据、加载方法可以全部放到一个setup里的区域块改动起来非常顺手。对于团队协作如果项目里既有老手又有新人组合式API配合script setup写法代码量能减少三分之一肉眼可见地清爽。不过这不是说选项式一无是处。如果你的业务页面非常简单纯粹是表单展示选项式的结构化反而更直观。我自己的习惯是页面复杂度高、逻辑需要复用的选组合式简单静态页面用选项式也凑合。两种写法都熟面试的时候才不会露怯。2. 核心细节解析与实操要点2.1 环境安装与脚手架搭建这一步是很多新手第一道坎儿。先说结论请务必使用nvm管理Node版本不要直接在官网下载最新的Node用到底。我见过太多人因为Node版本过高导致依赖安装失败或者node-sass编译不过去。推荐的做法是装nvm然后安装一个稳定的LTS版本比如16.x或18.x再用npm或pnpm全局安装vue/cli或直接使用create-vue创建项目。实操命令很简单# 用nvm安装并切换Node版本 nvm install 18.18.0 nvm use 18.18.0 # 创建Vue3项目推荐Vite驱动 npm create vuelatest my-demo # 或者用Vue CLI适合老项目维护 npm install -g vue/cli vue create my-demo创建过程中会有交互式选项比如是否安装路由、Pinia、ESLint等。新手建议全选Yes省得后面手动补。一个小提醒项目名别用中文也别用下划线开头的名字否则npm依赖树解析会有莫名其妙的坑。2.2 路由配置与参数传递路由是Vue项目的骨架。我见过不少初学者的代码router/index.js里堆了两三百行没有任何嵌套和懒加载。这里分享一个基础但规范的做法页面级组件用懒加载component: () import(/views/xxx.vue)减少首屏白屏时间。区分“布局路由”和“页面路由”布局路由套一层Layout组件子路由嵌套在children里。路由参数务必区分query和paramsquery传参适合搜索条件URL里能看到刷新不丢params传参适合详情页ID配合name跳转刷新可能丢失要谨慎。// 路由传参示例 // 跳转 router.push({ path: /detail, query: { id: 123 } }) router.push({ name: detail, params: { id: 123 } }) // 接收 const route useRoute() route.query.id // 方式一 route.params.id // 方式二一个容易忽视的坑是用params传参时如果页面刷新参数会变成undefined。真正做详情页更稳妥的方案是把参数放在query里或者存到Pinia/本地缓存里。这个细节在做“列表跳详情”功能时尤其重要。2.3 组合式API核心ref与reactive组合式API里最常用的就是ref和reactive。我的经验是基础类型和数组用ref深层对象用reactive但别忘了reactive的“响应式陷阱”——解构赋值会让数据丢失响应性。这就好像你把一个插线板上的插头拔下来再插到别处电虽然还是那个电但原来的插座已经不通了。举个例子// ref用法 const count ref(0) const list ref([]) count.value // 注意取value // reactive用法 const state reactive({ name: 张三, age: 18 }) // 错误示范解构后age就变成普通变量了 const { age } state // 正确方式使用toRefs const { age } toRefs(state)我在实际项目中更偏爱ref多一点因为写起来统一思考成本低。而且Vue官方也在向这个方向引导ref的.value虽然啰嗦但好处是语义明确一看就知道是响应式数据。3. 实操过程与核心环节实现3.1 项目结构搭建与UI组件库引入这次例子我选了Ant Design Vue作为UI组件库。原因很简单组件全、文档清晰、后台管理系统最常见。安装方式npm install ant-design-vue4.x引入方式有两种全量引入和按需引入。日常开发尤其是公司内部系统全量引入问题不大虽然包体积大一点但省心。如果做对外C端项目再用unplugin-vue-components做按需加载也不迟。别一开始就追求极致性能反而把开发效率拖慢了。项目结构我建议这样规划src/ ├── api/ # 接口请求 ├── assets/ # 静态资源 ├── components/ # 通用组件 ├── router/ # 路由配置 ├── store/ # 状态管理Pinia ├── utils/ # 工具函数 ├── views/ # 页面组件 ├── App.vue └── main.js这个结构不花哨但足够清晰。新人接手能快速找到要改的文件这就是好结构。3.2 登录鉴权与路由守卫登录是整个系统的入口也是前后端联调的第一个环节。我用一个简单的token方案演示登录接口返回token存到sessionStorage和Pinia里。路由守卫router.beforeEach判断token是否存在不存在则跳转登录页。请求拦截器axios自动带上Authorization头。核心代码像这样// 路由守卫 router.beforeEach((to, from, next) { const token sessionStorage.getItem(token) if (to.path /login) { next() } else if (!token) { next(/login) } else { next() } })这里有一个非常关键的实践细节路由守卫里不能只判断“有没有token”还要考虑token过期的情况。最简单的处理是在axios响应拦截器里遇到401状态码时清除本地token并强制跳转登录页。否则用户过一段时间再操作会发现页面白屏或者一直报错体验非常糟糕。前后端分离的项目登录接口通常由后端Spring Boot提供前端只需要处理好CORS跨域问题。开发环境下建议用Vite的代理配置而不是在后端硬开跨域。// vite.config.js 开发环境代理 server: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true, rewrite: (path) path.replace(/^\/api/, ) } } }3.3 可视化配置日历禁用与实时数据获取项目里有个排班日历页面需求是“当前月份之前的日期不可选”。这个点看着小但特别能考察对组件库的熟悉程度。Ant Design Vue的日历组件支持disabledDate回调我们只需要写一个判断函数const disabledDate (currentDate) { // 只能选择当前月份及之后的时间 return currentDate currentDate.startOf(day) dayjs().startOf(day) }注意一定要用dayjs做日期比较直接用new Date()比较可能会有时区或格式问题。另外系统里还有一个“通知推送”的模块后端用的是SignalR一种实时通信框架前端要拿到推送数据不能靠轮询得建WebSocket连接。// 前端连接SignalR import * as signalR from microsoft/signalr const connection new signalR.HubConnectionBuilder() .withUrl(/api/chatHub) .withAutomaticReconnect() .build() connection.on(ReceiveMessage, (message) { // 收到消息更新页面数据 messageList.value.push(message) }) connection.start().catch((err) console.error(SignalR连接失败, err))如果是纯前后端分离的WebSocket场景前端浏览器原生new WebSocket(url)也够用注意处理onmessage、onclose重连逻辑即可。我的经验是能用现成SDK就别自己造轮子但必须理解底层是WebSocket否则出了问题都不知道从哪查。3.4 性能优化从JSON.stringify谈起热词里有“json.stringify前端性能优化”这个点让我特别有共鸣。很多同学在提交数据时喜欢这样写const formData { name: 张三, age: 18, hobby: [篮球, 吉他] } axios.post(/api/user, JSON.stringify(formData))JSON.stringify本身是必要的但优化点在于对于大型列表或频繁调用的场景重复执行JSON.stringify会阻塞主线程。比如一个实时搜索功能用户每敲一个字母就发起请求每次都把整个大对象序列化一遍页面会卡顿明显。优化方案是加上debounce防抖把多次触发合并成一次同时用JSON.stringify缓存上一个请求的结果如果数据没变化就不发请求。另外一个更隐蔽的优化点当你只需要提交表单里的某几个字段时不要直接序列化整个大对象。先做一层解构或字段筛选再序列化。这能减少传输体积也能避免把一些不需要的字段比如临时UI状态提交给后端。4. 常见问题与排查技巧实录4.1 图片防盗链与本地加载难题前面热词里有两个很实际的问题“前端此图片未经允许不可引用怎么解决”和“本地加载vue打包好的项目”。第一个问题通常是后端返回的图片做了防盗链限制前端直接引用时请求头里带了Referer字段被后端拒了。解决办法有几种后端在Nginx里配上图片的Referer白名单。后端把图片改为Base64或走接口代理返回。前端用meta namereferrer contentno-referrer让请求不带Referer。第二种方式比较灵活但会增加服务器流量第三种方式最省事但有安全隐患适合对安全要求不高的场景。第二个问题本地加载打包好的Vue项目核心难点在于静态资源路径。默认情况下Vite打包后资源路径是绝对路径/assets/xxx.js如果你把dist文件夹直接用file://协议打开会白屏。解决办法是改vite.config.js里的base// vite.config.js export default defineConfig({ base: ./, // 改成相对路径 })改完之后重新打包就能直接双击index.html本地预览了。如果是iOS的WebView加载本地打包文件同理只要确保WebView的URL指向index.html且所有资源都是相对路径就能正常打开。但要注意iOS的WKWebView对本地文件访问的沙盒限制比较多建议用loadFileURL方法而不是loadRequest。4.2 大文件上传与Vue项目打包成exe“前端使用worker上传大文件”这个话题进阶开发者一定要懂。大文件上传的核心思路是切片上传将大文件切成若干小块分批次上传最后后端合并。用Web Worker做切片的好处是切片和文件读取不阻塞主线程页面不会卡死。我通常这样实现// 在Worker中执行切片 self.onmessage async (e) { const file e.data.file const chunkSize 2 * 1024 * 1024 // 2MB一片 const chunks [] let offset 0 while (offset file.size) { chunks.push(file.slice(offset, offset chunkSize)) offset chunkSize } self.postMessage(chunks) }主线程接收chunks后再逐个调用上传接口并记录上传进度。这个方案比一次性读完文件内存占用低了几个量级。至于“vue项目怎么打包成exe”两种主流的方案是Electron和Tauri。Electron体积大但生态成熟Tauri体积小但需要Rust环境。如果你的Vue项目只是内部工具用Electron打包把打包后的dist目录塞进一个窗口就是一个原生应用了。这部分做起来不难但唯一需要耐心的是第一次运行时下载依赖慢得让人想摔键盘。4.3 前后端分离面试高频题复盘结合热词里的“前端面试题”我发现面试官特别喜欢问这几个点而且都跟这个项目里的实践紧密相关Vue响应式原理Vue3的响应式是基于Proxy实现的它比Vue2的Object.defineProperty强在可以拦截属性的新增和删除深层对象也不需要$set了。v-for和v-if为什么不建议一起用因为v-for的优先级高于v-if每次渲染都先循环再判断白白浪费性能。建议用computed先过滤再渲染。路由懒加载的好处按需加载页面代码减小首屏体积尤其对后台管理系统这种页面很多的场景收益明显。Vue3和Vue2的双向绑定区别Vue2用v-model和.sync修饰符Vue3统一为v-model:propsName支持多个绑定。面试最后通常还会让你讲讲“前端八股文”其实考察的就是你写的代码规不规范、底层原理懂不懂。我的建议是与其背面试题不如把上面这个小项目亲手做一遍面试时直接讲踩坑经历比背一百道题都管用。4.4 调试工具使用与前端开发的必备skills最后补充一个看似基础但很多人真不会的点Vue调试工具的用法。装了Vue.js devtools扩展后在页面里能看到每个组件的props、data、computed的实时值。很多人只知道看Network和Console完全不知道用组件树来定位状态。我的习惯是先看Network确认接口请求有没有问题再看Console看有没有报错最后打开Vue Devtools逐个组件检查数据流。一个组件的状态不对顺着组件树往下点很快就能锁定是父组件传参问题还是子组件内部逻辑问题。在编码阶段也要讲究一点“skills”——比如写组件时给props写好类型和默认值、给v-model绑定值做好命名规范、给接口请求做好统一封装。这些看起来是小事但当你需要维护三个月前的代码时你会感谢当初的自己。5. 结语与我的个人体会这个“VUE前端小例子”做下来最大的收获不是代码跑通了而是建立了一套自己的排查思路。很多人在遇到问题时第一反应是去百度或者问GPT然后复制粘贴答案。但我建议你先看一眼控制台报错再拆解一下报错信息里的关键词最后定位到具体文件。这个过程比答案本身重要得多。尤其是前端开发工具链乱、版本杂、浏览器兼容性问题多debugging的能力才是真正的护城河。在自己的电脑上装好nvm、装好浏览器自动化调试工具把项目从npm create开始到npm run build结束每一步都亲手敲一遍比看一百篇教程都有用。最后再分享一个小技巧在写Vue代码时如果你发现自己反复复制粘贴同一个逻辑那就该把它抽成composable自定义组合函数了。一个成熟的开发者的标志就是知道自己该在什么时候写重复的代码什么时候该做抽象。希望这个项目笔记对你有帮助也欢迎你在实操中遇到问题后回头来对照看看是不是踩了同样的坑。本文还有配套的精品资源点击获取