import { cp } from "node:fs/promises"; import path from "node:path"; import { defineConfig, type Plugin } from "vite"; import serveStatic from "serve-static"; const DEV_PHASER_BRIDGE_URL = "https://lf-coze-web-cdn.coze.cn/obj/eden-cn/lm-lgvj/ljhwZthlaukjlkulzlp/coze-game/js/phaser-bridge.min.js"; function injectDevPhaserBridge(): Plugin { return { name: "phaser-dev-bridge", transformIndexHtml() { return [ { tag: "script", attrs: { src: DEV_PHASER_BRIDGE_URL }, injectTo: "head", }, ]; }, }; } function mountDevAssets(directory: string): Plugin { const serveAssets = serveStatic(directory, { cacheControl: false, dotfiles: "allow", fallthrough: false, index: false, redirect: false, setHeaders(response) { response.setHeader("Cache-Control", "no-cache"); }, }); return { name: "phaser-dev-assets", configureServer(server) { server.middlewares.use("/assets", (request, response, next) => { const isRead = request.method === "GET" || request.method === "HEAD"; if (!isRead || request.url?.includes("?")) { response.statusCode = 404; response.end("Not Found\n"); return; } serveAssets(request, response, next); }); }, }; } function copyGameAssets(directory: string): Plugin { return { name: "phaser-build-assets", async writeBundle(outputOptions) { const outputDirectory = path.resolve( import.meta.dirname, outputOptions.dir ?? "dist", ); await cp(directory, path.join(outputDirectory, "assets"), { recursive: true, force: true, filter(source) { return path.basename(source) !== ".DS_Store"; }, }); }, }; } export default defineConfig(() => { const isDev = process.env.COZE_PHASER_GAME_ENV === "DEV"; const assetsDirectory = path.join(import.meta.dirname, "assets"); return { resolve: { alias: { "@": path.resolve(import.meta.dirname, "src"), }, }, server: { // 游戏需用户手动刷新,防止游玩过程中丢失游戏状态 hmr: false, }, plugins: [ copyGameAssets(assetsDirectory), ...(isDev ? [ injectDevPhaserBridge(), mountDevAssets(assetsDirectory), ] : []), ], }; });