--- title: 入口文件 description: UI 扩展部分的入口文件 --- 入口文件即 Halo 核心会加载的文件,所有插件有且只有一个入口文件,构建之后会放置在插件项目的 `src/resources/console` 下,名为 `main.js`。 为了方便开发者,我们已经在 [halo-dev/plugin-starter](https://github.com/halo-dev/plugin-starter) 配置好了基础项目结构,包括构建配置,后续文档也会以此为准。 ## 定义入口文件 ```ts title="ui/src/index.ts" import { definePlugin } from "@halo-dev/console-shared"; export default definePlugin({ components: {}, routes: [], ucRoutes: [], extensionPoints: {} }); ``` ## 类型定义 ```ts export function definePlugin(plugin: PluginModule): PluginModule { return plugin; } ``` ```ts title="PluginModule" import type { BackupTab } from "@/states/backup"; import type { CommentSubjectRefProvider } from "@/states/comment-subject-ref"; import type { EntityFieldItem } from "@/states/entity"; import type { OperationItem } from "@/states/operation"; import type { PluginInstallationTab } from "@/states/plugin-installation-tabs"; import type { ThemeListTab } from "@/states/theme-list-tabs"; import type { UserProfileTab, UserTab } from "@/states/user-tab"; import type { Attachment, Backup, ListedPost, Plugin, Theme, ListedComment, ListedReply, ListedSinglePage, } from "@halo-dev/api-client"; import type { AnyExtension } from "@halo-dev/richtext-editor"; import type { Component, Ref } from "vue"; import type { RouteRecordName, RouteRecordRaw } from "vue-router"; import type { DashboardWidgetDefinition, DashboardWidgetQuickActionItem, EditorProvider, PluginTab, } from ".."; import type { AttachmentSelectProvider } from "../states/attachment-selector"; import type { FunctionalPage } from "../states/pages"; export interface RouteRecordAppend { parentName: NonNullable; route: RouteRecordRaw; } export interface ExtensionPoint { // @deprecated "page:functional:create"?: () => FunctionalPage[] | Promise; "attachment:selector:create"?: () => | AttachmentSelectProvider[] | Promise; "editor:create"?: () => EditorProvider[] | Promise; "plugin:self:tabs:create"?: () => PluginTab[] | Promise; "default:editor:extension:create"?: () => | AnyExtension[] | Promise; "comment:subject-ref:create"?: () => CommentSubjectRefProvider[]; "backup:tabs:create"?: () => BackupTab[] | Promise; "plugin:installation:tabs:create"?: () => | PluginInstallationTab[] | Promise; "post:list-item:operation:create"?: ( post: Ref ) => OperationItem[]; "single-page:list-item:operation:create"?: ( singlePage: Ref ) => OperationItem[]; "comment:list-item:operation:create"?: ( comment: Ref ) => OperationItem[]; "reply:list-item:operation:create"?: ( reply: Ref ) => OperationItem[]; "plugin:list-item:operation:create"?: ( plugin: Ref ) => OperationItem[]; "backup:list-item:operation:create"?: ( backup: Ref ) => OperationItem[]; "attachment:list-item:operation:create"?: ( attachment: Ref ) => OperationItem[]; "plugin:list-item:field:create"?: (plugin: Ref) => EntityFieldItem[]; "post:list-item:field:create"?: (post: Ref) => EntityFieldItem[]; "single-page:list-item:field:create"?: ( singlePage: Ref ) => EntityFieldItem[]; "theme:list:tabs:create"?: () => ThemeListTab[] | Promise; "theme:list-item:operation:create"?: ( theme: Ref ) => OperationItem[]; "user:detail:tabs:create"?: () => UserTab[] | Promise; "uc:user:profile:tabs:create"?: () => | UserProfileTab[] | Promise; "console:dashboard:widgets:create"?: () => | DashboardWidgetDefinition[] | Promise; "console:dashboard:widgets:internal:quick-action:item:create"?: () => | DashboardWidgetQuickActionItem[] | Promise; } export interface PluginModule { /** * These components will be registered when plugin is activated. */ components?: Record; routes?: RouteRecordRaw[] | RouteRecordAppend[]; ucRoutes?: RouteRecordRaw[] | RouteRecordAppend[]; extensionPoints?: ExtensionPoint; } ``` - `components`:组件列表,key 为组件名称,value 为组件对象,在此定义之后,加载插件时会自动注册到 Vue App 全局。 - `routes`:Console 控制台路由定义,详细文档可参考 [路由定义](../../api-reference/ui/route.md) - `ucRoutes`:UC 个人中心路由定义,详细文档可参考 [路由定义](../../api-reference/ui/route.md) - `extensionPoints`:扩展点定义,详细文档可参考 [扩展点](../../extension-points/ui/index.md)