Skip to content

Commit 7e2894b

Browse files
committed
feat: optimize bundle size
1 parent ea4f3ec commit 7e2894b

4 files changed

Lines changed: 42 additions & 20 deletions

File tree

app/components/widget/dx-rating.vue

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ const ratingLevels: any = [
1818
1919
const canvasRef = ref<HTMLCanvasElement | null>(null)
2020
21-
const getNum = (id: string) => new URL(`../../assets/icons/rating/num/UI_CMN_Num_26p_${id}.png`, import.meta.url).href
22-
const getBase = (id: string) => new URL(`../../assets/icons/rating/UI_CMA_Rating_Base_${id}.png`, import.meta.url).href
21+
const getNum = async (id: string) => (await import(`../../assets/icons/rating/num/UI_CMN_Num_26p_${id}.png`)).default
22+
const getBase = async (id: string) => (await import(`../../assets/icons/rating/UI_CMA_Rating_Base_${id}.png`)).default
2323
2424
function countOccurrences(str: string, searchTerm: string) {
2525
let count = 0
@@ -31,20 +31,19 @@ function countOccurrences(str: string, searchTerm: string) {
3131
return count
3232
}
3333
34-
const numImages = computed(() => {
34+
const numImageIds = computed(() => {
3535
const numValue = props.rating?.replace(/\+/g, '').replace(/-/g, '')
3636
if (!numValue || Number.isNaN(Number(numValue)))
3737
return []
3838
const arr = numValue.split('')
3939
while (arr.length < 5) arr.unshift('10')
40-
const finalValue = arr.map(num => getNum(num))
41-
return finalValue.slice(0, 5)
40+
return arr.slice(0, 5)
4241
})
4342
44-
const baseImage = computed(() => {
43+
const baseImageId = computed(() => {
4544
const numValue = props.rating?.replace(/\+/g, '').replace(/-/g, '')
4645
if (!numValue || Number.isNaN(Number(numValue)))
47-
return getBase('0')
46+
return '0'
4847
let rating = Number.parseInt(numValue)
4948
rating = Math.max(ratingLevels[0], Math.min(rating, ratingLevels[9]))
5049
let stage = 0
@@ -53,7 +52,7 @@ const baseImage = computed(() => {
5352
const sideEffect = countOccurrences(props.rating || '', '+') - countOccurrences(props.rating || '', '-')
5453
const finalValue = Math.max(Math.min(stage + 1 + sideEffect, 10), 0)
5554
56-
return getBase(String(finalValue))
55+
return String(finalValue)
5756
})
5857
5958
async function drawCanvas() {
@@ -68,14 +67,19 @@ async function drawCanvas() {
6867
6968
ctx.clearRect(0, 0, canvas.width, canvas.height)
7069
70+
const [baseSrc, numSrcs] = await Promise.all([
71+
getBase(baseImageId.value),
72+
Promise.all(numImageIds.value.map(id => getNum(id))),
73+
])
74+
7175
const baseImg = new Image()
7276
baseImg.fetchPriority = 'high'
73-
baseImg.src = baseImage.value
77+
baseImg.src = baseSrc
7478
7579
baseImg.onload = () => {
7680
ctx.drawImage(baseImg, 0, 0, canvas.width, canvas.height)
7781
78-
const numImgPromises = numImages.value.map((src) => {
82+
const numImgPromises = numSrcs.map((src) => {
7983
const img = new Image()
8084
img.fetchPriority = 'high'
8185
img.src = src
@@ -96,7 +100,7 @@ async function drawCanvas() {
96100
}
97101
98102
onMounted(drawCanvas)
99-
watch([() => props.rating, baseImage, numImages], drawCanvas)
103+
watch([() => props.rating, baseImageId, numImageIds], drawCanvas)
100104
</script>
101105

102106
<template>

app/composables/useTour.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ export function useTour(updateCallback: () => void = () => {}) {
1111
/**
1212
* 启动主页引导(第一阶段)
1313
*/
14-
function startMainPageTour() {
15-
const intro = nuxtApp.$intro.tour()
14+
async function startMainPageTour() {
15+
const introJs = await nuxtApp.$getIntro()
16+
const intro = introJs.tour()
1617
inTour.value = true
1718

1819
intro.setOptions({
@@ -76,8 +77,9 @@ export function useTour(updateCallback: () => void = () => {}) {
7677
/**
7778
* 启动设置页引导(第二阶段)
7879
*/
79-
function startPreferenceTour() {
80-
const intro = nuxtApp.$intro.tour()
80+
async function startPreferenceTour() {
81+
const introJs = await nuxtApp.$getIntro()
82+
const intro = introJs.tour()
8183

8284
intro.setOptions({
8385
steps: [

app/plugins/intro.client.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1-
import introJs from 'intro.js'
2-
31
export default defineNuxtPlugin(() => {
2+
let introPromise: Promise<typeof import('intro.js').default> | null = null
3+
4+
async function getIntro() {
5+
if (!introPromise) {
6+
await import('intro.js/introjs.css')
7+
introPromise = import('intro.js').then(mod => mod.default)
8+
}
9+
return introPromise
10+
}
11+
412
return {
513
provide: {
6-
intro: introJs,
14+
getIntro,
715
},
816
}
917
})

nuxt.config.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,17 @@ import tailwindcss from '@tailwindcss/vite'
33

44
export default defineNuxtConfig({
55
compatibilityDate: '2025-07-15',
6-
devtools: { enabled: true },
6+
devtools: { enabled: process.env.NODE_ENV === 'development' },
77
modules: ['@pinia/nuxt', '@nuxtjs/i18n', '@nuxt/eslint', 'nuxt-auth-utils'],
8-
css: ['~/assets/css/main.css', 'intro.js/introjs.css'],
8+
css: ['~/assets/css/main.css'],
9+
app: {
10+
head: {
11+
link: [
12+
{ rel: 'dns-prefetch', href: 'https://cdn.assets.turou.fun' },
13+
{ rel: 'preconnect', href: 'https://cdn.assets.turou.fun', crossorigin: '' },
14+
],
15+
},
16+
},
917
vite: {
1018
plugins: [
1119
tailwindcss(),

0 commit comments

Comments
 (0)