从零搭建Vue3项目:深入理解前端工程化与脚手架底层原理
1. 从“零”开始为什么我们要绕开脚手架最近在面试和带新人的过程中我发现一个挺有意思的现象很多简历上写着“精通Vue3”的朋友当被问到“如果不使用create-vue或Vite模板你如何从零初始化一个Vue3项目”时往往会卡壳。他们的第一反应是“啊现在不都用脚手架吗自己搭多麻烦。”这恰恰点出了当前前端学习的一个普遍误区——对工具的过度依赖导致对底层构建逻辑的认知模糊。脚手架如create-vue、Vite无疑极大地提升了开发效率它像一份精心搭配好的“预制菜”开箱即用。但长期只吃“预制菜”你可能会失去挑选食材、掌握火候、甚至设计菜谱的能力。所以这次我们不依赖任何现成的项目框架或脚手架就用最原始的npm init从一个空文件夹开始一步步搭建一个“过得去”的Vue3前端项目。这个“过得去”的标准是具备现代前端开发的核心要素模块化、热更新、类型检查、代码规范、构建优化结构清晰便于后续维护和扩展。这不仅仅是一个搭建教程更是一次对前端工程化核心链条的深度梳理。你会彻底明白那些被脚手架隐藏起来的配置究竟在为什么服务。2. 项目初始化与最简依赖引入我们的起点是一个绝对空白的目录。打开终端执行以下命令mkdir vue3-from-scratch cd vue3-from-scratch npm init -y这会生成一个最基础的package.json文件。现在我们需要思考一个Vue3应用最核心的依赖是什么答案是vue本身。所以我们首先安装Vue3npm install vuenext注意这里我们特意使用next来确保安装的是Vue3的最新稳定版。安装后你的package.json的dependencies中会出现vue: ^3.x.x。只有Vue库是不够的。Vue3的模板如template中的内容需要被转换成浏览器能理解的渲染函数。在Vue生态中负责这项工作的核心工具是vue/compiler-sfc(Single File Component compiler)。它专门用于编译.vue单文件组件。因此我们需要将其安装为开发依赖npm install vue/compiler-sfc -D至此我们拥有了运行和编译Vue3代码的最基础能力。但如何让这些代码在浏览器中运行起来呢这就需要引入构建工具。3. 构建工具选型为什么是Vite在早期Webpack是绝对的主流但其复杂的配置和缓慢的启动/热更新速度在项目变大后成为痛点。我们选择Vite原因非常直接极致的开发体验基于原生ES模块ESMVite在开发环境下无需打包启动速度极快。热更新HMR也是按需进行几乎瞬间完成。对Vue的一等公民支持Vite由Vue作者尤雨溪创建对Vue单文件组件SFC的支持是原生且最优的。简洁的配置相比WebpackVite的配置更加直观和简洁更符合我们“从零理解”的目标。因此我们安装Vitenpm install vite -D同时为了让Vite能够正确识别和编译.vue文件我们还需要安装官方的Vue插件npm install vitejs/plugin-vue -D现在我们的核心开发依赖已经齐全。让我们创建项目的基础结构。4. 搭建项目骨架与基础配置首先创建必要的目录和入口文件vue3-from-scratch/ ├── public/ # 静态资源目录会被直接复制到构建输出目录 ├── src/ # 源代码目录 │ ├── App.vue # 应用根组件 │ └── main.js # 应用入口文件 ├── index.html # 页面入口HTML ├── package.json └── vite.config.js # Vite配置文件4.1 配置index.html这是应用的页面入口。关键点在于我们需要一个div idapp/div作为Vue应用的挂载点并通过script typemodule引入我们的入口JS文件。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleVue3 From Scratch/title /head body div idapp/div script typemodule src/src/main.js/script /body /html4.2 编写src/main.js这是JavaScript的入口文件。在这里我们导入Vue和根组件并创建Vue应用实例。import { createApp } from vue import App from ./App.vue createApp(App).mount(#app)4.3 编写src/App.vue这是我们的第一个单文件组件采用Vue3的script setup语法这是目前最推荐、最简洁的组合式API写法。template div h1Hello, Vue3 From Scratch!/h1 p这是一个完全不依赖脚手架从零搭建的项目。/p /div /template script setup // 这里可以导入其他组件或逻辑 /script style scoped h1 { color: #42b983; } /style4.4 配置vite.config.js这是Vite的核心配置文件。我们需要引入vitejs/plugin-vue来让Vite处理.vue文件。import { defineConfig } from vite import vue from vitejs/plugin-vue // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()] })至此一个最最基础的Vue3项目骨架就完成了。在package.json的scripts中添加启动命令scripts: { dev: vite, build: vite build, preview: vite preview }运行npm run dev打开浏览器访问http://localhost:5173你应该能看到绿色的“Hello, Vue3 From Scratch!”字样。恭喜你已经成功迈出了第一步5. 工程化深化路由、状态管理与代码规范一个“过得去”的项目不能只是一个Hello World。接下来我们为其注入现代前端应用的灵魂路由和状态管理。5.1 集成Vue Router对于单页面应用SPA路由是必不可少的。我们安装Vue Router 4对应Vue3的版本npm install vue-router4在src目录下创建router/index.js文件来配置路由import { createRouter, createWebHistory } from vue-router // 定义路由组件这里先使用懒加载提升首屏性能 const Home () import(../views/Home.vue) const About () import(../views/About.vue) const routes [ { path: /, component: Home }, { path: /about, component: About } ] const router createRouter({ history: createWebHistory(), routes }) export default router然后在main.js中安装路由import { createApp } from vue import App from ./App.vue import router from ./router createApp(App).use(router).mount(#app)最后修改App.vue加入router-view来显示路由组件并添加导航template div nav router-link to/Home/router-link | router-link to/aboutAbout/router-link /nav router-view / /div /template别忘了创建对应的src/views/Home.vue和src/views/About.vue组件。5.2 集成Pinia进行状态管理对于复杂应用组件间的状态共享是个问题。Vuex 4虽然可用但Pinia是Vue官方推荐的新一代状态管理库API更简洁且完美支持TypeScript。我们选择Pinia。npm install pinia在src目录下创建stores目录并创建一个示例store例如src/stores/counter.jsimport { defineStore } from pinia export const useCounterStore defineStore(counter, { state: () ({ count: 0 }), actions: { increment() { this.count } }, getters: { doubleCount: (state) state.count * 2 } })在main.js中安装Piniaimport { createApp } from vue import { createPinia } from pinia import App from ./App.vue import router from ./router const app createApp(App) app.use(createPinia()) app.use(router) app.mount(#app)现在你就可以在任何组件中通过const counterStore useCounterStore()来使用这个store了。5.3 引入ESLint和Prettier统一代码风格团队协作和代码维护离不开统一的代码规范。ESLint负责检查代码质量问题Prettier负责代码格式化。首先安装相关依赖npm install eslint eslint-plugin-vue typescript-eslint/parser typescript-eslint/eslint-plugin prettier eslint-config-prettier eslint-plugin-prettier -D注意这里我们一并考虑了未来可能使用TypeScript的情况所以安装了typescript-eslint相关的包。如果确定只用JavaScript可以暂时不装。创建.eslintrc.js配置文件module.exports { root: true, env: { node: true, browser: true, es2021: true }, extends: [ eslint:recommended, plugin:vue/vue3-recommended, // 使用Vue3的推荐规则 plugin:prettier/recommended // 将Prettier规则集成进ESLint ], parserOptions: { ecmaVersion: latest, sourceType: module }, rules: { // 可以在这里覆盖或添加自定义规则 vue/multi-word-component-names: off // 允许单个单词的组件名如Home.vue } }创建.prettierrc配置文件{ semi: false, singleQuote: true, trailingComma: none, printWidth: 100, tabWidth: 2, endOfLine: auto }在package.json中添加lint和format脚本scripts: { dev: vite, build: vite build, preview: vite preview, lint: eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore, format: prettier --write . }现在运行npm run lint可以自动修复大部分代码风格问题npm run format可以用Prettier格式化所有文件。6. 开发体验与生产优化配置6.1 配置路径别名Alias在import模块时../../../这种相对路径非常难以维护。Vite允许我们配置路径别名。修改vite.config.jsimport { defineConfig } from vite import vue from vitejs/plugin-vue import path from path export default defineConfig({ plugins: [vue()], resolve: { alias: { : path.resolve(__dirname, ./src) // 将 指向 src 目录 } } })同时为了让ESLint和TypeScript如果使用能识别这个别名需要在项目根目录创建jsconfig.json对于JS项目或tsconfig.json对于TS项目。jsconfig.json示例{ compilerOptions: { baseUrl: ., paths: { /*: [src/*] } }, exclude: [node_modules, dist] }现在在代码中就可以使用import HelloWorld from /components/HelloWorld.vue这样的清晰路径了。6.2 环境变量管理不同环境开发、测试、生产需要不同的配置如API地址。Vite使用.env文件来管理环境变量。.env所有环境共享.env.development开发环境npm run dev时自动加载.env.production生产环境npm run build时自动加载创建一个.env.development文件VITE_API_BASE_URLhttp://localhost:3000/api重要Vite规定只有以VITE_开头的变量才会被暴露给客户端代码。这是出于安全考虑避免敏感信息泄露。在代码中可以通过import.meta.env.VITE_API_BASE_URL来访问这个变量。6.3 生产构建优化Vite的默认构建配置已经不错但我们还可以进行一些微调。分包策略ManualChunks将node_modules中的依赖打包成单独的chunk避免业务代码变更导致整个vendor缓存失效。资源内联/压缩对极小的资源如图标进行Base64内联减少HTTP请求。一个优化后的vite.config.js生产构建部分示例如下import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path export default defineConfig({ plugins: [vue()], resolve: { alias: { : path.resolve(__dirname, ./src) } }, build: { rollupOptions: { output: { manualChunks(id) { if (id.includes(node_modules)) { // 将vue相关的库拆分成一个chunk if (id.includes(vue)) { return vue-vendor } // 将其他的node_modules依赖拆分成一个chunk return vendor } } } }, // 启用/禁用 CSS 代码拆分 cssCodeSplit: true, // 构建后生成资源的目录 assetsDir: static, // 小于此阈值的资源将被内联为 base64 assetsInlineLimit: 4096 } })7. 样式方案、组件库与测试接入可选但推荐7.1 选择CSS预处理器虽然可以直接写CSS但Sass/Less等预处理器能提供变量、嵌套、混合等强大功能。以Sass为例npm install sass -D安装后就可以在.vue文件的style langscss中直接使用Sass语法了。你还可以在vite.config.js中配置全局的Sass变量文件。7.2 按需引入UI组件库对于一个需要快速开发的项目引入一个成熟的UI组件库如Element Plus、Ant Design Vue、Naive UI是明智的选择。但全量引入会显著增加打包体积。我们必须掌握按需引入。以Element Plus为例首先安装npm install element-plus然后我们需要安装用于自动按需导入的插件npm install -D unplugin-vue-components unplugin-auto-import修改vite.config.jsimport { defineConfig } from vite import vue from vitejs/plugin-vue import AutoImport from unplugin-auto-import/vite import Components from unplugin-vue-components/vite import { ElementPlusResolver } from unplugin-vue-components/resolvers export default defineConfig({ plugins: [ vue(), // 自动导入API如ref, reactive, onMounted等 AutoImport({ resolvers: [ElementPlusResolver()], }), // 自动导入UI组件 Components({ resolvers: [ElementPlusResolver()], }), ], })配置完成后你就可以在模板中直接使用el-button等Element Plus组件而无需在组件内手动import和app.use。插件会在构建时自动处理按需引入极大地提升了开发体验。7.3 集成单元测试VitestVite生态下首推的测试框架是Vitest它拥有和Vite相同的配置、转换器和解析器速度极快。安装Vitest和Vue测试工具npm install vitest vue/test-utils jsdom -D在package.json中添加测试脚本scripts: { test: vitest, coverage: vitest run --coverage }创建vitest.config.js其配置可以与vite.config.js大部分共享import { defineConfig } from vitest/config import vue from vitejs/plugin-vue export default defineConfig({ plugins: [vue()], test: { environment: jsdom, // 模拟浏览器环境 } })然后你就可以在src目录下创建__tests__文件夹来编写你的组件单元测试了。8. 部署上线与持续集成思路项目构建完成后会生成一个dist目录里面是静态文件HTML, JS, CSS, 图片等。部署的本质就是将这些文件放到一个HTTP服务器上。8.1 简单的静态服务器部署你可以使用任何静态文件服务器如Nginx、Apache或者云服务商的对象存储如阿里云OSS、腾讯云COS配合CDN。以Nginx为例一个最简单的配置如下server { listen 80; server_name your-domain.com; root /path/to/your/dist; index index.html; location / { try_files $uri $uri/ /index.html; # 支持Vue Router的history模式 } }关键点是try_files $uri $uri/ /index.html;它确保了在直接访问子路由如/about时Nginx会返回index.html然后由前端的Vue Router来处理路由而不是返回404。8.2 自动化部署与CI/CD对于团队项目手动上传dist文件夹是不可靠的。我们可以结合Git和CI/CD工具如GitHub Actions, GitLab CI, Jenkins实现自动化部署。一个简单的GitHub Actions工作流示例.github/workflows/deploy.ymlname: Deploy to Production on: push: branches: [ main ] jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Setup Node.js uses: actions/setup-nodev3 with: node-version: 18 - name: Install Dependencies run: npm ci - name: Lint run: npm run lint - name: Build run: npm run build env: VITE_API_BASE_URL: ${{ secrets.PROD_API_URL }} - name: Deploy to Server via SSH uses: appleboy/ssh-actionv0.1.5 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /path/to/your/project git pull origin main npm ci --onlyproduction npm run build # 这里可以加上重启Nginx或PM2的命令这个工作流会在代码推送到main分支时自动触发执行安装依赖、代码检查、构建并通过SSH连接到服务器进行部署。走完这一整套流程你已经不仅仅是从零搭建了一个Vue3项目而是亲手铺设了一条从本地开发、代码规范、测试到自动化部署的完整前端工程化流水线。这个过程可能会遇到各种报错和配置冲突但每一次解决问题的经历都会让你对“前端项目”这四个字有更深的理解。下次再看到脚手架生成的那一堆文件你就能清晰地知道每一行配置的意图这才是真正的“过得去”。

