预备知识

vue和vite的关系是什么?

简单点理解,vite的作用是将vue代码编译成、构建成浏览器能看懂的代码(HTML.JS.CSS)
进一步的理解,vite是一个高级代码构建工具。所谓的构建工具,是可以利用、调用各种编译器来将vue3代码转成三剑客代码。这在个过程中,vite之所以在一众构建工具中脱颖而出,是因为其各种优秀的特性,例如模块搬运、热更新等,在此不展开了。

那么,npm create vue@latest和npm create vite@latest的区别是什么?

通俗的说

  • npm create vite@latest 就像是给你一个毛坯房,只搭建了最基础的结构(Vue 3 本身),剩下的家具(路由、状态管理)得你自己去买。

  • 特点: 极其干净。它只安装运行 Vue 3 所必须的最少文件。

  • 安装过程: 只会问你项目叫什么、用哪个框架(Vue/React)、是否用 TypeScript。

  • 案例说明: > 场景: 你只是想写一个简单的单页面表单或者个人介绍页

感受: 速度极快,几秒钟就建好了。但如果你之后需要做多页面的论坛,你需要自己去手动安装 Vue Router(路由)等各种插件。

  • npm create vue@latest 就像是给你一个精装修包,在搭建地基的同时,会问你要不要配空调、要不要配衣柜,一次性帮你把常用的工具全装好。
    这是 Vue 官方专门为 Vue 开发者设计的项目脚手架(内部其实也是基于 Vite 运行的)。

  • 特点: 交互式安装。它会像做调查问卷一样,问你是否需要添加各种“全家桶”成员。

  • 安装过程: 它会问你是否需要:

  • Vue Router(做多页面网站/论坛必选)

  • Pinia(管理全局数据,比如用户的登录状态,必选)

  • Vitest/Cypress(测试工具,新手通常选 No)

  • ESLint/Prettier(代码格式检查,建议选 Yes,帮你就养成良好的代码习惯)

像我这种新手建议选择 * npm create vue@latest

整个流程步骤

  1. npm create vue@latest
# 安装 Element Plus 和 图标库
npm install element-plus @element-plus/icons-vue
# 安装按需导入工具(这样你写代码最省心,为了让你不用每次都手动写 import)
# 如果全局导入会在编译的时候将整个组件库都构建成三剑客。所以这里按需导入会提高用户的加载速度。
npm install -D unplugin-vue-components unplugin-auto-import
  1. 打开项目根目录下的 vite.config.js,把内容修改为如下(这是为了让 Element Plus 的组件可以自动识别):
import { fileURLToPath, URL } from 'node:url'
import { 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(),
    AutoImport({ resolvers: [ElementPlusResolver()] }),
    Components({ resolvers: [ElementPlusResolver()] }),
  ],
  resolve: {
    alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) }
  }
})

解释:
fileURLToPath, URL: 这是 Node.js 自带的工具,就像是一个**“坐标转换器”**。因为不同电脑(Windows 或 Mac)的路径写法不同,它负责把复杂的网址路径转换成你电脑能认出来的文件夹路径。

defineConfig: 这是 Vite 的**“语法检查员”**。它本身不干活,但它能确保你写的配置格式是正确的,如果你写错了,它会立刻在编辑器里提醒你。

vue: 这是**“Vue 翻译官”**。没有它,Vite 就看不懂任何 .vue 结尾的文件。

AutoImport & Components: 这就是我们刚才聊的**“自动按需导入双子星”**。

AutoImport: 负责自动导入 Vue 的函数(比如 ref, computed)。

Components: 负责自动导入 Element Plus 的组件(比如 )。

ElementPlusResolver: 这是**“图书管理员”**。它专门告诉上面那两位专家:“如果你看到 el- 开头的标签,记得去 Element Plus 的仓库里找代码”。

插件中心 (plugins 数组)
这里是项目的**“自动化流水线”**。

plugins: [
  vue(), // 启用 Vue 翻译功能
  AutoImport({ resolvers: [ElementPlusResolver()] }), // 开启函数自动导入
  Components({ resolvers: [ElementPlusResolver()] }), // 开启组件自动导入
],

逻辑说明: 当 Vite 运行我们的项目时,它会把我们的代码传过这条流水线。
案例说明: > 场景: 我们的代码里写了一个 。
过程: Components 插件在流水线上看到了它,立刻询问 ElementPlusResolver(管理员):“这是谁家的?”。管理员回答:“是 Element Plus 的”。于是插件自动帮我们把表格的代码加了进来。

别名设置 (resolve.alias)
这部分是在设置项目的**“传送门”**。

alias: { 
  '@': fileURLToPath(new URL('./src', import.meta.url)) 
}

