多端前端后台管理
产物与约定
这五条不是「建议」,是硬契约。违反其中任何一条,故障通常都是静默的:构建不报错,运行时才炸,而且报错信息往往指向别处。
1. 产物目录名必须等于 appCode
wujies-plugins/frontend/<code>-app/ → dist/<code>/ → /remote-apps/<code>/四处必须一致:
vite.config.ts的outDir;- 打包器
package.ps1的-FrontendDist默认值; - 后端落位目录
app-market-dist/remote-apps/<code>/; - 后端拼出的入口 URL
/remote-apps/<code>/index.js。
不一致时的表现:菜单一直在解析,控制台只报
[permission] 菜单「xxx」的 component 解析不出来,已跳过该路由2. 入口 URL 必须带 ?v=<version>
/remote-apps/exam/index.js?v=1.2.0版本号来自 app.json 的 version。没有它,升级后浏览器缓存会让用户继续跑旧代码。
3. AutoImport 清单必须与宿主逐项一致
远程产物里混着宿主源码(@/store/**、@/utils/** 按别名原样打进产物)。宿主开了 unplugin-auto-import,所以宿主源码里的 ref(...)、useStorage(...) 没有 import 语句。
插件工程少列一个 preset,它们在产物里就是裸全局:
- 构建期不报错(Rollup 当它是全局变量);
- 一装载就
ReferenceError: ref is not defined。
用 npm run check:globals 守门;它也可以复查已发布的历史包:
npm run check:globals -- --dir=<解包后的 frontend 目录>4. 垫片文件名是硬契约
app-market-dist/app-runtime/ 里的:
dromara-request.js
dromara-components.js
dromara-modal.js名字来自第三方 npm 作用域 @dromara/*,不是本项目品牌名。下面三处必须一致:
index.html的 import map;scripts/gen-runtime-shims.mjs(生成方);scripts/check-runtime-shims.mjs(校验方)。
项目改名时曾用 PowerShell
-replace(默认大小写不敏感)把dromara-request.js误改成Wujies-request.js,导致远程应用全部加载失败。
5. 不要写「薄垫片」绕 SDK
已知踩过:某个应用自己复刻了一份 src/utils/request.ts,里面 import { getToken } from '@/utils/auth' —— 这会把宿主源码拉进产物,随后就是缺依赖、双实例、版本漂移。
正确做法:
@/utils/request直接指向@dromara/request;- alias 用正则精确匹配,不要用字符串前缀匹配(否则
@/utils/requestCache也会被吃掉)。
改完跑什么
npm run check:runtime # 垫片与生成器一致
npm run check:globals # AutoImport 清单一致
npm run check:remote # 远程应用产物与清单
npm test # loader / bootstrap / edition 单测三条全绿再提交,比在浏览器里逐个应用点一遍可靠。
常见静默故障
| 你看到的 | 实际原因 |
|---|---|
| 菜单消失,但没有报错 | component 解析不到,路由被跳过 |
| 升级成功但页面没变 | 入口 URL 没带 ?v=,命中旧缓存 |
页面白屏,控制台 ref is not defined | AutoImport preset 少了 |
does not provide an export named 'globalHeaders' | @dromara/request 垫片少了具名导出 |
| 两套 Element Plus 样式打架 | 远程产物把 element-plus 打进了 bundle |