@tianyio/quality-helper
Version:
A comprehensive quality helper tool for project scaffolding and management
178 lines (169 loc) • 5.57 kB
text/typescript
import { defineConfig, mergeConfig, type UserConfig } from 'vite'
import { resolve } from 'path'
import federation from '@originjs/vite-plugin-federation'
import legacy from '@vitejs/plugin-legacy'
import VueDevTools from 'vite-plugin-vue-devtools'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import IconsResolver from 'unplugin-icons/resolver'
import Icons from 'unplugin-icons/vite'
import { FileSystemIconLoader } from 'unplugin-icons/loaders'
export default defineConfig(env => {
const config: UserConfig = {
// 路径别名
resolve: {
alias: {
'@components': resolve(__dirname, 'src/components'),
'@utils': resolve(__dirname, 'src/utils'),
'@styles': resolve(__dirname, 'src/styles'),
'@assets': resolve(__dirname, 'src/assets'),
'@views': resolve(__dirname, 'src/views'),
'@api': resolve(__dirname, 'src/api'),
},
},
plugins: [
...(env.command === 'serve' ? [VueDevTools()] : []),
// 浏览器兼容性插件 - 提供完整的旧版浏览器支持
legacy({
// 自动读取 .browserslistrc 配置
// targets: 在 .browserslistrc 中配置
// 额外的 polyfill 支持
additionalLegacyPolyfills: [
'regenerator-runtime/runtime', // async/await 支持
],
// 现代浏览器 polyfill(按需加载)
modernPolyfills: [
'es.array.flat',
'es.array.flat-map',
'es.object.from-entries',
'es.string.replace-all',
],
// 渲染 legacy chunks 的条件
renderLegacyChunks: true,
// 生成 polyfill chunks
polyfills: ['es.array.iterator', 'es.promise', 'es.object.assign', 'es.promise.finally'],
}),
federation({
name: 'main-app',
remotes: {
'sub-app': 'http://localhost:5002/assets/sub-app.js',
},
filename: 'main-app.js',
exposes: {
'./SubApp': './src/SubApp.vue',
},
shared: {
vue: {
requiredVersion: '^3.2.13',
},
'vue-router': {
requiredVersion: '^4.0.12',
},
pinia: {
requiredVersion: '^2.0.0-beta.1',
},
},
}),
AutoImport({
dts: resolve(__dirname, './types/auto-imports.d.ts'), // 生成类型声明文件,提供完整的TypeScript支持
imports: [
// Vue 3 核心API
'vue',
// Vue Router
'vue-router',
// Pinia
'pinia',
{
// VueUse 工具库 - 如果使用
// '@vueuse/core': [
// // 常用钩子
// 'useWindowSize',
// 'useScroll',
// ],
},
],
resolvers: [
// UI库解析器
// ElementPlusResolver({ importStyle: 'sass' })
// AntDesignVueResolver()
],
// 生成类型声明文件的配置
eslintrc: {
enabled: true, // 生成 .eslintrc-auto-import.json 文件
filepath: resolve(__dirname, './.eslintrc-auto-import.json'), // 生成文件路径
globalsPropValue: true, // 生成全局变量声明
},
}),
Components({
dts: resolve(__dirname, './types/components.d.ts'), // 生成类型声明文件,提供完整的TypeScript支持
directoryAsNamespace: true, // 将目录作为命名空间
// 解析器配置
resolvers: [
// UI库解析器(根据需要启用)
// ElementPlusResolver({
// importStyle: 'sass'
// }),
// AntDesignVueResolver(),
// 图标解析器
IconsResolver({
// 自动引入的Icon组件统一前缀,默认为 i,设置false为不需要前缀
// prefix: 'icon',
customCollections: ['custom'],
}),
],
}),
Icons({
compiler: 'vue3',
customCollections: {
// 这里是存放svg图标的文件地址,custom是自定义图标库的名称
custom: FileSystemIconLoader('./src/assets/icons/svg/', (svg: string) =>
svg.replace(/^<svg /, '<svg fill="currentColor" ')
),
},
}),
],
// CSS 配置
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/styles/variables.scss";`,
},
},
},
// 开发服务器配置
server: {
port: 5173,
open: true,
},
// 构建配置
build: {
rollupOptions: {
/* input: {
// 入口文件
main: path.resolve(__dirname, 'index.html'),
login: path.resolve(__dirname, 'login.html'),
}, */
output: {
globals: {
vue: 'Vue',
lodash: '_',
},
manualChunks: {
// 手动分割路由库为公共块
router: ['vue-router'],
vue: ['vue'], // 其他公共依赖
pinia: ['pinia'],
lodash: ['lodash', 'lodash-es'],
vueuse: ['@vueuse/core'],
axios: ['axios'],
tcsl: ['@tianyio/fast-util-lib'],
},
// chunkFileNames: 'js/[name]-[hash].js', // 代码分割文件名
// entryFileNames: 'js/[name]-[hash].js', // 入口文件名
// assetFileNames: 'assets/[name]-[hash].[ext]', // 静态资源文件名
},
},
},
}
return config
})