
本文档描述了 VTJ.PRO 平台的前端架构,涵盖五个不同的 HTML 入口点、它们的初始化流程以及如何与 @vtj/renderer 引擎集成。前端设计为一个多上下文系统,每个入口点服务于特定目的:主应用(管理后台和工作台)、平台运行时(Web、H5、UniApp)、开发环境和独立项目模板。
有关特定路由配置的信息,请参阅路由系统。有关 VTJ 渲染器页面渲染过程的详细信息,请参阅多平台运行时系统。有关后端模块架构的信息,请参阅后端模块系统。

前端包含五个架构上下文,每个上下文都有自己的入口点和初始化逻辑:

每个入口点服务于不同的目的并具有不同的初始化要求:
入口点 | HTML 文件 | 主脚本 | 用途 | 路由模式 | 访问控制 | VTJ 提供者 |
|---|---|---|---|---|---|---|
主应用 | frontend/index.html | src/main.ts | 管理后台、工作台、认证页面 | Hash 或 History | 是(含白名单) | 否 |
Web 运行时 | frontend/web/index.html | src/platform/web/main.ts | 部署 Web 应用程序 | Hash | 是(运行时模式) | 是 |
H5 运行时 | frontend/h5/index.html | src/platform/h5/main.ts | 部署 H5 应用程序 | Hash | 是(运行时模式) | 是 |
开发环境 | frontend/dev/index.html | src/platform/dev/main.ts | 应用 / 模板设计器 | Hash | 是 | 否(由设计器添加) |
认证流程 | frontend/auth.html | src/auth.ts | 独立认证流程 | Hash 或 History | 是 | 否 |
主应用入口点服务于三个主要上下文:管理后台、工作台和认证页面。

主应用定义了三个布局上下文及其相应的路由:

主应用使用基于白名单的访问控制系统:
['/login', '/unauthorized', '/register', '/password'] 返回 trueundefined,允许自定义处理STORAGE_KEYACCESS_PRIVATE_KEYWeb、H5 和 UniApp 平台运行时共享通用的架构模式,但在平台特定实现上有所不同。

createProvider () 函数使用平台特定配置调用:
Web 平台配置
createProvider({
nodeEnv: preview ? NodeEnv.Development : NodeEnv.Production,
mode: ContextMode.Runtime,
service,
project: {
id: code,
platform: AppPlatform.Web
},
materialPath: MATERIAL_PATH,
dependencies: {
Vue: () => import('vue'),
VueRouter: () => import('vue-router'),
Pinia: () => import('pinia')
},
router,
enableStaticRoute: true,
routeAppendTo: ROUTER_APPEND_TO,
adapter: {
notify,
loading,
alert,
useTitle
}
});AppPlatform.H5@vtj/uni 处理平台特定组件setupUniApp() 进行特殊初始化平台运行时使用最小化路由,因为页面由 VTJ 渲染器动态创建:
Web/H5 路由器:
createRouter({
history: createWebHashHistory(),
routes: [
{
path: '/',
component: Page,
name: ROUTER_APPEND_TO // 渲染器将路由追加到这里
},
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: NotFound
}
]
});支持的 URL 模式:
/web/:code/#/page/:fileId/web/:code/preview/#/page/:fileId/web/:code/version/:versionId/#/page/:fileId平台运行时使用不同的上下文模式:
模式 | 值 | 使用场景 | 描述 |
|---|---|---|---|
运行时 | ContextMode.Runtime | Web/H5/UniApp 平台 | 部署应用程序的生产运行时 |
开发环境 | NodeEnv.Development | 预览模式 (preview=true) | 启用开发功能 |
生产环境 | NodeEnv.Production | 生产部署 | 优化的运行时 |
开发环境提供用于创建和编辑应用程序和模板的设计器界面。


设计器支持平台特定的 URL:
/dev/web/#/app/:code?id=xxx/dev/h5/#/app/:code?id=xxx/dev/uniapp/#/app/:code?id=xxx/dev/web/#/template/:id/dev/h5/#/template/:id/dev/uniapp/#/template/:idtemplates/ 目录包含可以独立生成和使用的独立项目模板。
系统提供三种模板类型:

所有模板都遵循使用 LocalService 的类似初始化模式:
Web 模板:
const app = createApp(App);
const adapter = createAdapter({ loading, notify, Startup, useTitle });
const service = new LocalService(createServiceRequest(notify));
const { provider, onReady } = createProvider({
nodeEnv: process.env.NODE_ENV as NodeEnv,
mode: ContextMode.Raw,
modules: createModules(),
adapter,
service,
router,
dependencies: {
Vue: () => import('vue'),
VueRouter: () => import('vue-router'),
Pinia: () => import('pinia'),
VueI18n: () => import('vue-i18n')
},
project: {
id: vtj?.id || name
},
enableStaticRoute: true
});与平台运行时的关键区别:
LocalService 而不是远程服务ContextMode.Raw(非 ContextMode.Runtime)createModules() 用于本地模块定义package.json(vtj.id 或 name)模板使用最小化路由,因为 VTJ 提供者管理页面路由:
Web/H5 模板路由器:
createRouter({
history: createWebHashHistory(),
routes: [
{
path: '/unauthorized',
name: 'Unauthorized',
component: () => import('@/views/unauthorized.vue')
},
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: () => import('@/views/not-found.vue')
}
]
});前端在所有入口点使用共享的基础设施组件。

来自 @vtj/renderer 的访问控制系统在所有入口点进行配置:
配置参数:
alert:用于显示消息的警告函数storageKey:localStorage 令牌存储的键(STORAGE_KEY)privateKey:令牌加密的密钥(ACCESS_PRIVATE_KEY)whiteList:确定公共路由的函数(仅主应用)unauthorized:自定义重定向行为连接方法:
connect({ request, router, mode }):将访问控制连接到路由器和请求处理器ContextMode.Runtime(平台运行时)或 undefined(主应用)所有前端上下文共享类似的 TypeScript 声明:
Vue 组件类型增强:
declare module 'vue' {
interface ComponentCustomProperties {
$uploader: any;
$reqeust: any;
$apis: any;
$libs: any;
}
}这些全局属性由 VTJ 渲染器注入,在所有 Vue 组件中可用。
前端使用动态导入核心依赖以实现代码分割:
平台运行时和模板为 VTJ 提供者配置依赖:
Web/H5 平台依赖:
dependencies: {
Vue: () => import('vue'),
VueRouter: () => import('vue-router'),
Pinia: () => import('pinia')
}模板依赖:
dependencies: {
Vue: () => import('vue'),
VueRouter: () => import('vue-router'),
Pinia: () => import('pinia'),
VueI18n: () => import('vue-i18n')
}UniApp 依赖:
dependencies: {
VueI18n: async () => VueI18n;
}目的:这些懒加载的依赖允许 VTJ 渲染器使用与宿主应用程序相同的版本,防止版本冲突。
每个平台提供用于平台特定 UI 操作的适配器函数:

VTJ.PRO 前端架构设计为一个多上下文系统,具有五个不同的入口点:
@vtj/renderer 部署应用程序的运行时环境LocalService 的独立启动项目所有上下文共享通用基础设施(服务层、访问控制、TypeScript 配置),同时保持平台特定的实现。VTJ 渲染器(@vtj/renderer)作为核心渲染引擎,在所有平台上将 DSL 定义转换为功能性的 Vue 应用程序。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。