vite插件
vite-plugin-svg-icon
当你使用该插件的时候,指定好存放svg
的文件夹。再按照指定的方式去访问svg图片。就可以再不产生http请求的情况下渲染出svg
图片。
使用该插件时,插件会自动将所有svg图片加载到HTML
中。并且每一个svg将会被过滤去无用的信息数据。让svg达到最小的值。之后使用svg图片就只需要操作DOM
即可,而不需要发送http
请求。
安装
yarn add vite-plugin-svg-icons --dev
创建配置
build\vite\plugin\svgSprite.ts
/**
* Vite Plugin for fast creating SVG sprites.
* https://github.com/anncwb/vite-plugin-svg-icons
*/
import SvgIconsPlugin from 'vite-plugin-svg-icons';
import path from 'path';
export function configSvgIconsPlugin(isBuild: boolean) {
const svgIconsPlugin = SvgIconsPlugin({
// ↓本地svg图片地址
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
svgoOptions: isBuild,
// 图标ID的样式
symbolId: 'icon-[dir]-[name]',
});
return svgIconsPlugin;
}
用于配置
// ...
import { configSvgIconsPlugin } from './svgSprite';
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
// ...
// vite-plugin-svg-icons
vitePlugins.push(configSvgIconsPlugin(isBuild));
// ...
return vitePlugins;
}
main导入
src\main.ts
// ...
import 'vite-plugin-svg-icons/register';
// ...
创建Svg组件
src\components\Icon\index.ts
import SvgIcon from './src/SvgIcon.vue';
export { Icon, IconPicker, SvgIcon };
src\components\Icon\src\SvgIcon.vue
<template>
<svg class="vben-svg-icon" :class="[$attrs.class]" :style="getStyle" aria-hidden="true">
<use :xlink:href="symbolId" />
</svg>
</template>
<script lang="ts">
import type { CSSProperties } from 'vue';
import { defineComponent, computed } from 'vue';
// import { useDesign } from '/@/hooks/web/useDesign';
export default defineComponent({
name: 'SvgIcon',
props: {
prefix: {
type: String,
default: 'icon',
},
name: {
type: String,
required: true,
},
size: {
type: [Number, String],
default: 16,
},
},
setup(props) {
// const { prefixCls } = useDesign('svg-icon');
const symbolId = computed(() => `#${props.prefix}-${props.name}`);
const getStyle = computed(
(): CSSProperties => {
const { size } = props;
let s = `${size}`;
s = `${s.replace('px', '')}px`;
return {
width: s,
height: s,
};
}
);
// prefixCls,
return { symbolId, getStyle };
},
});
</script>
<style lang="less" scoped>
// @prefix-cls: ~'@{namespace}-svg-icon';
// .@{prefix-cls} {
.vben-svg-icon {
overflow: hidden;
vertical-align: -0.15em;
fill: currentColor;
}
</style>
vite-plugin-mock
localEnabled
控制mock开发环境是否启动。
如果生产环境想要使用mock,只有prodEnabled
为true
,injectCode
注入指定代码时才会生效。
yarn add mockjs
yarn add vite-plugin-mock -D
编写Mock用例mock\_util.ts
:里面封装的是数据请求结构类型。mock\_createProductionServer.ts
:用于配置生产环境动态Mock的js文件,文档中有说。
配置Mockbuild\vite\plugin\mock.ts
/**
* Mock plugin for development and production.
* https://github.com/anncwb/vite-plugin-mock
*/
import { viteMockServe } from 'vite-plugin-mock';
export function configMockPlugin(isBuild: boolean) {
return viteMockServe({
// ↓忽略以_开头的文件
ignore: /^\_/,
// ↓解析根目录下的mock文件夹
mockPath: 'mock',
localEnabled: !isBuild,
prodEnabled: isBuild,
injectCode: `
import { setupProdMockServer } from '../mock/_createProductionServer';
setupProdMockServer();
`,
});
}
配置进Vite
// ...
import { configMockPlugin } from './mock';
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean, pkg: any) {
// ...
// vite-plugin-mock
VITE_USE_MOCK && vitePlugins.push(configMockPlugin(isBuild));
return vitePlugins;
}
vite-plugin-purge-icons
高效的使用Iconify中所有的图标。
Iconify
各个版本插件的区别:
- Vue3版Iconify插件:使用时需要安装指定库的图标,然后静态引用。每一次引用都会产生一次http请求。
- PurgeIcons:将我们所使用的Iconify图标都已html的dom节点形式保存在html中,这样我们就可以不发送http请求就可以使用图标了。
- vite-plugin-purge-icons:就是Vite版的PurgeIcons。
安装
yarn add @iconify/iconify
yarn add vite-plugin-purge-icons @iconify/json --dev
配置Vite
build\vite\plugin\index.ts
// ...
import PurgeIcons from 'vite-plugin-purge-icons';
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
// ...
// vite-plugin-purge-icons
vitePlugins.push(PurgeIcons());
// ...
return vitePlugins;
}
vite-plugin-style-import
yarn add vite-plugin-style-import -D
配置插件
build\vite\plugin\styleImport.ts
/**
* Introduces component library styles on demand.
* https://github.com/anncwb/vite-plugin-style-import
*/
import styleImport from 'vite-plugin-style-import';
export function configStyleImportPlugin() {
// if (!isBuild) return [];
const pwaPlugin = styleImport({
libs: [
{
libraryName: 'ant-design-vue',
esModule: true,
resolveStyle: (name) => {
return `ant-design-vue/es/${name}/style/index`;
},
},
],
});
return pwaPlugin;
}
配置Vite
build\vite\plugin\index.ts
// ...
import { configStyleImportPlugin } from './styleImport';
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean, pkg: any) {
// ...
// vite-plugin-style-import
vitePlugins.push(configStyleImportPlugin());
return vitePlugins;
}
vite-plugin-imagemin
一个压缩图片资源的 vite 插件。
配置镜像
package.json
"resolutions": {
"//": "用于安装imagemin的依赖关系,因为中国可能没有安装imagemin。",
"bin-wrapper": "npm:bin-wrapper-china"
},
yarn add vite-plugin-imagemin -D
配置插件
build\vite\plugin\imagemin.ts
// Image resource files used to compress the output of the production environment
// https://github.com/anncwb/vite-plugin-imagemin
import viteImagemin from 'vite-plugin-imagemin';
export function configImageminPlugin() {
const plugin = viteImagemin({
gifsicle: {
optimizationLevel: 7,
interlaced: false,
},
optipng: {
optimizationLevel: 7,
},
webp: {
quality: 75,
},
mozjpeg: {
quality: 8,
},
pngquant: {
quality: [0.8, 0.9],
speed: 4,
},
svgo: {
plugins: [
{
removeViewBox: false,
},
{
removeEmptyAttrs: false,
},
],
},
});
return plugin;
}
配置Vite
build\vite\plugin\index.ts
// ...
import { configImageminPlugin } from './imagemin';
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean, pkg: any) {
// ...
if (isBuild) {
//vite-plugin-imagemin
VITE_USE_IMAGEMIN && vitePlugins.push(configImageminPlugin());
}
return vitePlugins;
}
vite-plugin-compression
yarn add vite-plugin-compression -D
配置插件
build\vite\plugin\compress.ts
/**
* Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated
* https://github.com/anncwb/vite-plugin-compression
*/
import type { Plugin } from 'vite';
import compressPlugin from 'vite-plugin-compression';
export function configCompressPlugin(compress: 'gzip' | 'brotli' | 'none'): Plugin | Plugin[] {
const compressList = compress.split(',');
const plugins: Plugin[] = [];
if (compressList.includes('gzip')) {
plugins.push(
compressPlugin({
ext: '.gz',
})
);
}
if (compressList.includes('brotli')) {
plugins.push(
compressPlugin({
ext: '.br',
algorithm: 'brotliCompress',
})
);
}
return plugins;
}
配置Vite
build\vite\plugin\index.ts
// ...
import { configCompressPlugin } from './compress';
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean, pkg: any) {
// ...
// The following plugins only work in the production environment
if (isBuild) {
// ...
// rollup-plugin-gzip
vitePlugins.push(configCompressPlugin(VITE_BUILD_COMPRESS));
}
return vitePlugins;
}
vite-plugin-pwa
yarn add vite-plugin-pwa -D
配置插件
build\vite\plugin\pwa.ts
/**
* Zero-config PWA for Vite
* https://github.com/antfu/vite-plugin-pwa
*/
import type { ViteEnv } from '../../utils';
import { VitePWA } from 'vite-plugin-pwa';
export function configPwaConfig(env: ViteEnv) {
const { VITE_USE_PWA, VITE_GLOB_APP_TITLE, VITE_GLOB_APP_SHORT_NAME } = env;
if (VITE_USE_PWA) {
// vite-plugin-pwa
const pwaPlugin = VitePWA({
manifest: {
name: VITE_GLOB_APP_TITLE,
short_name: VITE_GLOB_APP_SHORT_NAME,
icons: [
{
// ./表示public文件夹
src: './resource/img/pwa-192x192.png',
sizes: '192x192',
type: 'image/png',
},
{
src: './resource/img/pwa-512x512.png',
sizes: '512x512',
type: 'image/png',
},
],
},
});
return pwaPlugin;
}
return [];
}
配置Vite
build\vite\plugin\index.ts
// ...
import { configPwaConfig } from './pwa';
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean, pkg: any) {
// ...
// The following plugins only work in the production environment
if (isBuild) {
// ...
// vite-plugin-pwa
vitePlugins.push(configPwaConfig(viteEnv));
}
return vitePlugins;
}