VUE3套用组件库快速开发(以Element Plus为例)一
预备知识
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
整个流程步骤
- npm create vue@latest
# 安装 Element Plus 和 图标库
npm install element-plus @element-plus/icons-vue
# 安装按需导入工具(这样你写代码最省心,为了让你不用每次都手动写 import)
# 如果全局导入会在编译的时候将整个组件库都构建成三剑客。所以这里按需导入会提高用户的加载速度。
npm install -D unplugin-vue-components unplugin-auto-import
- 打开项目根目录下的 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 的根目录。它就像一个**“一键回家”**的快捷键。
- 配置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.vue或AboutView.vue是“画作”:它们是画框里不断更换的内容。
案例说明:
场景: 用户在刷学习论坛。
表现: 无论用户是在“看帖子列表”还是“写新帖子”,顶部的“学习论坛” Logo 和用户的“用户头像”通常是永远在那里的。
原理: Logo 和头像写在App.vue里;而中间那一块具体显示什么,由路由(Router)决定。
关键标签:<RouterView />
在 App.vue 里一定能看到一个 <RouterView /> 标签。这个标签就是**“内容投放区”**。
当用户访问不同的网址时,Vue Router 会像“投屏”一样:
- 访问
/把HomeView.vue投射到<RouterView />的位置。 - 访问
/about把AboutView.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,会遇到两个大麻烦:
- 无法切换页面:当用户点击“关于我们”时,首页的内容依然赖在那里不走。
- 代码臃肿:随着论坛功能变多(发帖、个人中心、消息通知),
App.vue会变成一个几千行的“代码怪兽”,根本没法维护。
一个项目现在的样子**
index.html:整个网站的“入场券”,浏览器只认它。main.js:搬运工。它把 Vue、Element Plus 还有我们的App.vue全部揉在一起,塞进index.html。App.vue:网站的“总外壳”,定义了导航栏和页面排版。src/views/文件夹:各个房间(首页、关于页、发帖页)。
更多推荐
所有评论(0)