/*! @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();
`,
}),
]
}