查找插件:
需要用到的插件数组。
Vite Rollup 插件, 兼容的 Rollup 插件
unplugin, 用于构建工具的统一插件系统。
官方插件:
@vitejs/plugin-vue
- 提供
Vue 3单文件组件支持。
@vitejs/plugin-vue-jsx
- 提供
Vue 3 JSX支持(通过 专用的 Babel 转换插件)。
@vitejs/plugin-vue2
- 提供对
Vue 2的单文件组件支持。
@vitejs/plugin-react
- 使用
esbuild和Babel,使用一个微小体积的包脚注可以实现极速的HMR,同时提升灵活性,能够使用Babel的转换管线。在构建时没有使用额外的Babel插件,只使用了esbuild。
@vitejs/plugin-react-swc
- 在开发时会将
Babel替换为SWC。在构建时,若使用了插件则会使用SWC+esbuild,若没有使用插件则仅会用到esbuild。对不需要标准React扩展的大型项目,冷启动和模块热替换(HMR)将会有显著提升。
@vitejs/plugin-legacy
- 为打包后的文件提供传统浏览器兼容性支持。
常用插件:
vite-alias
-
针对 vite4 做别名自动生成
-
安装:
npm i vite-aliases -D -
使用:
// vite.config.js import { ViteAliases } from 'vite-aliases' export default { plugins: [ ViteAliases() ] }; -
Note:
把这个添加到
package.json(插件仅适用于ESM);{ "type": "module" }但是,这有可能会影响到其它非 ESM 包的使用;
解决办法:
- 方式1:显示从
node_modules引入
// vite.config.js import { ViteAliases } from './node_modules/vite-aliases' // 此时使用的 version: "vite-aliases": "^0.11.0",- 方式2:降级
vite-aliases版本;
// vite.config.js import { ViteAliases } from 'vite-aliases' // 此时使用的 version: "vite-aliases": "0.9.2" - 方式1:显示从
unplugin-vue-components
- 组件自动按需导入。
- 安装:
npm i unplugin-vue-components -D - 使用:
import Components from 'unplugin-vue-components/vite'
// ui库解析器,也可以自定义,需要安装相关UI库,unplugin-vue-components/resolvers
// 提供了以下集中解析器,使用的时候,需要安装对应的UI库,这里以vant示例
// 注释的是包含的其他一些常用组件库,供参考
import {
// ElementPlusResolver,
// AntDesignVueResolver,
VantResolver,
// HeadlessUiResolver,
// ElementUiResolver
} from 'unplugin-vue-components/resolvers'
export default ({ mode }) => defineConfig({
plugins: [
Components({
dirs: ['src/components'], // 目标文件夹
extensions: ['vue','jsx'], // 文件类型
dts: 'src/components.d.ts', // 输出文件,里面都是一些import的组件键值对
// ui库解析器,也可以自定义,需要安装相关UI库
resolvers: [
VantResolver(),
// ElementPlusResolver(),
// AntDesignVueResolver(),
// HeadlessUiResolver(),
// ElementUiResolver()
],
})
]
})
- [NOTE]: 原先引用组件的时候需要在目标文件里面
import相关组件,现在就可以直接使用无需在目标文件import了,注意大小写,组件都是大写开始的。
vite-plugin-style-import
- 当你使用
unplugin-vue-components来引入ui库的时候,message,notification,toast等引入样式不生效。使用vite-plugin-style-import,实现message,notification,toast等样式的自动引入; - 安装:
npm i vite-plugin-style-import -D - 使用:
plugins: [
createStyleImportPlugin({
resolves: [
// VantResolve(), // 符合规范的用 *Resolve() function 即可
],
libs: [
{
libraryName: 'vant',
esModule: false,
// 不符合规范的话,就要用到 lib.resolveStyle 去处理了,
// 如下 针对 vant4 的 toast style 样式的按需导入处理
resolveStyle: (name) => {
// return `vant/es/${name}/style`;
if (/\w+-toast/.test(name)) return `vant/es/toast/style`;
},
},
],
]
unplugin-auto-import
-
为
Vite,Webpack,Rollup和esbuild, 按需自动导入api, 有TypeScript支持。由unplugin提供。 -
安装:
npm i -D unplugin-auto-import -
使用:
用前:
import { computed, ref } from 'vue' const count = ref(0) const doubled = computed(() => count.value * 2)用后:
const count = ref(0) const doubled = computed(() => count.value * 2)
vite-plugin-svg-icons
- 用于生成 svg 雪碧图.
- 安装:
npm i vite-plugin-svg-icons -D - 使用:
=> vite.config.js 配置 vite-plugin-svg-icons:
// vite.config.js
import { resolve } from 'node:path'
// svg-icon插件
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
export default defineConfig(({command, mode})=>{
return {
// ...其他配置
plugins:[
// ...其他配置
createSvgIconsPlugin({
// 指定需要缓存的图标文件夹目录
iconDirs: [resolve(process.cwd(), 'src/assets/svgIcons')],
// 指定symbolId格式
symbolId: 'icon-[dir]-[name]',
//svgo额外配置,具体配置参考 https://github.com/svg/svgo
svgoOptions: {
plugins: [
{
// 移除 svg 原来的属性,解决后续我们组件给传值不生效问题
// 如果你能保证使用的 svg 都颜色等已经调整好的,后续不需要手动修改,那就不需要此项配置了
name: 'removeAttrs',
params: { attrs: ['class', 'data-name', 'fill', 'stroke'] }
}
]
}
})
]
}
})
=> 导入虚拟资源:
// main.js
import 'virtual:svg-icons-register';
=> 创建 公共组件 SvgIcon.vue:
<template>
<svg :class="svgClass" v-bind="$attrs" :style="{ color: color }">
<use :xlink:href="iconName" />
</svg>
</template>
<script setup>
import { defineProps, computed } from 'vue'
const props = defineProps({
name: {
type: String,
required: true
},
color: {
type: String,
default: 'red'
}
})
const iconName = computed(() => `#icon-${props.name}`)
const svgClass = computed(() => {
if (props.name) return `svg-icon icon-${props.name}`
return 'svg-icon'
})
</script>
<style lang="less">
.svg-icon {
display: inline-block;
width: 1em;
height: 1em;
fill: currentColor;
vertical-align: middle;
overflow: hidden;
}
</style>
=> 导入 SvgIcon.vue;
- 可以作为全局组件导入;
import SvgIcon from '@/components/SvgIcon'
// ...其他
app.component('svg-icon', SvgIcon)
- 使用
unplugin-vue-components配置按需导入, 参考官网 unplugin-vue-components;
=> 使用公共组件 SvgIcon.vue:
<svg-icon name="bed-king" color="green"></svg-icon>
<svg-icon name="car-standard"></svg-icon>
<svg-icon name="car-standard-16"></svg-icon>
<svg-icon name="vip"></svg-icon>
vite-plugin-html
-
功能:
- HTML 压缩能力
- EJS 模版能力
- 多页应用支持
- 支持自定义
entry - 支持自定义
template
-
安装:
npm i vite-plugin-svg-icons -D -
使用:
// index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" href="./favicon.ico" /> <link rel="stylesheet" href="./public/reset.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"> <title><%- title %></title> </head> <body> <div id="app"></div> <%- injectScript %> </body> </html>如:如搭配
.env环境文件,做index.html做动态数据注入,如下:// vite.config.js import { defineConfig,loadEnv} from 'vite' import { createHtmlPlugin } from 'vite-plugin-html' export default ({ mode }) => defineConfig({ // mode 环境变量名,若配置有.env.test,启动时 --mode test,这里的mode就是test plugins: [ createHtmlPlugin({ minify: true, /** * 在这里写entry后,你将不需要在`index.html`内添加 script 标签,原有标签需要删除 * [注]:这个 entry 要用绝对路径,相对路径会报错! * @default src/main.ts */ // entry: 'src/main.js', entry: path.resolve(process.cwd(), 'src/main.js'), /** * 如果你想将 `index.html`存放在指定文件夹,可以修改它,否则不需要配置 * [注]: 这个 template,必须在没有root配置的情况下配置,而且使用绝对路径会注入失败!会找不到 index.html 页面, public 文件夹也会被干掉; * @default index.html */ // template: path.resolve(process.cwd(), 'public/index.html'), // 使用绝对路径,会找不到 index.html 页面 template: 'public/index.html', /** * 需要注入 index.html ejs 模版的数据 */ inject: { data: { title: 'index', injectScript: `<script src="./inject.js"></script>`, }, tags: [ { injectTo: 'body-prepend', tag: 'div', attrs: { id: 'tag', }, }, ], } }) ] }) -
【NOTE】:
- 在多页面应用中,如果指定了root,vite-plugin-html会报错, 类似问题:github-issue#53
entry指定为绝对路径,如果指定的是 相对路径build时会报错;vite-plugin-html配置项中的 template,必须在没有root配置的情况下配置,而且使用resolve绝对路径会注入失败!会找不到 index.html 页面, public 文件夹也会被干掉;
vite-plugin-compression
- 功能:使用
gzip或者brotli来压缩资源. - 安装:
npm i vite-plugin-compression -D - 使用:
// vite.config.js import viteCompression from 'vite-plugin-compression'; export default () => { return { plugins: [viteCompression()], }; };
vite-plugin-vue-setup-name-support
-
功能:
vue3 setup语法糖默认是没有name属性的,它的作用就是 使vue3 setup语法糖支持name属性。在我们使用keep-alive的时候需要用到name。 -
安装:
npm i vite-plugin-vue-setup-extend -D -
使用:
// vite.config.js import { defineConfig, Plugin } from 'vite' import vue from '@vitejs/plugin-vue' import vueSetupExtend from 'vite-plugin-vue-setup-extend' export default defineConfig({ plugins: [vue(), vueSetupExtend()], })// SFC(单文件组件) <template> <div>hello world {{ a }}</div> </template> <script lang="ts" setup name="App"> const a = 1 </script> -
[NOTE]: 一般在
@vitejs/plugin-vue插件之后使用;
vite-plugin-cp
- 功能:在构建包之后复制文件。
- 安装:
npm install vite-plugin-cp --save-dev - 使用:
效果:import cp from 'vite-plugin-cp'; export default defineConfig({ plugins: [ cp({ targets: [ { src: '../../node_modules/three/build/three.min.js', dest: './dist' } ] }) ] });├── dist │ ├── three.min.js