前端框架搭建(四)改造导入项目插件流程【vite】
创始人
2024-04-23 07:30:03
0

1.改造为函数

默认模板创建的vite.config.ts文件是这样的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-de7n3OoX-1670997988868)(assets/image-20221214132741-lbgi0ky.png)]

我们在上一节也提到过,这样将使得vite的一些配置十分杂乱,无法统一进行管理,因此我们可以将其函数化

export default defineConfig(configEnv => {const viteEnv = loadEnv(configEnv.mode , process.cwd()) as unknown as ImportMetaEnvreturn{}
})

2.创建build文件夹——用于配置vite

  • config——用于配置vite相关(包括网络代理等)
  • plugins——项目有关插件
  • utils——与项目build配置相关工具

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ym9jTyvL-1670997988869)(assets/image-20221214133620-769qu7o.png)]

每个小模块都由对应的index.ts管理

最大级的index

export * from './plugins';
export * from './config';
export * from './utils';

utils-index

获取相关路由

import path from 'path';/*** 获取项目根路径* @descrition 末尾不带斜杠*/
export function getRootPath() {return path.resolve(process.cwd());
}/*** 获取项目src路径* @param srcName - src目录名称(默认: "src")* @descrition 末尾不带斜杠*/
export function getSrcPath(srcName = 'src') {const rootPath = getRootPath();return `${rootPath}/${srcName}`;
}

3.完成插件配置

build -> plugins目录下创建unplugin.ts文件,用于插件的解析

根据报错安装对应的依赖即可

  • 自动生成component.d.ts
  • 自动下载icon
  • 解析本地icon-svg
import Icons from 'unplugin-icons/vite';
import IconsResolver from 'unplugin-icons/resolver';
import Components from 'unplugin-vue-components/vite';
import { NaiveUiResolver } from 'unplugin-vue-components/resolvers';
import { FileSystemIconLoader } from 'unplugin-icons/loaders';
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
import { getSrcPath } from '../utils';export default function unplugin(viteEnv: ImportMetaEnv) {const { VITE_ICON_PREFFIX, VITE_ICON_LOCAL_PREFFIX } = viteEnv;const srcPath = getSrcPath();const localIconPath = `${srcPath}/assets/svg-icon`;/** 本地svg图标集合名称 */const collectionName = VITE_ICON_LOCAL_PREFFIX.replace(`${VITE_ICON_PREFFIX}-`, '');return [Icons({compiler: 'vue3',customCollections: {[collectionName]: FileSystemIconLoader(localIconPath)},scale: 1,defaultClass: 'inline-block'}),Components({dts: 'src/typings/components.d.ts',types: [{ from: 'vue-router', names: ['RouterLink', 'RouterView'] }],resolvers: [NaiveUiResolver(),IconsResolver({ customCollections: [collectionName], componentPrefix: VITE_ICON_PREFFIX })]}),createSvgIconsPlugin({iconDirs: [localIconPath],symbolId: `${VITE_ICON_LOCAL_PREFFIX}-[dir]-[name]`,inject: 'body-last',customDomId: '__SVG_ICON_LOCAL__'})];
}

plugins-index

导入插件

import type { PluginOption } from 'vite';
import vue from '@vitejs/plugin-vue';
import unocss from '@unocss/vite';
import unplugin from './unplugin';/*** vite插件* @param viteEnv - 环境变量配置*/
export function setupVitePlugins(viteEnv: ImportMetaEnv): (PluginOption | PluginOption[])[] {const plugins = [vue(),...unplugin(viteEnv), unocss()];return plugins;}

创建env文件

在根目录创建env文件,设置vite环境变量

VITE_BASE_URL=/VITE_APP_NAME=Job-CollectVITE_APP_TITLE=作业管理系统# iconify图标作为组件的前缀
VITE_ICON_PREFFIX=icon# 本地SVG图标作为组件的前缀, 请注意一定要包含 VITE_ICON_PREFFIX
# 格式 {VITE_ICON_PREFFIX}-{本地图标集合名称}
VITE_ICON_LOCAL_PREFFIX=icon-local

4.完成vite.config.ts构建

