Skip to content

Performance: Embed package root manifests into umbraco-package.ts to reduce startup requests#22957

Merged
iOvergaard merged 4 commits into
v17/devfrom
v17/improvements/combine-package-root-manifests-and-umbraco-package-files
May 23, 2026
Merged

Performance: Embed package root manifests into umbraco-package.ts to reduce startup requests#22957
iOvergaard merged 4 commits into
v17/devfrom
v17/improvements/combine-package-root-manifests-and-umbraco-package-files

Conversation

@madsrasmussen

@madsrasmussen madsrasmussen commented May 22, 2026

Copy link
Copy Markdown
Member

Summary

Removes the two-file pattern (separate manifests.ts + umbraco-package.ts) used by all 37 packages. Manifests are now imported and exported directly from umbraco-package.ts, eliminating the dynamic js: () => import('./manifests.js') that previously forced a separate network request per bundle at startup.

These files are "setup ceremony" and not exposed/exported to external packages.

Request impact

Metric Before After Change
JS requests at startup 496 451 -45 (-9%)
Manifest requests at startup 53 11 -42 (-79%)

Test plan

  • Run npm run build:for:cms and confirm clean build with no TypeScript errors
  • Start the backoffice and verify all sections load correctly (Documents, Media, Members, Settings, etc.)
  • Open DevTools Network tab and confirm manifest request count is in line with the after figures above
  • Verify the user package public API is intact (manifests is still exported from @umbraco-cms/backoffice/user)

Related to #21152

@madsrasmussen madsrasmussen marked this pull request as ready for review May 22, 2026 13:30
Copilot AI review requested due to automatic review settings May 22, 2026 13:30
@claude

claude Bot commented May 22, 2026

Copy link
Copy Markdown

Claude finished @madsrasmussen's task in 6m 40s —— View job


PR Review

Target: origin/v17/dev · Based on commit: 5ceef8f0 · Skipped: 0 noise files out of 60 total

Removes 37 root-level manifests.ts files by inlining manifest imports directly into each package's umbraco-package.ts and replacing the lazy js: () => import('./manifests.js') with js: { manifests } — a statically-resolved object that loadManifestPlainJs already supports — reducing startup manifest requests by ~79%.


Important

  • src/Umbraco.Web.UI.Client/docs/manifests.md:219 — "Package Bundles (Internal Packages)" section still shows the old two-file pattern with js: () => import('./manifests.js') as the standard. The "Manifest Bundling" sub-section also shows a separate aggregation file. Since CLAUDE.md references these docs as authoritative for contributors and the auto-review skill uses them for pattern validation, leaving them out of sync means new packages will be scaffolded with the old pattern and flagged in review. → Update both the "Package Bundles" and "Manifest Bundling" sections to show the new inline pattern (js: { manifests } with imports directly in umbraco-package.ts).

  • src/Umbraco.Web.UI.Client/docs/package-development.md:22 — Folder structure still lists manifests.ts as an expected root-level file (manifests.ts <- aggregates all module manifests). Same authoritativeness concern as above. → Remove the root-level manifests.ts entry from the diagram. Sub-feature manifests.ts files are unchanged and can stay.

Suggestions

  • src/Umbraco.Web.UI.Client/src/packages/block/umbraco-package.ts:6 — Carries forward a TODO and two commented-out lines for a "custom-view" from the old manifests.ts. Since this PR consolidates the file, it's a natural opportunity to either resolve the TODO or delete the dead code rather than migrating it. Fix this →

  • src/Umbraco.Web.UI.Client/src/packages/documents/umbraco-package.ts:8 — Type annotation is Array<UmbExtensionManifest | UmbExtensionManifestKind> (requires importing UmbExtensionManifestKind). Several other packages use just Array<UmbExtensionManifest> (e.g. health-check, language) and others are untyped (e.g. user). Functionally fine since TypeScript infers correctly, but it'd be worth picking one convention across all migrated packages.


Approved with Suggestions for improvement

Good to go, but please carefully consider the importance of the suggestions. The doc updates in particular are worth doing before merge so contributors and the auto-review tooling stay in sync with the new convention.

@claude claude Bot added area/frontend category/performance Fixes for performance (generally cpu or memory) fixes labels May 22, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR reduces Backoffice startup network requests by removing the per-package “root manifests” entry module and embedding each package’s root manifests directly into umbraco-package.ts, so the bundle no longer needs to dynamically import ./manifests.js at runtime.

Changes:

  • Updates Vite library entrypoints to stop emitting manifests.ts as a separate entry chunk (both default config and per-package overrides).
  • Moves each package’s root manifests export into umbraco-package.ts and deletes the now-redundant manifests.ts file.
  • Changes bundle extensions from js: () => import('./manifests.js') to js: { manifests } so manifests are available without an extra request.

Reviewed changes