相关新闻

Python生成器与Yield原理及工程实践

Python生成器与Yield原理及工程实践

1. 生成器与Yield的本质解析1.1 生成器的运行机制生成器本质上是一个特殊的迭代器,但它的执行流程与传统函数截然不同。当调用生成器函数时,Python并不会立即执行函数体,而是返回一个生成器对象。这个对象保存了当前执行状态(包括…

2026/8/11 6:13:05 阅读更多 →
AI-Shoujo HF Patch:一站式模组整合解决方案与安装指南

AI-Shoujo HF Patch:一站式模组整合解决方案与安装指南

1. 项目概述:什么是AI-Shoujo HF Patch? 如果你玩过AI-Shoujo(或者它的姐妹作AI-Syoujyo、AI-Girl),大概率会遇到一个头疼的问题:游戏原版功能有限,社区里海量的角色卡(Character Ca…

2026/8/11 6:13:05 阅读更多 →
Unity虚拟摇杆插件Joystick Pack:5分钟集成移动端游戏输入控制

Unity虚拟摇杆插件Joystick Pack:5分钟集成移动端游戏输入控制

1. 项目概述与核心价值 在移动端游戏开发里,虚拟摇杆是玩家与游戏世界交互的基石。一个手感流畅、响应精准的摇杆,能直接决定一款动作或RPG手游的操作上限和玩家留存率。很多刚入行的朋友,包括我自己早期,都尝试过从零手写摇杆逻辑…

2026/8/11 6:13:05 阅读更多 →

最新新闻

DDrawCompat终极指南:3分钟让经典Windows游戏在现代系统重获新生

DDrawCompat终极指南:3分钟让经典Windows游戏在现代系统重获新生

DDrawCompat终极指南:3分钟让经典Windows游戏在现代系统重获新生 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors…

2026/8/11 11:25:11 阅读更多 →
addr2line怎么使用

addr2line怎么使用

addr2line 是 GNU binutils 工具集中的一个实用程序,它的核心功能是将程序地址或符号+偏移量转换成对应的源文件名和行号。这在调试程序崩溃、分析堆栈跟踪时非常有用。 基本语法 addr2line [选项] 地址... 地址:可以是一个或多个十六进制内存地址。 [选项]:用于控制输出内…

2026/8/11 11:25:11 阅读更多 →
单节 or 双节?电推剪锂电池升压芯片选型避坑指南(附:FP6277/6296/6298规格书)

单节 or 双节?电推剪锂电池升压芯片选型避坑指南(附:FP6277/6296/6298规格书)

电推剪通常使用锂电池(单节2.8-4.2V或双节5.6-8.4V)供电,但驱动电机需要更高电压(如5V、9V、12V)。升压(Boost)芯片是实现此电压转换的关键。选型需重点考虑输入电压范围(匹配电池&a…

2026/8/11 11:25:11 阅读更多 →
5分钟掌握Adobe全家桶免费激活:GenP破解补丁终极指南

5分钟掌握Adobe全家桶免费激活:GenP破解补丁终极指南

5分钟掌握Adobe全家桶免费激活:GenP破解补丁终极指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud的高昂订阅费用烦恼吗&…

2026/8/11 11:25:11 阅读更多 →
Unity与Unreal Engine深度对比:如何根据项目需求选择游戏引擎

Unity与Unreal Engine深度对比:如何根据项目需求选择游戏引擎

1. 项目概述:一场关于“引擎”的抉择在游戏开发的世界里,选择第一个引擎,就像选择你的第一把趁手的兵器。它决定了你未来很长一段时间的战斗风格、成长路径,甚至是你作品的“基因”。Unity和Unreal Engine(虚幻引擎&am…

2026/8/11 11:25:11 阅读更多 →
把蓝绿光和红光分开:设计 45° 二向色分光镜

把蓝绿光和红光分开:设计 45° 二向色分光镜

在荧光成像、投影和多波段测量中,经常需要让 45 入射的蓝绿光转向,同时让红光继续前进。二向色分光镜是由多层透明薄膜组成的分光元件:它利用干涉选择性地反射一段波长、透过另一段波长,而不是靠吸收丢掉其中一束光。 本教程使用…

2026/8/11 11:24:11 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →