umbraco-extension-registry by umbraco/umbraco-cms-backoffice-skills
npx skills add https://github.com/umbraco/umbraco-cms-backoffice-skills --skill umbraco-extension-registry扩展注册表是管理所有 Umbraco 后台界面元素的核心系统——后台中几乎所有的用户界面都是由扩展注册表管理的扩展。该注册表允许开发者在运行时使用 umbExtensionsRegistry 动态地添加、移除或修改扩展。开发者拥有与 Umbraco HQ 相同的可能性,这意味着你可以更改 Umbraco 中默认存在的几乎所有内容。
在实施前请务必获取最新文档:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
const manifest = {
type: 'dashboard',
alias: 'My.Dashboard',
name: 'My Dashboard',
element: () => import('./dashboard.element.js'),
meta: {
label: 'My Dashboard',
pathname: 'my-dashboard'
}
};
umbExtensionsRegistry.register(manifest);
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
// 永久隐藏一个扩展
umbExtensionsRegistry.exclude('Umb.WorkspaceAction.Document.SaveAndPreview');
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
// 从注册表中移除扩展(可以重新注册)
umbExtensionsRegistry.unregister('My.WorkspaceAction.AutoFillWithUnicorns');
const manifest = {
type: 'workspaceAction',
alias: 'My.WorkspaceAction.ExternalPreview',
name: 'My Custom Preview',
overwrites: 'Umb.WorkspaceAction.Document.SaveAndPreview',
element: () => import('./custom-preview.element.js'),
// ... 清单的其余部分
};
umbExtensionsRegistry.register(manifest);
const manifest = {
type: 'workspaceAction',
alias: 'My.CustomSave',
name: 'My Custom Save',
overwrites: [
'Umb.WorkspaceAction.Document.SaveAndPreview',
'Umb.WorkspaceAction.Document.Save'
],
// ... 清单的其余部分
};
umbExtensionsRegistry.register(manifest);
// entrypoint.ts
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
export const onInit = (host: UmbEntryPointOnInitArgs) => {
// 排除默认仪表板
umbExtensionsRegistry.exclude('Umb.Dashboard.UmbracoNews');
// 注册自定义仪表板
umbExtensionsRegistry.register({
type: 'dashboard',
alias: 'My.CustomDashboard',
name: 'Custom Dashboard',
element: () => import('./custom-dashboard.element.js'),
meta: {
label: 'Welcome',
pathname: 'welcome'
},
conditions: [
{
alias: 'Umb.Condition.SectionAlias',
match: 'Umb.Section.Content'
}
]
});
};
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
async function registerDynamicDashboards() {
// 从服务器获取配置
const response = await fetch('/api/dashboard-config');
const dashboards = await response.json();
// 动态注册每个仪表板
dashboards.forEach(config => {
umbExtensionsRegistry.register({
type: 'dashboard',
alias: config.alias,
name: config.name,
element: () => import(config.elementPath),
meta: {
label: config.label,
pathname: config.pathname
}
});
});
}
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
// 仅在满足条件时注册扩展
if (userIsAdmin) {
umbExtensionsRegistry.register({
type: 'dashboard',
alias: 'My.AdminDashboard',
name: 'Admin Dashboard',
element: () => import('./admin-dashboard.element.js'),
meta: {
label: 'Admin',
pathname: 'admin'
}
});
}
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
// 排除多个扩展
const extensionsToHide = [
'Umb.Dashboard.UmbracoNews',
'Umb.Dashboard.RedirectManagement',
];
extensionsToHide.forEach(alias => {
umbExtensionsRegistry.exclude(alias);
});
// 注册多个扩展
const myExtensions = [
{ type: 'dashboard', alias: 'My.Dashboard1', /* ... */ },
{ type: 'dashboard', alias: 'My.Dashboard2', /* ... */ },
];
myExtensions.forEach(manifest => {
umbExtensionsRegistry.register(manifest);
});
在后台导航到:设置 > 扩展洞察,查看所有已注册的扩展。
umbExtensionsRegistry : 管理扩展的中心注册表
register() : 在运行时添加新扩展
exclude() : 永久隐藏扩展(永不显示)
unregister() : 从注册表中移除扩展(可以重新注册)
overwrites : 用自定义实现替换现有扩展
运行时 vs 静态 :
umbraco-package.jsonumbExtensionsRegistry入口点 : 在启动期间执行注册表操作的常用位置
扩展洞察 : 在 设置 > 扩展洞察 中查看所有已注册的扩展
使用场景 :
就是这样!请务必获取最新文档,保持示例简洁,生成完整可用的代码。
每周安装数
78
代码仓库
GitHub 星标数
17
首次出现
2026年2月4日
安全审计
安装于
github-copilot56
cursor26
opencode24
codex24
gemini-cli22
amp22
The Extension Registry is the core system managing all Umbraco backoffice UI elements - almost any UI in the Backoffice is an extension managed by the Extension Registry. The registry allows developers to dynamically add, remove, or modify extensions at runtime using umbExtensionsRegistry. Developers have the same possibilities as Umbraco HQ, meaning you can change almost everything that is by default present in Umbraco.
Always fetch the latest docs before implementing:
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
const manifest = {
type: 'dashboard',
alias: 'My.Dashboard',
name: 'My Dashboard',
element: () => import('./dashboard.element.js'),
meta: {
label: 'My Dashboard',
pathname: 'my-dashboard'
}
};
umbExtensionsRegistry.register(manifest);
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
// Permanently hide an extension
umbExtensionsRegistry.exclude('Umb.WorkspaceAction.Document.SaveAndPreview');
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
// Remove extension from registry (can be re-registered)
umbExtensionsRegistry.unregister('My.WorkspaceAction.AutoFillWithUnicorns');
const manifest = {
type: 'workspaceAction',
alias: 'My.WorkspaceAction.ExternalPreview',
name: 'My Custom Preview',
overwrites: 'Umb.WorkspaceAction.Document.SaveAndPreview',
element: () => import('./custom-preview.element.js'),
// ... rest of manifest
};
umbExtensionsRegistry.register(manifest);
const manifest = {
type: 'workspaceAction',
alias: 'My.CustomSave',
name: 'My Custom Save',
overwrites: [
'Umb.WorkspaceAction.Document.SaveAndPreview',
'Umb.WorkspaceAction.Document.Save'
],
// ... rest of manifest
};
umbExtensionsRegistry.register(manifest);
// entrypoint.ts
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
export const onInit = (host: UmbEntryPointOnInitArgs) => {
// Exclude default dashboard
umbExtensionsRegistry.exclude('Umb.Dashboard.UmbracoNews');
// Register custom dashboard
umbExtensionsRegistry.register({
type: 'dashboard',
alias: 'My.CustomDashboard',
name: 'Custom Dashboard',
element: () => import('./custom-dashboard.element.js'),
meta: {
label: 'Welcome',
pathname: 'welcome'
},
conditions: [
{
alias: 'Umb.Condition.SectionAlias',
match: 'Umb.Section.Content'
}
]
});
};
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
async function registerDynamicDashboards() {
// Fetch configuration from server
const response = await fetch('/api/dashboard-config');
const dashboards = await response.json();
// Register each dashboard dynamically
dashboards.forEach(config => {
umbExtensionsRegistry.register({
type: 'dashboard',
alias: config.alias,
name: config.name,
element: () => import(config.elementPath),
meta: {
label: config.label,
pathname: config.pathname
}
});
});
}
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
// Register extension only if condition is met
if (userIsAdmin) {
umbExtensionsRegistry.register({
type: 'dashboard',
alias: 'My.AdminDashboard',
name: 'Admin Dashboard',
element: () => import('./admin-dashboard.element.js'),
meta: {
label: 'Admin',
pathname: 'admin'
}
});
}
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
// Exclude multiple extensions
const extensionsToHide = [
'Umb.Dashboard.UmbracoNews',
'Umb.Dashboard.RedirectManagement',
];
extensionsToHide.forEach(alias => {
umbExtensionsRegistry.exclude(alias);
});
// Register multiple extensions
const myExtensions = [
{ type: 'dashboard', alias: 'My.Dashboard1', /* ... */ },
{ type: 'dashboard', alias: 'My.Dashboard2', /* ... */ },
];
myExtensions.forEach(manifest => {
umbExtensionsRegistry.register(manifest);
});
Navigate to: Settings > Extensions Insights in the backoffice to see all registered extensions.
umbExtensionsRegistry : Central registry for managing extensions
register() : Add new extension at runtime
exclude() : Permanently hide extension (never displayed)
unregister() : Remove extension from registry (can be re-registered)
overwrites : Replace existing extension(s) with custom implementation
Runtime vs Static :
umbraco-package.json for most extensionsumbExtensionsRegistry for dynamic/conditional registrationEntry Point : Common place to execute registry operations during startup
Extension Insights : View all registered extensions at Settings > Extensions Insights
Use Cases :
That's it! Always fetch fresh docs, keep examples minimal, generate complete working code.
Weekly Installs
78
Repository
GitHub Stars
17
First Seen
Feb 4, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
github-copilot56
cursor26
opencode24
codex24
gemini-cli22
amp22
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
120,000 周安装