import { defineConfig, loadEnv } from 'vite'
import { getRootPath, getSrcPath, setupVitePlugins } from './src/build';export default defineConfig(configEnv => {const viteEnv = loadEnv(configEnv.mode , process.cwd()) as unknown as ImportMetaEnvconst rootPath = getRootPath();const srcPath = getSrcPath();return{base: viteEnv.VITE_BASE_URL,resolve: {alias: {'~': rootPath,'@': srcPath,}},plugins: setupVitePlugins(viteEnv),server: {host: '0.0.0.0',port: 3200,open: true,},}
})
// // https://vitejs.dev/config/
// export default defineConfig({
//   plugins: [
//     vue(),
//     Unocss({ // 使用Unocss
//       presets: [
//         presetUno(),
//         presetAttributify(),
//         presetIcons()],
//     })
//   ],
// })

5.创建uno.config.ts

import { defineConfig } from '@unocss/vite';
import presetUno from '@unocss/preset-uno';export default defineConfig({exclude: ['node_modules', 'dist', '.git', '.husky', '.vscode', 'public', 'build', 'mock', './stats.html'],presets: [presetUno({ dark: 'class' })],shortcuts: {'wh-full': 'w-full h-full','flex-center': 'flex justify-center items-center','flex-col-center': 'flex-center flex-col','flex-x-center': 'flex justify-center','flex-y-center': 'flex items-center','i-flex-center': 'inline-flex justify-center items-center','i-flex-x-center': 'inline-flex justify-center','i-flex-y-center': 'inline-flex items-center','flex-col': 'flex flex-col','flex-col-stretch': 'flex-col items-stretch','i-flex-col': 'inline-flex flex-col','i-flex-col-stretch': 'i-flex-col items-stretch','flex-1-hidden': 'flex-1 overflow-hidden','absolute-lt': 'absolute left-0 top-0','absolute-lb': 'absolute left-0 bottom-0','absolute-rt': 'absolute right-0 top-0','absolute-rb': 'absolute right-0 bottom-0','absolute-tl': 'absolute-lt','absolute-tr': 'absolute-rt','absolute-bl': 'absolute-lb','absolute-br': 'absolute-rb','absolute-center': 'absolute-lt flex-center wh-full','fixed-lt': 'fixed left-0 top-0','fixed-lb': 'fixed left-0 bottom-0','fixed-rt': 'fixed right-0 top-0','fixed-rb': 'fixed right-0 bottom-0','fixed-tl': 'fixed-lt','fixed-tr': 'fixed-rt','fixed-bl': 'fixed-lb','fixed-br': 'fixed-rb','fixed-center': 'fixed-lt flex-center wh-full','nowrap-hidden': 'whitespace-nowrap overflow-hidden','ellipsis-text': 'nowrap-hidden overflow-ellipsis','transition-base': 'transition-all duration-300 ease-in-out'},theme: {colors: {primary: 'var(--primary-color)',primary_hover: 'var(--primary-color-hover)',primary_pressed: 'var(--primary-color-pressed)',primary_active: 'var(--primary-color-active)',info: 'var(--info-color)',info_hover: 'var(--info-color-hover)',info_pressed: 'var(--info-color-pressed)',info_active: 'var(--info-color-active)',success: 'var(--success-color)',success_hover: 'var(--success-color-hover)',success_pressed: 'var(--success-color-pressed)',success_active: 'var(--success-color-active)',warning: 'var(--warning-color)',warning_hover: 'var(--warning-color-hover)',warning_pressed: 'var(--warning-color-pressed)',warning_active: 'var(--warning-color-active)',error: 'var(--error-color)',error_hover: 'var(--error-color-hover)',error_pressed: 'var(--error-color-pressed)',error_active: 'var(--error-color-active)',dark: '#18181c'}}
});

最终效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tm0sYkU0-1670997988870)(assets/image-20221214140513-ke7m9cl.png)]

参考开源项目:GitHub - honghuangdc/soybean-admin: A fresh and elegant admin template, based on Vue3,Vite3,TypeScript,NaiveUI and UnoCSS [一个基于Vue3、Vite3、TypeScript、NaiveUI 和 UnoCSS的清新优雅的中后台模版]

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...