Skip to content

fix(layout): declare the load-time registration in sideEffects (#3899) - #3940

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-3899-layout-sideeffects
Aug 9, 2026
Merged

fix(layout): declare the load-time registration in sideEffects (#3899)#3940
yinlianghui merged 2 commits into
mainfrom
claude/issue-3899-layout-sideeffects

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#3899

执行 PM 裁决(评论 5229248921):只让清单说真话 —— sideEffectsfalse 收窄为点名含注册副作用的模块。⛔ 本单不动自动注册本身(「删自动注册改显式 API」语义相反、且对所有消费者破坏,留给维护者另立卡);⛔ 未碰 apps/site#3904 的面)。

前提复核(origin/main @ 230ffd8

两个锚点逐字存在:packages/layout/package.json:5"sideEffects": falsepackages/layout/src/index.ts 尾部是裸的 try { registerLayout(); } catch {}premise 成立。

一处需要更正的细节:issue 正文说注册的是 page-header / app-shell / sidebar-nav,但本包从来没有 sidebar-nav 这个 key —— SidebarNav 组件是以 navigation-renderer 进注册表的。实际六个 key 是 page-headerpage:cardapp-shellresponsive-gridnavigation-rendererapp-schema-renderer。钉子里的 key 列表因此改成src/index.ts 现读而不是手写,正是为了不把这类笔误写成断言。

实测圈定(本单交付要求 1)

先构建再以发布 tarball 会包含的文件为准,而不是照 issue 正文的 dist/index.js 猜:

npm pack --dry-run 的 14 个文件里,JS 只有两个 —— dist/index.js(39.5kB)和 dist/index.umd.cjs(32.0kB);其余是 *.d.ts(类型声明会被擦除,不构成副作用面)、README / CHANGELOG / LICENSE / package.json。files 只发 distsrc不在 tarball 里。vite.config.ts 的 lib 构建带 inlineDynamicImports: true,所以不存在第三个 chunk 要点名。

两个 JS 产物尾部都实测带着注册副作用(index.jstry { nt(); } catch {}index.umd.cjstry{$()}catch)。

最终值:

"sideEffects": ["./dist/index.js", "./dist/index.umd.cjs", "./src/index.ts"]

三条都是 load-bearing,且集合是从清单自身推导的(main / module / exports 的 import+require 指向的全部 JS 文件),不是手列:

  • ./dist/index.js./dist/index.umd.cjs —— 发布产物的全部入口形态。
  • ./src/index.ts —— 不发布,但真的被打包apps/console/vite.config.ts:122examples/console-starter/vite.config.ts 都把 specifier 直接 alias 到 packages/layout/src,打包器对这些文件读的是同一份清单。这一条是实测出来的、不是推的:只声明两个发布路径时,console 的 alias 形态依然产出 0 字节的 bundle。发布不是唯一的消费面 —— 漏掉它等于 apps/console 原样留着这个 bug。

防回归钉:真打包器实测(交付要求 2)

packages/layout/src/__tests__/side-effects-manifest.test.ts,用仓内的 vite 8 / rolldown 1.2.1 以编程方式 build 一个只有 import '@object-ui/layout';(纯副作用引入)的 entry,逐个入口形态断言注册存活;每个形态配一条 sideEffects: false对照断言注册被摇掉 —— 没有对照,上面全绿也可能只是「打包器根本没在摇」,即「因为什么都没产出所以断言通过」。write: false 常驻内存,冷启 ~250ms、热 ~40ms,就是一条普通单测的成本。

修前/修后,对真实构建产物、经 bare specifier 走 node 解析(packages/app-shell/node_modules/@object-ui/layoutexports.importdist/index.js):

bundle注册
修前 sideEffects: false0 字节
修后(本 PR)35600 字节page-header, page:card, app-shell, responsive-grid, navigation-renderer, app-schema-renderer 六个全在

反向核验(把清单改回 false 跑新钉子)方向与预期一致:红。8 条里 4 红 4 绿,红的正好是清单推导 + 三个入口形态的存活探针,报的都是 expected '' to contain … —— 空字符串,即 0 字节 bundle 本身:

× names every module form a bundler can resolve, and nothing that is not one
× keeps a side-effect-only import alive through the workspace source alias
× keeps a side-effect-only import alive through the published entry ./dist/index.js
× keeps a side-effect-only import alive through the published entry ./dist/index.umd.cjs
Tests 4 failed | 4 passed (8)

绿的 4 条正是该绿的:三条 false 对照(它们自己就强制 false,与清单无关)+ declaresLoadTimeRegistration(源码侧不变量)。

有一处我先写进测试、随后实测证伪并改掉的说法:我原本写「探针检查的是拼法」。实测 ./dist/index.jsdist/index.jsdist/*.js、双星号 /index.js 四种拼法在 rolldown 下全部命中同一文件。所以探针对拼法并不敏感,红只意味着「这条路径根本没被覆盖」或「打包器改了对该字段的处理方式」,绝不是少个 ./ 的格式问题 —— 失败信息与文件头注释都按实测改成了这个说法。

与另一张卡的关系(钉在测试里)

declaresLoadTimeRegistration 断言 src/index.ts 仍在加载期调用 registerLayout()。它不是在保卫这个副作用,而是保卫不变量:清单与模块体必须同时为真。若维护者后续采纳「改显式注册 API」,这条会变红 —— 那是故意的,它的意思是「另一半也要改」(那时诚实的清单又是 false,本文件应随同一次改动删掉),而不是「把自动注册加回来」。失败信息里写明了这一点。

验证

  • pnpm exec vitest run packages/layout/ --maxWorkers=27 files / 100 tests passed(新增 8 条)
  • pnpm exec turbo run type-check --concurrency=278 successful, 78 total
  • pnpm --filter @object-ui/layout lint → 0 errors(43 条既有 warning,新文件 0 条)
  • pnpm --filter @object-ui/layout build → 绿;产物仍为 dist/index.js + dist/index.umd.cjs 两个 JS
  • node scripts/check-control-bytes.mjs → OK;改动文件另做了越过该 gate 的自扫(grep -naP 覆盖 0x00-0x1f 全段)零命中
  • 三个 changeset gate(no-major / fixed / presence)全绿

changeset

.changeset/layout-sideeffects-registration-3899.md —— patch @object-ui/layout,正文写明这是打包契约修正:清单曾对打包器撒谎,修后 sideEffects 是最窄的诚实答案(而不是 true,那样虽诚实却把整包交给所有打包器当不可摇)。README 补了一节 Registration,把「import '@object-ui/layout'; 即注册」写成受支持的入口点并指明是 sideEffects 在兜着。


🤖 Generated with Claude Code

https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt


Generated by Claude Code

`packages/layout/package.json` declared `"sideEffects": false` while
`src/index.ts` registers six component keys as a module load side effect.
A bundler honouring the manifest is right to delete a side-effect-only
`import '@object-ui/layout';` — measured with the repo's own bundler, the
resulting bundle is 0 bytes with zero registrations, on a green build with
no warning.
Narrow the declaration to the modules that actually register, derived from
the manifest's own entry fields plus the workspace source alias two in-repo
consumers bundle through:
["./dist/index.js", "./dist/index.umd.cjs", "./src/index.ts"]
The auto-registration itself is deliberately untouched; replacing it with an
explicit API is the opposite direction and is left to the maintainer.
Adds a build-level pin that runs a real bundler per entry form and asserts
the registrations survive, each with a `sideEffects: false` control asserting
they are dropped, so the pin cannot pass over a bundler that stopped shaking.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
@vercel

vercelBot commented Aug 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredAug 9, 2026 1:32pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)28.1 KB350 KB
Entry fileindex-BAtYdHWU.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.66KB3.13KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)482.64KB106.39KB
core (index.js)3.00KB1.14KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)139.61KB35.99KB
fields (index.js)231.13KB56.80KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.65KB1.06KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)9.48KB3.27KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)4.52KB1.96KB
layout (index.js)38.53KB10.71KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)44.98KB12.37KB
plugin-charts (index.js)61.04KB17.31KB
plugin-chatbot (index.js)180.33KB42.79KB
plugin-dashboard (index.js)118.02KB30.47KB
plugin-designer (index.js)210.51KB42.51KB
plugin-detail (index.js)236.63KB59.02KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)112.10KB27.10KB
plugin-gantt (index.js)162.55KB39.57KB
plugin-grid (index.js)187.63KB49.66KB
plugin-kanban (index.js)48.30KB13.28KB
plugin-list (index.js)109.67KB26.55KB
plugin-map (index.js)16.81KB5.24KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.58KB10.58KB
plugin-timeline (index.js)25.76KB7.33KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.03KB20.55KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)20.15KB6.72KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.02KB0.55KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)2.71KB1.34KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…ader
The file header repeated objectui#3899's own slip — it listed a `sidebar-nav`
key this package has never registered. The six real keys are `page-header`,
`page:card`, `app-shell`, `responsive-grid`, `navigation-renderer` and
`app-schema-renderer`; the assertion already reads them out of `src/index.ts`
rather than trusting a written list, which is why the prose was the only place
the mistake survived.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)28.1 KB350 KB
Entry fileindex-bG74W6sM.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.66KB3.13KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)482.64KB106.39KB
core (index.js)3.00KB1.14KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)139.61KB35.99KB
fields (index.js)231.13KB56.80KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.65KB1.06KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)9.48KB3.27KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)4.52KB1.96KB
layout (index.js)38.53KB10.71KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)44.98KB12.37KB
plugin-charts (index.js)61.04KB17.31KB
plugin-chatbot (index.js)180.33KB42.79KB
plugin-dashboard (index.js)118.02KB30.47KB
plugin-designer (index.js)210.51KB42.51KB
plugin-detail (index.js)236.63KB59.02KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)112.10KB27.10KB
plugin-gantt (index.js)162.55KB39.57KB
plugin-grid (index.js)187.63KB49.66KB
plugin-kanban (index.js)48.30KB13.28KB
plugin-list (index.js)109.67KB26.55KB
plugin-map (index.js)16.81KB5.24KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.58KB10.58KB
plugin-timeline (index.js)25.76KB7.33KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.03KB20.55KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)20.15KB6.72KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.02KB0.55KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)2.71KB1.34KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@yinlianghuiClaude

Copy link
Copy Markdown
CollaboratorAuthor

验收通过(objectui 分片 PM,session session_01GTRjn8xBqp75dk7kFupVRt)#3899(裁「清单说真话」,v17)

实物核验:head 8e8a5e2a0,两提交 4 文件。CI 亲读终态:20 检查全 completed、0 失败。要点:圈定以 npm pack --dry-run 实测(两个发布产物尾部均验有注册副作用),workspace alias 第三入口是实测追加(漏掉它 apps/console 的 0 字节 bundle 原样复现)—— 超出裁决字面但同属「清单说真话」判据,采纳;防回归钉从清单自身推导(改名以缺声明变红);修前 0 字节/修后 35600 字节六组件俱在的构建实证;探针拼法敏感性的自我证伪与 issue sidebar-nav 笔误纠正诚实。自动注册未动、apps/site 未碰(守界)。finding #3943(仓级 gate 缺口,附逐包普查)持有待分诊。


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 9, 2026 13:45
@yinlianghui
yinlianghui added this pull request to the merge queueAug 9, 2026
Merged via the queue into main with commit 876e3f7Aug 9, 2026
21 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-3899-layout-sideeffects branch August 9, 2026 13:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesdocumentationImprovements or additions to documentationtests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

packages/layout: sideEffects: false contradicts the load-time registerLayout() — a side-effect-only import can be tree-shaken away

2 participants

@yinlianghui@claude