�集
pnpm install element-plus -S
在main.ts入口文件中引入element-plus以及全局样式!
main.ts
element-plus
全局样式
import ElementUi from 'element-plus' import 'element-plus/dist/index.css' import App from './App.vue' const app = createApp(App) app.use(ElementUi)
全局引入会将所有的组件以及样式在入口文件进行引入,会影响打包速度以及体积大小!
全局引入
有的组件
样式
入口文件进行引入
影响打包速度以及体积大小!
按需引入,需要安装自动导入插件,来帮我们实现自动组件导入!
安装自动导入插件
实现自动组件导入
pnpm install -D unplugin-vue-components unplugin-auto-import unplugin-element-plus
插件地址,可以查看具体使用方式!
在vite中,引入引入两个自动导入组件插件!
vite
自动导入组件插件
import { fileURLToPath, URL } from 'node:url' import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import vueDevTools from 'vite-plugin-vue-devtools' import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' // https://vite.dev/config/ export default defineConfig({ plugins: [ vue(), vueDevTools(), // element plus 样式自动导入 ElementPlus({ useSource: true, }), // 配置自动导入,ref reactive 时自动导入vue AutoImport({ imports: ['vue', 'vue-router'], dts: true, resolvers: [ElementPlusResolver()], }), // 配置组件自动导入 Components({ dts: true, resolvers: [ElementPlusResolver()], extensions: ['vue'], dirs: ['src/components/'], }), ], })
配置 types 类型声明,在使用自动导入时,会帮我们创建两个声明文件,"auto-imports.d.ts", "components.d.ts"需要在 tsconfig.app.json 中加入两个声明文件!
配置 types 类型声明,在使用自动导入时,会帮我们创建两个声明文件,
types
使用自动导入
创建两个声明文件
"auto-imports.d.ts", "components.d.ts"
需要在 tsconfig.app.json 中加入两个声明文件!
tsconfig.app.json
{ "extends": "@vue/tsconfig/tsconfig.dom.json", "include": ["env.d.ts", "auto-imports.d.ts", "components.d.ts", "src/**/*", "src/**/*.vue"], "exclude": ["src/**/__tests__/*"], "compilerOptions": { "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", "noImplicitThis": true, "paths": { "@/*": ["./src/*"] } } }
加入声明文件后,对于unknow未知类型的标签,就会有对应的类型提示了
声明文件
unknow未知类型
对应的类型提示
封装常用的全局组件
全局icon组件, 需要安装的插件 vite-plugin-svg-icons | unplugin-icons
icon组件
vite-plugin-svg-icons | unplugin-icons
pnpm install -D vite-plugin-svg-icons | unplugin-icons
在vite.config.ts中引入插件,并配置icon路径!
vite.config.ts
配置icon路径
import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import vueDevTools from 'vite-plugin-vue-devtools' import Icons from 'unplugin-icons/vite' import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' export default defineConfig({ plugins: [ vue(), vueDevTools(), // 配置icons Icons({ autoInstall: true, }), createSvgIconsPlugin({ // 指定需要缓存的图标文件夹 iconDirs: [fileURLToPath(new URL('./src/icons', import.meta.url))], // 指定symbolId格式 symbolId: 'icon-[dir]-[name]', }), ], )}
创建svg-icon 组件,src -> components -> svg-icon -> index.vue
svg-icon 组件
src -> components -> svg-icon -> index.vue
<template> <svg aria-hidden="true" class="svg-icon" :style="'width:' + size + ';height:' + size"> <use :xlink:href="symbolId" :fill="color" /> </svg> </template> <script setup lang="ts" name="SvgIcon"> import { computed } from 'vue' const props = defineProps({ prefix: { type: String, default: 'icon', }, iconClass: { type: String, required: false, default: '', }, color: { type: String, default: '', }, size: { type: String, default: '1em', }, }) const symbolId = computed(() => `#${props.prefix}-${props.iconClass}`) </script> <style scoped> .svg-icon { display: inline-block; width: 1em; height: 1em; overflow: hidden; vertical-align: -0.15em; /* 因icon大小被设置为和字体大小一致,而span等标签的下边缘会和字体的基线对齐,故需设置一个往下的偏移比例,来纠正视觉上的未对齐效果 */ outline: none; fill: currentColor; /* 定义元素的颜色,currentColor是一个变量,这个变量的值就表示当前元素的color值,如果当前元素未设置color值,则从父元素继承 */ } </style>
在 src 目录下 -> 创建 icons 文件夹,用来存放 svg icon图标!
src
icons
存放 svg icon图标
三月 2025
icon
将public -> favicon.ico 替换成自己的Icon图标即可,若名字不同,则需要在index.html中进行路径和名称调整!
public -> favicon.ico
Icon图标
名字不同
index.html
路径和名称调整
tltle
同样在 index.html中修改 <title></title>标签中的内容即可!
修改 <title></title>标签
即可
路径别名
在vite.config.ts配置文件中,添加resolve路径解析对象来添加路径别名!
resolve路径解析对象
export default defineConfig({ plugins: [ vue(), vueDevTools(), ], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) }, }, })
editorconfig
EditorConfig 可以帮助在不同编辑器下的实现代码风格统一配置!
EditorConfig
不同编辑器
实现代码风格统一配置
root = true [*] # 表示所有文件 charset = utf-8 # 表示字符集编码 indent_style = space # 表示缩进风格 [tab | space] indent_size = 2 # 表示缩进大小 end_of_line = lf # 控制换行类型 [lf | cr | crlf ] trim_traling_whitespace = true # 去除行尾的空白字符 inset_final_newline = true # 始终在文件末尾插入新的一行 [*.md] # 表示 md 文档适用以下规则 max_line_length = off trim_traling_whitespace = false
vscode 需要安装EditorConfig插件!
vscode
prettier
prettier 是一个可配置的代码格式化工具,可以通过自定义格式配置,结合编辑器实现保存时自动格式化代码!
代码格式化工具
自定义格式配置
编辑器
保存
自动格式化代码
安装prettier插件:
pnpm i prettier -D
配置prettier:
新建 .prettierrc
.prettierrc
{ "useTabs": false, // 使用tab缩进还是空格缩进 "tabWidth": 2, // 缩进的大小 "printWidth": 100, // 当前行字符串的长度 "singleQuote": true, // 单引号还是双引号,true未单引号 "trailingComma": "none", // 对象属性末尾是否 追加逗号 "semi": false // 语句末尾是否添加 分号 }
配置prettier忽略文件:
新建 .prettierignore
.prettierignore
/dist/* /node_modules/** /build/* /public/* **/*.md **/*.svg
可结合 vscode 完成编写代码时,保存后自动格式化代码 ,首先需要在vscode扩展市场中安装插件然后使用alt+shift+f快捷方式来选择prettier进行代码格式化!配置保存代码时,自动格式化,在settings -> 搜索 format on save -> 勾选即可!设置默认格式化插件, 在settings -> 搜索 -> default format -> 选择默认格式化插件即可!
可结合 vscode 完成编写代码时,保存后自动格式化代码 ,首先需要在vscode扩展市场中安装插件
编写代码
安装插件
然后使用alt+shift+f快捷方式来选择prettier进行代码格式化!
alt+shift+f
选择prettier进行代码格式化!
配置保存代码时,自动格式化,在settings -> 搜索 format on save -> 勾选即可!
保存代码
自动格式化
settings
format on save
勾选即可
设置默认格式化插件, 在settings -> 搜索 -> default format -> 选择默认格式化插件即可!
默认格式化插件
default format
eslint
创建项目时,已经选择eslint插件使用,因此package.json中已经有了有eslint插件的安装!
创建项目
eslint插件
package.json
eslint 是一个代码语法检测工具,主要用来检测一些不规范的代码片段,会进行警告、报错 ,提示!
代码语法检测工具
检测
不规范的代码片段
警告、报错
在vscode中安装eslint扩展插件:
eslint扩展插件
它可以帮我们在编写代码时,来实时检测语法问题,并进行提示和反馈!
在编写代码
实时检测语法
进行提示和反馈
解决eslint和prettier插件冲突问题
prettier插件
在 main.ts 中导本地icons import 'virtual:svg-icons-register'
在 main.ts 中导本地icons
本地icons
import 'virtual:svg-icons-register'
import 'normalize.css' import '@/styles/index.scss' /* import ElementUi from 'element-plus' import 'element-plus/dist/index.css' */ import { createApp } from 'vue' import { setupPinia } from '@/stores/index.ts' import App from './App.vue' import router from './router' // 本地SVG图标 import 'virtual:svg-icons-register' const app = createApp(App) setupPinia(app) app.use(router) // app.use(ElementUi) app.mount('#app')
当通过 ref 来获取子组件实例类型时,通过InstanceType来定义该组件实例的类型!
ref
获取子组件实例类型
InstanceType
定义该组件实例的类型
<template> <div id="layout"> <el-container> <Sidebar ref="sidebarRef" /> <el-container class="is-vertical"> <Navbar /> <Main /> </el-container> </el-container> </div> </template> <script setup lang="ts"> import Navbar from './navbar/Navbar.vue' import Sidebar from './sidebar/Sidebar.vue' import Main from './main/Main.vue' const sidebarRef = ref<InstanceType<typeof Sidebar>>() </script> <style lang="scss" scoped></style>
以上获取Sidebar子组件实例,通过InstanceType来定义该组件实例类型!
Sidebar子组件实例
组件实例类型
const sidebarRef = ref<InstanceType<typeof Sidebar>>()