意思: 它把代码里的 @ 符号,等同于项目里的 src 文件夹。

案例说明: > 场景: =我们想在页面里引用一张图片,图片在 src/assets/logo.png。

如果没有别名: 可能要写 …/…/assets/logo.png(数几个点号非常痛苦)。 有了别名: 我们直接写 @/assets/logo.png。无论我们在哪个文件夹,@ 永远代表 src 的根目录。它就像一个**“一键回家”**的快捷键。

  1. 配置router/index.js
import { createRouter, createWebHistory } from 'vue-router'
// 使用 @ 别名,简洁且专业
import HomeView from '@/views/HomeView.vue'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      name: 'home',
      component: HomeView,
    },
    {
      path: '/about',
      name: 'about',
      component: () => import('@/views/AboutView.vue'),
    },
    // --- 新增:发帖页面的房间 ---
    {
      path: '/post',
      name: 'post',
      component: () => import('@/views/PostView.vue'), // 稍后我们要去新建这个文件
    },
  ],
})

export default router

解释

import { createRouter, createWebHistory } from 'vue-router'

从路由库里请出两个“大管家”。createRouter 负责创建导航系统,createWebHistory 负责让网址看起来像正常的 www.xxx.com/about,而不是带个丑丑的井号(如 /#/about)。

import HomeView from '../views/HomeView.vue'

提前加载:把首页直接搬进来。因为首页是用户一进来就要看的,所以要提前准备好。

history: createWebHistory(import.meta.env.BASE_URL)

历史记录管理:这行代码保证了用户可以点击浏览器的“后退”和“前进”按钮。BASE_URL 是为了防止用户把网站部署在子目录下(比如 www.xxx.com/my-forum/)时找不到路。

routes: [ ... ]

这就是**“房间分配表”**:

path: '/':当用户访问根域名(首页)时。

name: 'home':给这个房间起个名字,以后跳转时可以直接喊名字,不用记长长的路径。

component: HomeView:指定在这个位置显示哪个组件。

component: () => import('../views/AboutView.vue')

懒加载(重点!):这个写法很有趣。它告诉 Vite:“关于我们”这个页面先不用急着翻译和加载,只有当用户真的点击了“关于”链接时,才去临时加载它。这能进一步提升首屏速度。

补充一点

APP.VUE是干什么用的?

在router中可以看到,首页被定向到了view/HomeView.vue,而不是APP.VUE,那么app.vue的作用是什么呢?

在 Vue 的世界里,我们将这种结构称为 “单页面应用 (SPA)”。可以这样理解:

  • App.vue 是“画框”:它包含了一切固定不变的东西。比如网站顶部的导航栏、底部的版权信息、或者侧边栏。
  • HomeView.vueAboutView.vue 是“画作”:它们是画框里不断更换的内容。

案例说明:
场景: 用户在刷学习论坛。
表现: 无论用户是在“看帖子列表”还是“写新帖子”,顶部的“学习论坛” Logo 和用户的“用户头像”通常是永远在那里的。
原理: Logo 和头像写在 App.vue 里;而中间那一块具体显示什么,由路由(Router)决定。

关键标签:<RouterView />
App.vue 里一定能看到一个 <RouterView /> 标签。这个标签就是**“内容投放区”**。

当用户访问不同的网址时,Vue Router 会像“投屏”一样:

  • 访问 /HomeView.vue 投射到 <RouterView /> 的位置。
  • 访问 /aboutAboutView.vue 投射到 <RouterView /> 的位置。

App.vue 的真实代码结构

让我们看看一个标准的论坛 App.vue 应该长什么样(结合 Element Plus):

<template>
  <el-menu mode="horizontal" router>
    <el-menu-item index="/">首页</el-menu-item>
    <el-menu-item index="/post">去发帖</el-menu-item>
  </el-menu>

  <main style="padding: 20px;">
    <RouterView />
  </main>

  <footer style="text-align: center; color: #999;">
    © 2026 我的学习论坛
  </footer>
</template>

为什么不直接把首页写在 App.vue 里?
如果我们把首页内容全部挤在 App.vue,会遇到两个大麻烦:

  1. 无法切换页面:当用户点击“关于我们”时,首页的内容依然赖在那里不走。
  2. 代码臃肿:随着论坛功能变多(发帖、个人中心、消息通知),App.vue 会变成一个几千行的“代码怪兽”,根本没法维护。

一个项目现在的样子**

  1. index.html:整个网站的“入场券”,浏览器只认它。
  2. main.js:搬运工。它把 Vue、Element Plus 还有我们的 App.vue 全部揉在一起,塞进 index.html
  3. App.vue:网站的“总外壳”,定义了导航栏和页面排版。
  4. src/views/ 文件夹:各个房间(首页、关于页、发帖页)。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