Copilot reviewed 96 out of 96 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/Umbraco.Web.UI.Client/src/vite-config-base.ts Removes manifests.ts from the default library entry list.
src/Umbraco.Web.UI.Client/src/packages/webhook/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/webhook/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/user/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/user/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/user/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/user/index.ts Re-exports manifests from umbraco-package.js (since manifests.js is no longer emitted).
src/Umbraco.Web.UI.Client/src/packages/umbraco-news/vite.config.ts Removes manifests.ts from explicit entry array.
src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/umbraco-news/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/ufm/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/ufm/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/translation/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/translation/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/tiptap/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/tiptap/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/templating/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/templating/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/templating/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/telemetry/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/telemetry/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/telemetry/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/tags/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/tags/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/sysinfo/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/sysinfo/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/static-file/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/static-file/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/settings/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/settings/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/segment/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/segment/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/rte/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/rte/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/relations/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/relations/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/relations/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/publish-cache/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/publish-cache/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/publish-cache/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/property-editors/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/property-editors/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/property-editors/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/preview/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/preview/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/performance-profiling/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/performance-profiling/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/performance-profiling/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/packages/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/packages/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/packages/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/multi-url-picker/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/multi-url-picker/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/models-builder/vite.config.ts Removes manifests.ts from explicit entry array.
src/Umbraco.Web.UI.Client/src/packages/models-builder/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/models-builder/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/members/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/members/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/members/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/media/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/media/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/media/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/markdown-editor/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/markdown-editor/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/management-api/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/management-api/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/log-viewer/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/log-viewer/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/language/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/language/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/help/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/help/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/health-check/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/health-check/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/extension-insights/vite.config.ts Removes manifests.ts from explicit entry array.
src/Umbraco.Web.UI.Client/src/packages/extension-insights/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/extension-insights/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/embedded-media/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/embedded-media/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/documents/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/documents/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/documents/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/dictionary/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/dictionary/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/data-type/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/data-type/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/content/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/content/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/content/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/code-editor/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/code-editor/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/clipboard/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/clipboard/manifests.ts Deletes redundant root manifests entry module.
src/Umbraco.Web.UI.Client/src/packages/block/vite.config.ts Removes manifests.ts from explicit build entry map.
src/Umbraco.Web.UI.Client/src/packages/block/umbraco-package.ts Embeds root manifests into umbraco-package.ts and switches bundle js to an object export.
src/Umbraco.Web.UI.Client/src/packages/block/manifests.ts Deletes redundant root manifests entry module.

@madsrasmussen

Copy link
Copy Markdown
Member Author

Based on the Claude review:

  • I have updated both docs to reflect the changes.
  • I won't fix the TODO now, as it wasn't introduced by this PR.
  • The type alignment is for another PR and was not introduced by this PR.

@iOvergaard iOvergaard merged commit e06a583 into v17/dev May 23, 2026
34 checks passed
@iOvergaard iOvergaard deleted the v17/improvements/combine-package-root-manifests-and-umbraco-package-files branch May 23, 2026 08:09
iOvergaard pushed a commit that referenced this pull request May 27, 2026
…educe startup requests (#22957)

* Consolidate block package into index export

* keep umbraco-package.ts and embed manifests instead

* Inline package manifests into umbraco-package

* update docs
iOvergaard pushed a commit that referenced this pull request May 27, 2026
…educe startup requests (#22957)

* Consolidate block package into index export

* keep umbraco-package.ts and embed manifests instead

* Inline package manifests into umbraco-package

* update docs
iOvergaard added a commit that referenced this pull request May 28, 2026
PR #22995 added `input-tiptap.stories.ts` with an import from
`'../../manifests.js'`, but PR #22957 (already on release/17.5.0) had
deleted that file and moved the `manifests` array into
`umbraco-package.ts`. The merge into release/17.5.0 didn't catch the dead
import, so Storybook 404s on the story load.

Point the import at the new home — `manifests` is still exported by name,
so this is a one-line path fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
iOvergaard added a commit that referenced this pull request May 28, 2026
PR #22957 deleted every package's `manifests.ts` and consolidated the
exports into `umbraco-package.ts`, but `.storybook/preview.js` still
imported from the old paths. The result was a Vite resolve error during
`npm run build-storybook` (first failure: "Could not resolve
../src/packages/block/manifests from .storybook/preview.js").

37 import paths swapped from `…/<pkg>/manifests` to
`…/<pkg>/umbraco-package`. The two packages that still expose their
manifests via a standalone `manifests.ts` — `core` and `core/search` —
are left untouched.

Verified by `npm run build-storybook` — succeeds.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
iOvergaard added a commit that referenced this pull request May 28, 2026
PR #22995 added `input-tiptap.stories.ts` with an import from
`'../../manifests.js'`, but PR #22957 (already on release/17.5.0) had
deleted that file and moved the `manifests` array into
`umbraco-package.ts`. The merge into release/17.5.0 didn't catch the dead
import, so Storybook 404s on the story load.

Point the import at the new home — `manifests` is still exported by name,
so this is a one-line path fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
iOvergaard added a commit that referenced this pull request May 28, 2026
PR #22957 deleted every package's `manifests.ts` and consolidated the
exports into `umbraco-package.ts`, but `.storybook/preview.js` still
imported from the old paths. The result was a Vite resolve error during
`npm run build-storybook` (first failure: "Could not resolve
../src/packages/block/manifests from .storybook/preview.js").

37 import paths swapped from `…/<pkg>/manifests` to
`…/<pkg>/umbraco-package`. The two packages that still expose their
manifests via a standalone `manifests.ts` — `core` and `core/search` —
are left untouched.

Verified by `npm run build-storybook` — succeeds.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@iOvergaard iOvergaard changed the title Backoffice: Embed package root manifests into umbraco-package.ts to reduce startup requests Performance: Embed package root manifests into umbraco-package.ts to reduce startup requests May 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants