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>
34 lines
2.7 KiB
JavaScript
34 lines
2.7 KiB
JavaScript
/**
|
||
* tier2/engine/phaser-window-shim.js —— Phaser 运行时全局解析垫片(esbuild alias 目标 · iife 装载边界胶水)
|
||
* owner:tier2 引擎线(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(先 eval),host 的 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;
|