games-development-ai/tier2/engine/phaser-window-shim.js
zizi da184f067c fix(tier2): build-phaser 用 alias 垫片替 external 解 phaser——破 A_boot 工厂缺失
iife 格式下 external:['phaser'] 会把 import Phaser from 'phaser' 编成顶层
__require("phaser")(iife 里是抛 Dynamic require not supported 的存根),
bundle 顶层求值即抛 → var __Tier2GameBundle 拿不到赋值 → host 报「工厂缺失」(A_boot)。
改:新增 phaser-window-shim.js(default 导出 window.Phaser),build 用 esbuild alias
把 'phaser' 解析到它(绝对路径,不受 cwd 影响)。普通 ESM 解析不抛错,Phaser 本体仍不进
bundle(垫片只读 window.Phaser),与 host opts.engine 注入边界(Q4)同源。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 20:26:24 +00:00

34 lines
2.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* tier2/engine/phaser-window-shim.js —— Phaser 运行时全局解析垫片esbuild alias 目标 · iife 装载边界胶水)
* ownertier2 引擎线M1-Phaser-scaffold+host · build 工具底座)
*
* ════════════════════════════════════════════════════════════════════════════
* 【这份是什么 · 为什么要它】
* tier2 右支多文件 src/ 工程里 `import Phaser from 'phaser'`,但 Phaser 名字空间走「宿主页面预载 window.Phaser
* + opts.engine 注入」的边界Q4 铁律),构建时不该把 Phaser 本体打进 bundle。
*
* 原先 build-phaser.mjs 用 `external: ['phaser']`esbuild 在 iife 格式下会把 `import Phaser from 'phaser'`
* 编成顶层 `var import_phaser = __toESM(__require("phaser"), 1)`——而 iife 里 `__require` 是会抛
* `Dynamic require of "phaser" is not supported` 的存根。这条顶层语句在 bundle 求值时直接抛错,
* 导致整个 iife 抛出、`var __Tier2GameBundle` 永远拿不到赋值 → host 取工厂报「__Tier2GameBundle 工厂缺失」(A_boot 卡点)。
*
* 改法build 用 esbuild `alias` 把 'phaser' 解析到本垫片。本垫片是一个真模块、被打进 bundle
* 默认导出运行时的 `window.Phaser`(宿主页面在 bundle 之前的 <script> 已预载)。这样 bundle 里
* `import Phaser from 'phaser'` 变成普通 ESM 解析(无 __require、不抛错运行时绑定全局 Phaser——
* 与 host 经 opts.engine 注入的 window.Phaser 同源Q4 注入边界不破Phaser 本体仍不进 bundle。
*
* 【运行时序铁律】(与 index.template.html 呼应)
* 宿主页面里预载 Phaser 的 <script> 必须排在 bundle.iife.js 之前bundle 顶层求值时 window.Phaser 才就绪。
* bundle 是 classic script先 evalhost 的 module 脚本在其后;只要预载 script 在 bundle 之前即可。
* ════════════════════════════════════════════════════════════════════════════
*/
'use strict';
// 运行时取宿主预载的全局 Phaser与 host opts.engine 同源)。
// 注:本文件只在 esbuild alias 解析下被打进 bundle、在浏览器运行时求值node --check 仅做语法校验(不真求值 window
const Phaser = (typeof window !== 'undefined' && window.Phaser) ? window.Phaser : undefined;
// 默认导出对齐游戏内 `import Phaser from 'phaser'` 的默认导入形态。
export default Phaser;