Backstage v1.9.0-next.3 预发布版本深度解析跨标签页存储同步、Base URL 重写修复与生态依赖波次【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstageBackstage 的 v1.9.0-next.3 是 1.9.0 发布周期中的第三个预发布快照本版本没有引入新功能核心工作是修复前端运行时core-app-api的两个关键问题——localStorage跨标签页同步通知与 Base URL 自动重写——并围绕前端核心依赖core-app-api / core-components / core-plugin-api向后端新插件系统backend-plugin-api 0.2.0推进了一场覆盖数十个插件的依赖升级波次。阅读本文后你将理解 Backstage 预发布版本的 changelog 结构、两条运行时修复的底层实现原理以及如何在升级时按依赖波次评估影响面。版本背景如何阅读 next.x 预发布 changelogBackstage 采用 changesets 管理版本每个 PR 都会携带一条变更记录发布时由 create-release-changelog.js 汇总生成 changelog并借助 pin-workspace-versions.js 等脚本统一锁定 monorepo 内各包版本。v1.9.0-next.3中的next.3表示 1.9.0 正式发布前的第三个候选快照其版本号后缀如core-app-api1.2.1-next.3与正式版一一对应发布后即收敛为1.2.1。从 changelog 结构看一个典型的 next 版本条目包含两类信息Patch Changes 中的实质变更带 commit 前缀如653d7912ac:的描述行这是本期真正值得关注的功能改动或缺陷修复Updated dependencies 列表该包依赖的其他包及其新版本用于描述依赖波次的传导关系。v1.9.0-next.3 覆盖约 90 个包含example-app、example-backend两个示例应用其中实质变更只有 6 条其余全部是依赖更新。下面先从实质变更讲起。核心运行时修复一WebStorage 跨标签页同步通知变更条目backstage/core-app-api1.2.1-next.3653d7912ac: Made WebStorage notify its subscribers when localStorage values change in other tabs/windows这是本期最有技术含量的一条修复。WebStorage是StorageApi基于浏览器localStorage的默认实现核心文件为 packages/core-app-api/src/apis/implementations/StorageApi/WebStorage.ts。修复前WebStorage只会在同一标签页内调用set/remove时通过内部的subscribers集合触发notifyChanges当用户在另一个标签页修改同名 key 时当前页面的订阅者收不到任何通知。修复的实现思路如下均为当前仓库源码可验证的事实注册浏览器级storage事件监听WebStorage.addStorageEventListenerL50-L58通过window.addEventListener(storage, ...)监听浏览器原生存储事件——该事件只在其他标签页修改localStorage时触发与同一标签页内的写入天然互补private static addStorageEventListener() { window.addEventListener(storage, event { for (const [bucketPath, webStorage] of buckets.entries()) { if (event.key?.startsWith(bucketPath)) { webStorage.handleStorageChange(event.key); } } }); }全局 bucket 注册表模块级buckets new Mapstring, WebStorage()L25保存所有已创建的 bucketforBucket(name)以${namespace}/${name}为键复用实例监听器据此把事件路由到正确的实例。key 归属过滤与子 bucket 隔离handleStorageChangeL114-L125先校验event.key是否以当前实例 namespace 开头再剔除 namespace 前缀得到本地 key若本地 key 仍包含/说明是子 bucket 的变更当前 bucket 不响应——避免父子 bucket 之间产生重复通知。编码一致性写入时getKeyNameL127-L129用encodeURIComponent(key)生成localStorage键名事件回调中则用decodeURIComponent(trimmedKey)还原保证跨标签页收到的事件 key 与订阅者注册的 key 完全对齐。此外snapshotL64-L84在解析 JSON 时会递归Object.freeze冻结返回值并把解析失败的错误上报给ErrorApi。升级到该版本后多标签页共用用户设置的场景如主题、语言偏好、通知设置将保持实时一致。核心运行时修复二Base URL 自动重写变更条目backstage/core-app-api1.2.1-next.36870b43dd1: Fix for the automatic rewriting of base URLsBackstage 支持将app.baseUrl与backend.baseUrl配置为对外域名如https://example.com同时允许用户通过反向代理在任意自定义域名/端口下访问。为兼容这种场景前端在启动时会自动把配置中的 URL 重写为当前页面 origin 下的地址实现在 packages/core-app-api/src/app/overrideBaseUrlConfigs.tsfunction createLocalBaseUrl(fullUrl: string): string { const url new URL(fullUrl); url.protocol document.location.protocol; url.hostname document.location.hostname; url.port document.location.port; return url.toString().replace(/\/$/, ); }createLocalBaseUrlL22-L28保留原 URL 的路径pathname只把协议、主机名、端口替换为当前document.location的值。overrideBaseUrlConfigsL37-L83)的具体规则为仅当app.baseUrl与backend.baseUrl的origin 相同时才允许重写backend.baseUrl避免前端域名与后端域名不一致时误改后端地址重写结果与原值不同才追加新配置以context: relative-resolver标记来源与原配置合并后追加者覆盖前者测试场景下两者均可选getOptionalString不影响配置校验。重写后的backend.baseUrl会被 FrontendHostDiscovery 读取并拼接各插件的 API 路径也会被IdentityAuthInjectorFetchMiddlewarepackages/core-app-api/src/apis/implementations/FetchApi/IdentityAuthInjectorFetchMiddleware.ts用于判断请求是否允许注入身份令牌。路由侧 AppRouter.tsx 的readBasePath则从app.baseUrl解析出 base path去掉尾部斜杠用于配置 React Router 的basename与登出跳转目标。这条修复确保在上述重写链路中代理部署场景下的 URL 解析不再产生偏差。CLI 与脚手架依赖清理与模板修正CLI 移除sucrase/jest-pluginbackstage/cli0.21.2-next.343b2b9c791: Removed the unused dependency on sucrase/jest-pluginsucrase/jest-plugin曾是 CLI 为 Jest 提供快速 TypeScript 转译的插件但该依赖在 CLI 的测试链中已不再被实际使用。本期从 packages/cli 的依赖清单中将其移除属于纯依赖瘦身——它不会改变backstage-cli的既有命令行为但会轻微缩小安装体积并减少依赖树中的潜在版本冲突。此类unused dependency清理是 Backstage 每个版本都会出现的常规维护动作升级时无需额外操作。create-app依赖排序与 CI 默认项目名backstage/create-app0.4.35-next.3c4788dbb58: Fix dependency ordering in templated packagesaf1358bb07: added default project name for CI job compatibilitycreate-app是npx backstage/create-app生成新 Backstage 应用的模板引擎对应仓库 packages/create-app其模板位于templates/下。本期两个修正都面向模板产物质量依赖排序修正生成出的package.json中依赖顺序此前可能不稳定影响基于文本 diff 的 CI 检查本期保证模板输出的依赖按一致顺序排列默认项目名为 CI 场景补充默认项目名使在未显式指定项目名的自动化环境中也能稳定生成符合规范的包名。UI 层与插件生态的常规修复backstage/core-components0.12.1-next.391bba69ef8: Internal refactor to remove deprecated symbolsbackstage/plugin-airbrake0.3.12-next.3151c0e1477: Remove the object-hash dependencycore-components 清理废弃符号作为全站 UI 基础库packages/core-components本期移除内部已标记 deprecated 的符号引用。这类重构不影响公共 API但意味着如果你的插件直接 import 了这些内部符号升级后需要同步清理。airbrake 移除 object-hashplugins/airbrake 插件此前依赖object-hash做对象哈希本期改为使用更轻量的等价实现或纯手工处理减少一个传递依赖。依赖升级波次两个核心层本期绝大多数包只发生依赖升级形成两条清晰的波次。前端核心层影响所有 UI 插件所有前端插件都跟随core-components/core-plugin-api/theme这条主线升级逐级传导仅列代表性链路core-plugin-api1.2.0-next.2 └─ core-app-api1.2.1-next.3 └─ app-defaults1.0.9-next.3 / dev-utils / test-utils core-components0.12.1-next.3 └─ 全部前端插件catalog / scaffolder / search / techdocs / kubernetes ... theme0.2.16稳定版无 next 后缀这一波次的关键传导细节包括plugin-catalog-react1.2.2-next.3同时依赖catalog-client1.2.0-next.1、catalog-model1.1.4-next.1、version-bridge1.0.3-next.0与plugin-catalog-common1.0.9-next.2是承接 catalog 领域变更的中枢plugin-search-react1.3.0-next.3与plugin-search-common1.2.0-next.2构成搜索领域的新基线被 adr、explore、playlist、techdocs、stack-overflow 等插件引用权限相关基线为plugin-permission-common0.7.2-next.1plugin-permission-react0.4.8-next.2被 catalog-react、playlist、scaffolder、test-utils 引用。后端核心层新后端系统推进后端侧围绕新后端系统backend system核心包形成第二波次backend-common0.17.0-next.2 ─┬─ backend-plugin-api0.2.0-next.2 ├─ backend-app-api0.2.4-next.2 └─ backend-tasks0.4.0-next.2 backend-test-utils0.1.31-next.3依赖 cli0.21.2-next.3 与上述后端核心包plugin-auth-node0.2.8-next.2、plugin-permission-node0.7.2-next.2则是后端插件共享的认证/权限基线。升级后端包时建议把backend-common、backend-plugin-api、backend-tasks视为一个整体同时升级避免混用新旧两代 API。插件生态全景本期版本一览前端插件跟随前端核心波次包版本包版本plugin-adr0.2.4-next.3plugin-github-actions0.5.12-next.3plugin-airbrake0.3.12-next.3plugin-github-deployments0.1.43-next.3plugin-allure0.1.28-next.3plugin-github-issues0.2.1-next.3plugin-analytics-module-ga0.1.23-next.3plugin-github-pull-requests-board0.1.6-next.3plugin-apache-airflow0.2.5-next.3plugin-gitops-profiles0.3.30-next.3plugin-api-docs0.8.12-next.3plugin-gocd0.1.18-next.3plugin-apollo-explorer0.1.5-next.3plugin-graphiql0.2.44-next.3plugin-azure-devops0.2.3-next.3plugin-home0.4.28-next.3plugin-azure-sites0.1.1-next.3plugin-ilert0.2.1-next.3plugin-badges0.2.36-next.3plugin-jenkins0.7.11-next.3plugin-bazaar0.2.1-next.3plugin-kafka0.3.12-next.3plugin-bitrise0.1.39-next.3plugin-kubernetes0.7.5-next.3plugin-catalog1.7.0-next.3plugin-lighthouse0.3.12-next.3plugin-catalog-graph0.2.24-next.3plugin-newrelic0.3.30-next.3plugin-catalog-import0.9.2-next.3plugin-newrelic-dashboard0.2.5-next.3plugin-catalog-react1.2.2-next.3plugin-org0.6.2-next.3plugin-cicd-statistics0.1.14-next.3plugin-org-react0.1.1-next.3plugin-cicd-statistics-module-gitlab0.1.8-next.3plugin-pagerduty0.5.5-next.3plugin-circleci0.3.12-next.3plugin-periskop0.1.10-next.3plugin-cloudbuild0.3.12-next.3plugin-playlist0.1.3-next.3plugin-code-climate0.1.12-next.3plugin-rollbar0.4.12-next.3plugin-code-coverage0.2.5-next.3plugin-scaffolder1.9.0-next.3plugin-codescene0.1.7-next.3plugin-search1.0.5-next.3plugin-config-schema0.1.35-next.3plugin-search-react1.3.0-next.3plugin-cost-insights0.12.1-next.3plugin-sentry0.4.5-next.3plugin-dynatrace1.0.2-next.3plugin-shortcuts0.3.4-next.3plugin-explore0.3.43-next.3plugin-sonarqube0.5.1-next.3plugin-firehydrant0.1.29-next.3plugin-splunk-on-call0.4.1-next.3plugin-fossa0.2.44-next.3plugin-stack-overflow0.1.8-next.3plugin-gcalendar0.3.8-next.3plugin-tech-insights0.3.4-next.3plugin-gcp-projects0.3.31-next.3plugin-tech-radar0.5.19-next.3plugin-git-release-manager0.3.25-next.3plugin-techdocs1.4.1-next.3plugin-techdocs-addons-test-utils1.0.7-next.3plugin-techdocs-module-addons-contrib1.0.7-next.3plugin-techdocs-react1.0.7-next.3plugin-todo0.2.14-next.3plugin-user-settings0.6.0-next.3plugin-vault0.1.6-next.3plugin-xcmetrics0.2.32-next.3这些前端插件的依赖集高度同构绝大多数只依赖core-components / core-plugin-api / theme部分叠加catalog-model、errors、config而catalog-react依赖链上的插件如 api-docs、org、scaffolder、techdocs还会同步引入catalog-client、catalog-common、permission-react等。scaffolder 前端plugin-scaffolder1.9.0-next.3与搜索链路plugin-search、plugin-search-react、plugin-search-common分别依赖最全是升级时重点回归的对象。后端插件与模块跟随后端核心波次包版本依赖基线plugin-bazaar-backend0.2.2-next.3backend-common / auth-node / configplugin-catalog-backend-module-incremental-ingestion0.1.0-next.2backend-common / backend-plugin-api / backend-tasks / catalog-backendplugin-kubernetes-backend0.8.1-next.3backend-common / auth-node / catalog-client / kubernetes-commonplugin-playlist-backend0.2.2-next.3backend-common / auth-node / permission-node / permission-commonplugin-stack-overflow-backend0.1.8-next.3cli / config / search-commonplugin-vault-backend0.2.5-next.3backend-common / backend-tasks / config / errors其中值得特别关注的是plugin-catalog-backend-module-incremental-ingestion0.1.0-next.2它是 0.1.x 早期版本对应仓库 plugins/catalog-backend-module-incremental-ingestion承担 catalog 的增量摄取能力同时依赖新后端系统的backend-plugin-api与backend-tasks是新老后端 API 过渡期的代表性模块。基础设施包与示例应用基础设施app-defaults1.0.9-next.3、dev-utils1.0.9-next.3、integration-react1.1.7-next.3、test-utils1.2.3-next.3、backend-test-utils0.1.31-next.3、cli0.21.2-next.3、create-app0.4.35-next.3示例应用example-app0.2.78-next.3集成上述全部前端插件、example-backend0.2.78-next.3集成 catalog-backend、scaffolder-backend、search-backend、auth-backend、techdocs-backend 等 20 余个后端插件、techdocs-cli-embedded-app0.2.77-next.3内部示例插件internal/plugin-catalog-customized0.0.5-next.3、internal/plugin-todo-list1.0.8-next.3升级路径与验证建议如果你正从 1.8.x 或 1.9.0-next.2 升级到本快照可按以下顺序评估先升级前端核心core-plugin-api→core-app-api→core-components再升级全部前端插件本期core-components移除了废弃符号若插件直接引用了这些内部符号需同步清理后端整体升级将backend-common0.17.0-next.2、backend-plugin-api0.2.0-next.2、backend-app-api0.2.4-next.2、backend-tasks0.4.0-next.2视为一组同时升级重点回归场景多标签页下的用户设置实时同步验证 WebStorage 修复、反向代理部署下的 API 请求路径验证 Base URL 重写修复、catalog 与 search 的读写链路依赖最广参考仓库内的升级资料正式发布说明见 docs/releases 目录下的版本文档版本策略与升级注意事项见 docs/overview/versioning-policy.md 与 docs/getting-started/keeping-backstage-updated.md。小结v1.9.0-next.3 是一个典型的稳根基预发布版本两条核心运行时修复WebStorage跨标签页同步、Base URL 自动重写都落在所有应用共同依赖的core-app-api上价值高于表面上的 patch 级别CLI 与 create-app 的修正提升了工具链的工程健壮性而前后端两条依赖波次的传导关系则为后续插件升级提供了清晰的参照。对于想要跟进 1.9.0 正式版的团队理解本期两个运行时修复与依赖基线是平滑升级的关键前提。【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考