// @ts-ignore import path from "path"; import vue from "@vitejs/plugin-vue"; import legacy from "@vitejs/plugin-legacy"; import vueJsx from "@vitejs/plugin-vue-jsx"; import viteSvgIcons from "vite-plugin-svg-icons"; //mock import { viteMockServe } from "vite-plugin-mock"; //inject title import { createHtmlPlugin } from "vite-plugin-html"; //setup name // import VueSetupExtend from 'vite-plugin-vue-setup-extend-plus' //auto import element-plus has some issue 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' import UnoCSS from "unocss/vite"; import { presetAttributify, presetIcons, presetUno } from "unocss"; import mkcert from "vite-plugin-mkcert"; import DefineOptions from "unplugin-vue-define-options/vite"; //auto import vue https://www.npmjs.com/package/unplugin-auto-import import AutoImport from "unplugin-auto-import/vite"; import setting from "./src/settings"; import legacyPlugin from '@vitejs/plugin-legacy' const prodMock = setting.openProdMock; // import packageJson from './package.json' // import { loadEnv } from 'vite' import { optimizeDependencies, optimizeElementPlus } from "./optimize-include"; const pathSrc = path.resolve(__dirname, "src"); export default ({ command, mode }: any) => { return { //detail to look https://vitejs.cn/config/#base base: setting.viteBasePath, //define global var define: { //fix "path" module issue "process.platform": null, "process.version": null, GLOBAL_STRING: JSON.stringify( "i am global var from vite.config.js define" ), GLOBAL_VAR: { test: "i am global var from vite.config.js define", }, }, clearScreen: false, server: { hmr: { overlay: false }, // 禁用或配置 HMR 连接 设置 server.hmr.overlay 为 false 可以禁用服务器错误遮罩层 port: 5003, // 类型: number 指定服务器端口; open: false, // 类型: boolean | string在服务器启动时自动在浏览器中打开应用程序; cors: true, // 类型: boolean | CorsOptions 为开发服务器配置 CORS。默认启用并允许任何源 host: true, https: false, //whether open https 开启https首次运行比较慢 且有个输入密码过程 //proxy look for https://vitejs.cn/config/#server-proxy // proxy: { // '/api': { // target: loadEnv(mode, process.cwd()).VITE_APP_PROXY_URL, // changeOrigin: true, // rewrite: (path) => path.replace(/^\/api/, '') // } // } }, preview: { port: 5008, host: true, strictPort: true, }, plugins: [ legacyPlugin({ targets:['chrome 51','chrome 52','chrome 53','chrome 54'], // 需要兼容的目标列表,可以设置多个 additionalLegacyPolyfills:['regenerator-runtime/runtime'] // 面向IE11时需要此插件 }), vue({ reactivityTransform: true }), // Icons({ // autoInstall: true, // }), vueJsx(), UnoCSS({ presets: [presetUno(), presetAttributify(), presetIcons()], }), DefineOptions(), mkcert(), //compatible with old browsers // legacy({ // targets: ['chrome 52'], // additionalLegacyPolyfills: ['regenerator-runtime/runtime'] // }), viteSvgIcons({ // config svg dir that can config multi iconDirs: [ path.resolve(process.cwd(), "src/icons/common"), path.resolve(process.cwd(), "src/icons/nav-bar"), ], // appoint svg icon using mode symbolId: "icon-[dir]-[name]", }), //https://github.com/anncwb/vite-plugin-mock/blob/HEAD/README.zh_CN.md viteMockServe({ supportTs: true, mockPath: "mock", localEnabled: command === "serve", prodEnabled: prodMock, injectCode: ` import { setupProdMockServer } from './mockProdServer'; setupProdMockServer(); `, logger: true, }), // VueSetupExtend(),using DefineOptions instant of it //https://github.com/antfu/unplugin-auto-import/blob/HEAD/src/types.ts Components({ resolvers: [ // on-demand element-plus has some issue // ElementPlusResolver({ // importStyle: 'sass' // }) // import icons // https://github.com/antfu/unplugin-icons // IconsResolver(), ], }), AutoImport({ // resolvers: [ElementPlusResolver()], imports: [ "vue", "pinia", "vue-router", { "@/hooks/global/useCommon": ["useCommon"], "@/hooks/global/useElement": ["useElement"], "@/hooks/global/useVueRouter": ["useVueRouter"], "@/utils/axiosReq": ["axiosReq"], }, ], eslintrc: { enabled: true, // Default `false` filepath: "./.eslintrc-auto-import.json", // Default `./.eslintrc-auto-import.json` globalsPropValue: true, // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable') }, dts: true, //auto generation auto-imports.d.ts file }), // auto config of index.html title createHtmlPlugin({ inject: { // Inject data into ejs template data: { title: setting.title, injectScript: ``, }, }, }), ], // logLevel: 'error', build: { //target: 'es2015', minify: "terser", brotliSize: false, // 消除打包大小超过500kb警告 chunkSizeWarningLimit: 5000, //remote console.log in prod terserOptions: { //detail to look https://terser.org/docs/api-reference#compress-options compress: { drop_console: false, pure_funcs: ["console.log", "console.info"], drop_debugger: true, }, }, //build assets Separate assetsDir: "static/assets", rollupOptions: { output: { chunkFileNames: "static/js/[name]-[hash].js", entryFileNames: "static/js/[name]-[hash].js", assetFileNames: "static/[ext]/[name]-[hash].[ext]", }, }, }, resolve: { alias: { "~/": `${pathSrc}/`, "@/": `${pathSrc}/`, }, //why remove it , look for https://github.com/vitejs/vite/issues/6026 // extensions: ['.js', '.ts', '.jsx', '.tsx', '.json', '.vue', '.mjs'] }, css: { // postcss: { // //remove build charset warning // plugins: [ // { // postcssPlugin: 'internal:charset-removal', // AtRule: { // charset: (atRule) => { // if (atRule.name === 'charset') { // atRule.remove() // } // } // } // } // ] // }, // preprocessorOptions: { //define global scss variable import // scss: { // additionalData: `@use '@/theme/index.scss' as * ;` // } // } }, optimizeDeps: { //include: [...optimizeDependencies,...optimizeElementPlus] //on-demand element-plus use this // include: [...optimizeDependencies] include: ["moment-mini"], }, }; };