/*! @file ********************************************************************************
文件实现功能   :
作者           : guxukai
版本           : 1.0
--------------------------------------------------------------------------------
备注           : -
--------------------------------------------------------------------------------
修改记录 :
日  期       版本    修改人     修改内容
2022/5/31     1.0    guxukai  创建
*******************************************************************************/ // --[ 第三方组件库 按需引入 import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import { AntDesignVueResolver, ElementPlusResolver } from 'unplugin-vue-components/resolvers' // -- 第三方组件库 按需引入 ] import Unocss from 'unocss/vite' import { viteMockServe } from 'vite-plugin-mock' // import DefineOptions from 'unplugin-vue-define-options/vite' // // -- Convert yaml, xml, xlsx, ini, toml, csv, plist and properties files to ES6 modules. import content from '@originjs/vite-plugin-content' import Inspect from 'vite-plugin-inspect' // pwa import type { ManifestOptions, VitePWAOptions } from 'vite-plugin-pwa' import { VitePWA } from 'vite-plugin-pwa' import replace from '@rollup/plugin-replace' import dayjs from 'dayjs' import vue from '@vitejs/plugin-vue' import ViteLegacy from '@vitejs/plugin-legacy' import ViteVisualizer from 'rollup-plugin-visualizer' export default ({ command, mode }) => { const isBuild = command === 'build' const isReport = mode === 'report' const plugins: any[] = [] if (isBuild) { plugins.push( /** * DESC: * provides support for legacy browsers * that do not support native ESM */ ViteLegacy({ targets: [ 'defaults', 'not IE 11', ], }), ) } if (isReport) { plugins.push( /** * DESC: * visualize bundle */ ViteVisualizer({ filename: './dist/report.html', open: true, brotliSize: true, }), ) } const buildDate = dayjs().format('YYYY-MM-DD HH:mm:ss') const pwaOptions: Partial = { mode: isBuild ? 'production' : 'development', base: '/', includeAssets: ['favicon.ico'], manifest: { name: 'potoio', short_name: 'potoio', theme_color: '#ffffff', description: buildDate, icons: [ { src: 'pwa-192x192.png', // <== don't add slash, for testing sizes: '192x192', type: 'image/png', }, { src: 'pwa-512x512.png', // <== don't remove slash, for testing sizes: '512x512', type: 'image/png', }, { src: 'pwa-512x512.png', // <== don't add slash, for testing sizes: '512x512', type: 'image/png', purpose: 'any maskable', }, ], }, devOptions: { enabled: process.env.VITE_SW_DEV === 'true', /* when using generateSW the PWA plugin will switch to classic */ type: 'module', navigateFallback: 'index.html', }, } const replaceOptions = { __DATE__: buildDate, preventAssignment: true } const claims = process.env.VITE_CLAIMS === 'true' const reload = process.env.VITE_RELOAD_SW === 'true' if (process.env.VITE_SW === 'true') { pwaOptions.srcDir = 'src/core/pwa' pwaOptions.filename = claims ? 'claims-sw.ts' : 'prompt-sw.ts' pwaOptions.strategies = 'injectManifest' pwaOptions.injectManifest = { globPatterns: ['**/*'], maximumFileSizeToCacheInBytes: 100 * 1024 * 1024, } ;(pwaOptions.manifest as Partial).name = 'P2L' ;(pwaOptions.manifest as Partial).short_name = 'P2L' } if (claims) pwaOptions.registerType = 'autoUpdate' if (reload) { // @ts-expect-error replaceOptions.__RELOAD_SW__ = 'true' } return [ Inspect(), VitePWA(pwaOptions), replace(replaceOptions), DefineOptions(), content(), Unocss(), vue(), // --[ element-plus 按需引入 AutoImport({ resolvers: [ElementPlusResolver(), AntDesignVueResolver()], imports: ['vue', 'vue-router', 'vue-i18n', '@vueuse/core'], eslintrc: { enabled: true, }, }), Components({ resolvers: [ElementPlusResolver({ importStyle: 'sass' }), AntDesignVueResolver({ importStyle: 'less' })], }), // -- element-plus 按需引入 ] viteMockServe({ ignore: /^_/, mockPath: 'mock', logger: true, localEnabled: !isBuild, prodEnabled: isBuild, // 为了演示,线上开启 mock,实际开发请关闭,会影响打包体积 // 开发环境无需关心 // injectCode 只受prodEnabled影响 // https://github.com/anncwb/vite-plugin-mock/issues/9 // 下面这段代码会被注入 main.ts injectCode: ` import { setupProdMockServer } from '../mock/_createProdMockServer'; setupProdMockServer(); `, }), ] }