Wujies 无界平台
多端前端后台管理

产物与约定

这五条不是「建议」,是硬契约。违反其中任何一条,故障通常都是静默的:构建不报错,运行时才炸,而且报错信息往往指向别处。

1. 产物目录名必须等于 appCode

wujies-plugins/frontend/<code>-app/   →   dist/<code>/   →   /remote-apps/<code>/

四处必须一致:

  1. vite.config.ts 的 outDir;
  2. 打包器 package.ps1 的 -FrontendDist 默认值;
  3. 后端落位目录 app-market-dist/remote-apps/<code>/;
  4. 后端拼出的入口 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 definedAutoImport preset 少了
does not provide an export named 'globalHeaders'@dromara/request 垫片少了具名导出
两套 Element Plus 样式打架远程产物把 element-plus 打进了 bundle

目录