refactor: Modularize Vite plugin management

This commit is contained in:
CharleeWa 2024-02-08 15:14:51 +08:00
parent d81c970784
commit e2eaa643d5
3 changed files with 124 additions and 126 deletions

View File

@ -1,45 +1,66 @@
import path from 'node:path'
import { viteVConsole } from 'vite-plugin-vconsole'
import vue from '@vitejs/plugin-vue'
import legacy from '@vitejs/plugin-legacy'
import vueJsx from '@vitejs/plugin-vue-jsx'
import { visualizer } from 'rollup-plugin-visualizer'
import Components from 'unplugin-vue-components/vite'
import AutoImport from 'unplugin-auto-import/vite'
import VueRouter from 'unplugin-vue-router/vite'
import { VueRouterAutoImports } from 'unplugin-vue-router'
import { VantResolver } from 'unplugin-vue-components/resolvers'
import { unheadVueComposablesImports } from '@unhead/vue'
import VueDevTools from 'vite-plugin-vue-devtools'
import mockDevServerPlugin from 'vite-plugin-mock-dev-server'
import UnoCSS from 'unocss/vite'
import { createViteVConsole } from './vconsole'
// https://github.com/vadxq/vite-plugin-vconsole/issues/21
export function createVitePlugins() {
return [
VueRouter({
routesFolder: 'src/views',
dts: 'src/typed-router.d.ts',
}),
export function createViteVConsole(command: 'serve' | 'build') {
return viteVConsole({
entry: [path.resolve('src/main.ts')],
enabled: command === 'serve',
config: {
maxLogNumber: 1000,
theme: 'light',
},
dynamicConfig: {
theme: `document.documentElement.classList.contains('dark') ? 'dark' : 'light'`,
},
eventListener: `
const targetElement = document.querySelector('html'); // 择要监听的元素
const observerOptions = {
attributes: true, // 监听属性变化
attributeFilter: ['class'] // 只监听class属性变化
};
vue(),
vueJsx(),
visualizer(),
UnoCSS(),
mockDevServerPlugin(),
// 定义回调函数来处理观察到的变化
function handleAttributeChange(mutationsList) {
for(let mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
if (window && window.vConsole) {
window.vConsole.dynamicChange.value = new Date().getTime();
}
}
}
}
legacy({
targets: ['defaults', 'not IE 11'],
}),
// 创建观察者实例并传入回调函数
const observer = new MutationObserver(handleAttributeChange);
Components({
extensions: ['vue'],
resolvers: [VantResolver()],
include: [/\.vue$/, /\.vue\?vue/],
dts: 'src/components.d.ts',
}),
// 开始观察目标元素
observer.observe(targetElement, observerOptions);
AutoImport({
include: [
/\.[tj]sx?$/,
/\.vue$/,
/\.vue\?vue/,
],
imports: [
'vue',
'vitest',
'@vueuse/core',
VueRouterAutoImports,
{
'vue-router/auto': ['useLink'],
},
unheadVueComposablesImports,
],
dts: 'src/auto-imports.d.ts',
dirs: [
'src/composables',
],
}),
// 当不再需要观察时,停止观察
// observer.disconnect();
`,
})
createViteVConsole(),
VueDevTools(),
]
}

44
build/vite/vconsole.ts Normal file
View File

@ -0,0 +1,44 @@
import path from 'node:path'
import { viteVConsole } from 'vite-plugin-vconsole'
export function createViteVConsole() {
return viteVConsole({
entry: [path.resolve('src/main.ts')],
enabled: false,
config: {
maxLogNumber: 1000,
theme: 'light',
},
// https://github.com/vadxq/vite-plugin-vconsole/issues/21
dynamicConfig: {
theme: `document.documentElement.classList.contains('dark') ? 'dark' : 'light'`,
},
eventListener: `
const targetElement = document.querySelector('html'); // 择要监听的元素
const observerOptions = {
attributes: true, // 监听属性变化
attributeFilter: ['class'] // 只监听class属性变化
};
// 定义回调函数来处理观察到的变化
function handleAttributeChange(mutationsList) {
for(let mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
if (window && window.vConsole) {
window.vConsole.dynamicChange.value = new Date().getTime();
}
}
}
}
// 创建观察者实例并传入回调函数
const observer = new MutationObserver(handleAttributeChange);
// 开始观察目标元素
observer.observe(targetElement, observerOptions);
// 当不再需要观察时,停止观察
// observer.disconnect();
`,
})
}

View File

@ -2,84 +2,37 @@ import path from 'node:path'
import process from 'node:process'
import { loadEnv } from 'vite'
import type { ConfigEnv, UserConfig } from 'vite'
import { visualizer } from 'rollup-plugin-visualizer'
import Components from 'unplugin-vue-components/vite'
import AutoImport from 'unplugin-auto-import/vite'
import VueRouter from 'unplugin-vue-router/vite'
import { VueRouterAutoImports } from 'unplugin-vue-router'
import { VantResolver } from 'unplugin-vue-components/resolvers'
import { unheadVueComposablesImports } from '@unhead/vue'
import vue from '@vitejs/plugin-vue'
import legacy from '@vitejs/plugin-legacy'
import vueJsx from '@vitejs/plugin-vue-jsx'
import viewport from 'postcss-mobile-forever'
import autoprefixer from 'autoprefixer'
import { createVitePlugins } from './build/vite'
import VueDevTools from 'vite-plugin-vue-devtools'
import mockDevServerPlugin from 'vite-plugin-mock-dev-server'
import UnoCSS from 'unocss/vite'
import { createViteVConsole } from './build/vite'
export default ({ command, mode }: ConfigEnv): UserConfig => {
export default ({ mode }: ConfigEnv): UserConfig => {
const root = process.cwd()
const env = loadEnv(mode, root)
return {
base: env.VITE_APP_PUBLIC_PATH,
plugins: createVitePlugins(),
plugins: [
VueRouter({
routesFolder: 'src/views',
dts: 'src/typed-router.d.ts',
}),
server: {
host: true,
port: 3000,
proxy: {
'/api': {
target: '',
ws: false,
changeOrigin: true,
},
},
},
vue(),
vueJsx(),
visualizer(),
UnoCSS(),
mockDevServerPlugin(),
legacy({
targets: ['defaults', 'not IE 11'],
}),
Components({
extensions: ['vue'],
resolvers: [VantResolver()],
include: [/\.vue$/, /\.vue\?vue/],
dts: 'src/components.d.ts',
}),
AutoImport({
include: [
/\.[tj]sx?$/,
/\.vue$/,
/\.vue\?vue/,
],
imports: [
'vue',
'vitest',
'@vueuse/core',
VueRouterAutoImports,
{
'vue-router/auto': ['useLink'],
},
unheadVueComposablesImports,
],
dts: 'src/auto-imports.d.ts',
dirs: [
'src/composables',
],
}),
createViteVConsole(command),
VueDevTools(),
],
resolve: {
alias: {
'~@': path.join(__dirname, './src'),
'@': path.join(__dirname, './src'),
'~': path.join(__dirname, './src/assets'),
},
},
css: {
postcss: {
@ -98,25 +51,5 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
cssCodeSplit: false,
chunkSizeWarningLimit: 2048,
},
resolve: {
alias: {
'~@': path.join(__dirname, './src'),
'@': path.join(__dirname, './src'),
'~': path.join(__dirname, './src/assets'),
},
},
server: {
host: true,
port: 3000,
proxy: {
'/api': {
target: '',
ws: false,
changeOrigin: true,
},
},
},
}
}