diff --git a/resources/js/effects.js b/resources/js/effects.js
new file mode 100644
index 0000000..49466fc
--- /dev/null
+++ b/resources/js/effects.js
@@ -0,0 +1,18 @@
+/**
+ * 文件功能:聊天室全屏特效 Vite 入口
+ *
+ * 按原 public script 顺序加载所有全屏特效模块,让生产环境由 Vite 统一压缩、加 hash 并减少请求数。
+ */
+
+import "./effects/effect-sounds.js";
+import "./effects/effect-manager.js";
+import "./effects/fireworks.js";
+import "./effects/rain.js";
+import "./effects/lightning.js";
+import "./effects/snow.js";
+import "./effects/sakura.js";
+import "./effects/meteors.js";
+import "./effects/gold-rain.js";
+import "./effects/hearts.js";
+import "./effects/confetti.js";
+import "./effects/fireflies.js";
diff --git a/public/js/effects/confetti.js b/resources/js/effects/confetti.js
similarity index 99%
rename from public/js/effects/confetti.js
rename to resources/js/effects/confetti.js
index 7377f2e..c2a443a 100644
--- a/public/js/effects/confetti.js
+++ b/resources/js/effects/confetti.js
@@ -150,3 +150,5 @@ const ConfettiEffect = (() => {
return { start };
})();
+
+window.ConfettiEffect = ConfettiEffect;
diff --git a/public/js/effects/effect-manager.js b/resources/js/effects/effect-manager.js
similarity index 85%
rename from public/js/effects/effect-manager.js
rename to resources/js/effects/effect-manager.js
index cdacf5b..767798c 100644
--- a/public/js/effects/effect-manager.js
+++ b/resources/js/effects/effect-manager.js
@@ -182,8 +182,8 @@ const EffectManager = (() => {
_canvas = null;
_current = null;
// 通知音效引擎停止(兜底:正常情况下音效会自行计时结束)
- if (typeof EffectSounds !== "undefined") {
- EffectSounds.stop();
+ if (typeof window.EffectSounds !== "undefined") {
+ window.EffectSounds.stop();
}
if (playNext && _queue.length > 0) {
@@ -260,8 +260,8 @@ const EffectManager = (() => {
_bindClickStop();
// 同步触发对应音效
- if (typeof EffectSounds !== "undefined") {
- EffectSounds.play(type);
+ if (typeof window.EffectSounds !== "undefined") {
+ window.EffectSounds.play(type);
}
let started = false;
@@ -269,38 +269,38 @@ const EffectManager = (() => {
try {
switch (type) {
case "fireworks":
- started = _startEffect(typeof FireworksEffect !== "undefined" ? FireworksEffect : undefined, canvas, finishCurrent);
+ started = _startEffect(window.FireworksEffect, canvas, finishCurrent);
break;
case "wedding-fireworks":
// 婚礼专属:双倍礼花,粉金浪漫配色,持续 12 秒
- started = _startEffect(typeof FireworksEffect !== "undefined" ? FireworksEffect : undefined, canvas, finishCurrent, "startDouble");
+ started = _startEffect(window.FireworksEffect, canvas, finishCurrent, "startDouble");
break;
case "rain":
- started = _startEffect(typeof RainEffect !== "undefined" ? RainEffect : undefined, canvas, finishCurrent);
+ started = _startEffect(window.RainEffect, canvas, finishCurrent);
break;
case "lightning":
- started = _startEffect(typeof LightningEffect !== "undefined" ? LightningEffect : undefined, canvas, finishCurrent);
+ started = _startEffect(window.LightningEffect, canvas, finishCurrent);
break;
case "snow":
- started = _startEffect(typeof SnowEffect !== "undefined" ? SnowEffect : undefined, canvas, finishCurrent);
+ started = _startEffect(window.SnowEffect, canvas, finishCurrent);
break;
case "sakura":
- started = _startEffect(typeof SakuraEffect !== "undefined" ? SakuraEffect : undefined, canvas, finishCurrent);
+ started = _startEffect(window.SakuraEffect, canvas, finishCurrent);
break;
case "meteors":
- started = _startEffect(typeof MeteorsEffect !== "undefined" ? MeteorsEffect : undefined, canvas, finishCurrent);
+ started = _startEffect(window.MeteorsEffect, canvas, finishCurrent);
break;
case "gold-rain":
- started = _startEffect(typeof GoldRainEffect !== "undefined" ? GoldRainEffect : undefined, canvas, finishCurrent);
+ started = _startEffect(window.GoldRainEffect, canvas, finishCurrent);
break;
case "hearts":
- started = _startEffect(typeof HeartsEffect !== "undefined" ? HeartsEffect : undefined, canvas, finishCurrent);
+ started = _startEffect(window.HeartsEffect, canvas, finishCurrent);
break;
case "confetti":
- started = _startEffect(typeof ConfettiEffect !== "undefined" ? ConfettiEffect : undefined, canvas, finishCurrent);
+ started = _startEffect(window.ConfettiEffect, canvas, finishCurrent);
break;
case "fireflies":
- started = _startEffect(typeof FirefliesEffect !== "undefined" ? FirefliesEffect : undefined, canvas, finishCurrent);
+ started = _startEffect(window.FirefliesEffect, canvas, finishCurrent);
break;
default:
console.warn(`[EffectManager] 未知特效类型:${type}`);
diff --git a/public/js/effects/effect-sounds.js b/resources/js/effects/effect-sounds.js
similarity index 99%
rename from public/js/effects/effect-sounds.js
rename to resources/js/effects/effect-sounds.js
index 8f9571c..09e5651 100644
--- a/public/js/effects/effect-sounds.js
+++ b/resources/js/effects/effect-sounds.js
@@ -925,5 +925,6 @@ const EffectSounds = (() => {
return { play, stop, ding };
})();
+window.EffectSounds = EffectSounds;
// 将叮咚通知音暴露为独立全局变量,供 toast/banner 等组件直接调用
window.chatSound = { ding: () => EffectSounds.ding() };
diff --git a/public/js/effects/fireflies.js b/resources/js/effects/fireflies.js
similarity index 99%
rename from public/js/effects/fireflies.js
rename to resources/js/effects/fireflies.js
index f5ead53..d2e5937 100644
--- a/public/js/effects/fireflies.js
+++ b/resources/js/effects/fireflies.js
@@ -173,3 +173,5 @@ const FirefliesEffect = (() => {
return { start };
})();
+
+window.FirefliesEffect = FirefliesEffect;
diff --git a/public/js/effects/fireworks.js b/resources/js/effects/fireworks.js
similarity index 99%
rename from public/js/effects/fireworks.js
rename to resources/js/effects/fireworks.js
index 9914716..e487a33 100644
--- a/public/js/effects/fireworks.js
+++ b/resources/js/effects/fireworks.js
@@ -672,3 +672,5 @@ const FireworksEffect = (() => {
return { start, startDouble };
})();
+
+window.FireworksEffect = FireworksEffect;
diff --git a/public/js/effects/gold-rain.js b/resources/js/effects/gold-rain.js
similarity index 99%
rename from public/js/effects/gold-rain.js
rename to resources/js/effects/gold-rain.js
index d3ff3bd..32ef249 100644
--- a/public/js/effects/gold-rain.js
+++ b/resources/js/effects/gold-rain.js
@@ -153,3 +153,5 @@ const GoldRainEffect = (() => {
return { start };
})();
+
+window.GoldRainEffect = GoldRainEffect;
diff --git a/public/js/effects/hearts.js b/resources/js/effects/hearts.js
similarity index 99%
rename from public/js/effects/hearts.js
rename to resources/js/effects/hearts.js
index 622e108..b097d0a 100644
--- a/public/js/effects/hearts.js
+++ b/resources/js/effects/hearts.js
@@ -135,3 +135,5 @@ const HeartsEffect = (() => {
return { start };
})();
+
+window.HeartsEffect = HeartsEffect;
diff --git a/public/js/effects/lightning.js b/resources/js/effects/lightning.js
similarity index 99%
rename from public/js/effects/lightning.js
rename to resources/js/effects/lightning.js
index 91de213..f37341e 100644
--- a/public/js/effects/lightning.js
+++ b/resources/js/effects/lightning.js
@@ -204,3 +204,5 @@ const LightningEffect = (() => {
return { start };
})();
+
+window.LightningEffect = LightningEffect;
diff --git a/public/js/effects/meteors.js b/resources/js/effects/meteors.js
similarity index 99%
rename from public/js/effects/meteors.js
rename to resources/js/effects/meteors.js
index 4d8bb77..8435e4b 100644
--- a/public/js/effects/meteors.js
+++ b/resources/js/effects/meteors.js
@@ -198,3 +198,5 @@ const MeteorsEffect = (() => {
return { start };
})();
+
+window.MeteorsEffect = MeteorsEffect;
diff --git a/public/js/effects/rain.js b/resources/js/effects/rain.js
similarity index 99%
rename from public/js/effects/rain.js
rename to resources/js/effects/rain.js
index 49e9455..4bb742b 100644
--- a/public/js/effects/rain.js
+++ b/resources/js/effects/rain.js
@@ -124,3 +124,5 @@ const RainEffect = (() => {
return { start };
})();
+
+window.RainEffect = RainEffect;
diff --git a/public/js/effects/sakura.js b/resources/js/effects/sakura.js
similarity index 99%
rename from public/js/effects/sakura.js
rename to resources/js/effects/sakura.js
index d8f4052..8b51d03 100644
--- a/public/js/effects/sakura.js
+++ b/resources/js/effects/sakura.js
@@ -140,3 +140,5 @@ const SakuraEffect = (() => {
return { start };
})();
+
+window.SakuraEffect = SakuraEffect;
diff --git a/public/js/effects/snow.js b/resources/js/effects/snow.js
similarity index 99%
rename from public/js/effects/snow.js
rename to resources/js/effects/snow.js
index 2aee95d..208d5cd 100644
--- a/public/js/effects/snow.js
+++ b/resources/js/effects/snow.js
@@ -260,3 +260,5 @@ const SnowEffect = (() => {
return { start };
})();
+
+window.SnowEffect = SnowEffect;
diff --git a/resources/views/chat/frame.blade.php b/resources/views/chat/frame.blade.php
index 3049ff5..e0fb7d7 100644
--- a/resources/views/chat/frame.blade.php
+++ b/resources/views/chat/frame.blade.php
@@ -227,19 +227,8 @@
@include('chat.partials.games.gomoku-panel')
@include('chat.partials.games.earn-panel')
- {{-- 全屏特效系统:管理员和会员入场可触发的全屏动效 --}}
-
-
-
-
-
-
-
-
-
-
-
-
+ {{-- 全屏特效系统:管理员和会员入场可触发的全屏动效,生产环境由 Vite 压缩与版本化 --}}
+ @vite('resources/js/effects.js')
@include('chat.partials.scripts')
diff --git a/vite.config.js b/vite.config.js
index aed47b5..95b2926 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -9,6 +9,7 @@ export default defineConfig({
"resources/css/app.css",
"resources/js/app.js",
"resources/js/chat.js",
+ "resources/js/effects.js",
],
refresh: true,
}),