import {join} from "path"; import {UserConfig, ConfigEnv, loadEnv, defineConfig} from "vite"; import vuePlugin from "@vitejs/plugin-vue"; import vueJsx from "@vitejs/plugin-vue-jsx"; import viteIkarosTools from "./plugin/vite-ikaros-tools"; import {getConfig} from "./utils"; /** * 自动引用功能 */ import AutoImport from "unplugin-auto-import/vite"; import Components from "unplugin-vue-components/vite"; import {ElementPlusResolver} from "unplugin-vue-components/resolvers"; import Icons from "unplugin-icons/vite"; import IconsResolver from "unplugin-icons/resolver"; /** * SVG图标 */ import {createSvgIconsPlugin} from "vite-plugin-svg-icons"; /** * univerJs插件 */ import {univerPlugin} from "@univerjs/vite-plugin"; import UnoCSS from "unocss/vite"; /** * 需要预加载的资源 */ import {preloads} from "./preloads"; function resolve(dir: string) { return join(__dirname, "..", dir); } const config = getConfig(); import pkg from "../package.json"; /** 平台的名称、版本、运行所需的`node`版本、依赖、构建时间的类型提示 */ const __APP_INFO__ = { pkg: pkg, buildTimestamp: Date.now(), }; const root = resolve("src/renderer"); const src = resolve("src"); const theme: string = resolve("src/renderer/themes/default"); const mode = config && config.NODE_ENV; export default defineConfig({ mode: mode, root: root, define: { __CONFIG__: config, __ISWEB__: Number(config && config.target), __APP_INFO__: JSON.stringify(__APP_INFO__), 'process.env': process.env, }, resolve: { alias: { "@": root, "@api": join(root, "/api"), "@config": join(src, "../config"), "@main": join(src, "/main"), "@mock": join(root, "/mock"), "@renderer": root, "@src": src, "@store": join(root, "/store/modules"), "@theme": theme }, }, base: "./", build: { outDir: config && config.target ? resolve("dist/web") : resolve("dist/electron/renderer"), emptyOutDir: true, target: "esnext", cssCodeSplit: false, }, css: { // CSS 预处理器 preprocessorOptions: { // 定义全局 SCSS 变量 scss: { javascriptEnabled: true, additionalData: ` @use "@theme/styles/variables.scss" as *; `, }, }, }, server: { // 无须配置 }, plugins: [ vuePlugin(), // jsx、tsx语法支持 vueJsx(), viteIkarosTools(), //CSS预处理 UnoCSS({ hmrTopLevelAwait: false, }), // univerjs的虚拟化插件技术,用于语言包的自动引用 univerPlugin(), // 自动导入参考: https://github.com/sxzz/element-plus-best-practices/blob/main/vite.config.ts AutoImport({ // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等 imports: ["vue", "@vueuse/core", "pinia", "vue-router", "vue-i18n"], resolvers: [ // 自动导入 Element Plus 相关函数,如:ElMessage, ElMessageBox... (带样式) ElementPlusResolver(), // 自动导入图标组件 IconsResolver({}), ], eslintrc: { // 是否自动生成 eslint 规则,建议生成之后设置 false enabled: true, // 指定自动导入函数 eslint 规则的文件 filepath: "../.eslintrc-auto-import.json", globalsPropValue: true, }, // 是否在 vue 模板中自动导入 vueTemplate: true, // 指定自动导入函数TS类型声明文件路径 (false:关闭自动生成) // dts: false, dts: "fixTypes/auto-imports.d.ts", }), Components({ resolvers: [ // 自动导入 Element Plus 组件 ElementPlusResolver(), /** * 自动注册图标组件 */ IconsResolver({ // element-plus图标库,其他图标库 https://icon-sets.iconify.design/ enabledCollections: ["ep"], }), ], /** * 指定自定义组件位置(默认:src/components) * TBD: resolve("@theme/components"),测试用法,效果未知 */ dirs: ["src/components", join(theme, "/components"), join(theme, "/**/components")], // 指定自动导入组件TS类型声明文件路径 (false:关闭自动生成) // dts: false, dts: "fixTypes/components.d.ts", }), Icons({ // 自动安装图标库 autoInstall: true, }), createSvgIconsPlugin({ // 指定需要缓存的图标文件夹 iconDirs: [join(theme, "assets/icons")], // 指定symbolId格式 symbolId: "icon-[dir]-[name]", }), // node({ // // 默认情况下,`node` 插件会重写 `process` 和全局变量。 // // 如果你不想要这个行为,可以将 `mock` 设置为 `false`。 // mock: true, // // // 如果你想要包括一些特定的Node.js全局变量,可以在 `additional` 中指定。 // additional: ['process', 'fs', 'path'] // }) ], optimizeDeps: preloads, });