Skip to content

Conversation

@jsnajdr
Copy link
Member

@jsnajdr jsnajdr commented Nov 24, 2025

This is an alternative to #73422 that solves the same problem with a different method.

When preparing a package to be consumed by other package or published to NPM, we used to transpile every file individually and copy the entire directory structure to build or build-module. For example, packages/block-editor/src/components/block-actions/index.js would be transpiled (JSX syntax, TypeScript, ...) and written into packages/block-editor/build-module/components/block-actions/index.js. One by one.

After this PR, we bundle all the sources together into just one big packages/block-editor/build-module/index.js file. That's the only JS export anyway, and the inner structure should be completely hidden to an outside consumer, especially if the consumer respects the modern exports field in package.json.

There's not always just one export: we also have additional exports defined in wpScriptModuleExports, and we respect them and bundle them separately. For example, block-editor exports . and ./utils/fit-text-frontend. Therefore, in the build-module folder you'll find two output files:

build-module/index.js
build-module/utils/fit-text-frontend.js

Reasons for doing this:

  1. It fully eliminates all internal relative imports, like import x from './x.js', exactly all the import that Build: Add post-processing step to ensure fully specified ESM relative import paths #73422 tries to post-process. These relative imports are bundled now.
  2. We already use a bundler for the transpilePackage task, and it already does bundling for CSS imports. These imports are not left unchanged, like the relative JS imports are, but the CSS is inlined. This PR takes the bundling step to its logical end.

This will be a breaking change for anyone who does "internal" imports like import from '@wordpress/block-editor/build-module/...'. This will stop working because the imported file will no longer exist. You need to import everything through the official exports, i.e., the root index.js file.

@jsnajdr
Copy link
Member Author

jsnajdr commented Nov 24, 2025

There's plenty of e2e failures, let's see what causes them. I did a quick local check before submitting the PR and the editor loaded OK.

@github-actions
Copy link

github-actions bot commented Nov 24, 2025

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: jsnajdr <[email protected]>
Co-authored-by: aduth <[email protected]>
Co-authored-by: mirka <[email protected]>
Co-authored-by: youknowriad <[email protected]>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@jsnajdr
Copy link
Member Author

jsnajdr commented Nov 26, 2025

I did a quick local check before submitting the PR and the editor loaded OK.

Turns out I was looking at a different wp-env instance, the editor is currently completely broken with this PR. 🤦‍♂️ And the reason is an interesting esbuild tree shaking puzzle.

There is the admin-ui package which is bundled. It's not a standalone script or a script module, but is bundled both by scripts (editor) and script modules (routes/*). This package contains a BreadCrumb component which imports from @wordpress/route. And @wordpress/route is solely a script module, there's no way how a mere script can interpret and use it.

Now we have the editor script which bundles @wordpress/admin-ui. If the script tried to use BreadCrumbs, it would fail because of the @wordpress/route import that is invalid in scripts. Fortunately the script doesn't use the component and the BreadCrumbs code is eliminated by tree shaking.

But after this PR, that tree shaking doesn't work any more. Why? There are two ways how things can be eliminated by tree shaking:

  • in the original trunk build, the code is in multiple files. There is admin-ui/build-module/index.js which imports and re-exports admin-ui/build-module/breadcrumbs/index.js. Here the bundler detects that the re-export is not used and eliminates an entire file. Including the offending @wordpress/route import.
  • after this PR, the admin-ui package is bundled into one file, admin-ui/build-module/index.js. The BreadCrumbs code is part of that file. If the bundler wants to tree-shake BreadCrumbs, it has to erase the code the file. That's what esbuild does, with one exception: it keeps the import '@wordpress/route' statement, because it thinks it has side-effects. And this import statement breaks the editor script.

The @wordpress/route/package.json file has the sideEffect: false flag, but esbuild doesn't see that, because the import is externalized. The bundler never looks at the package.json. Only our onResolve callback does and this callback doesn't look at sideEffects.

I'll try to fix this by returning the correct value of sideEffects from the onResolve callbacks. It's part of the OnResolveResult type, so it should work.

@github-actions
Copy link

github-actions bot commented Nov 26, 2025

Size Change: +49 kB (+1.9%)

Total Size: 2.62 MB

Filename Size Change
build/modules/abilities/index.min.js 42.3 kB -3 B (-0.01%)
build/modules/block-editor/utils/fit-text-frontend.min.js 548 B -1 B (-0.18%)
build/modules/block-library/image/view.min.js 1.94 kB -5 B (-0.26%)
build/modules/boot/index.min.js 86.3 kB -15.8 kB (-15.45%) 👏
build/modules/edit-site-init/index.min.js 2.75 kB +1.34 kB (+95.45%) 🆘
build/modules/interactivity-router/index.min.js 11.5 kB -28 B (-0.24%)
build/modules/interactivity/index.min.js 14.9 kB -9 B (-0.06%)
build/modules/lazy-editor/index.min.js 20.2 kB +1.42 kB (+7.59%) 🔍
build/modules/route/index.min.js 24.6 kB +3 B (+0.01%)
build/modules/workflow/index.min.js 38.4 kB +1.59 kB (+4.32%)
build/scripts/annotations/index.min.js 2.39 kB +9 B (+0.38%)
build/scripts/api-fetch/index.min.js 2.82 kB -12 B (-0.42%)
build/scripts/block-directory/index.min.js 9.52 kB +1.49 kB (+18.56%) ⚠️
build/scripts/block-editor/index.min.js 353 kB +39 kB (+12.42%) ⚠️
build/scripts/block-library/index.min.js 274 kB -2.44 kB (-0.88%)
build/scripts/blocks/index.min.js 56.3 kB -92 B (-0.16%)
build/scripts/commands/index.min.js 21.6 kB +1.74 kB (+8.77%) 🔍
build/scripts/components/index.min.js 271 kB -992 B (-0.36%)
build/scripts/compose/index.min.js 13.8 kB -74 B (-0.53%)
build/scripts/core-commands/index.min.js 5.56 kB +1.43 kB (+34.59%) 🚨
build/scripts/core-data/index.min.js 86.5 kB -243 B (-0.28%)
build/scripts/customize-widgets/index.min.js 13.8 kB +1.56 kB (+12.67%) ⚠️
build/scripts/data/index.min.js 9.6 kB -21 B (-0.22%)
build/scripts/date/index.min.js 23.6 kB +6 B (+0.03%)
build/scripts/dom/index.min.js 4.91 kB +6 B (+0.12%)
build/scripts/edit-post/index.min.js 19.8 kB +3.52 kB (+21.6%) 🚨
build/scripts/edit-site/index.min.js 234 kB +413 B (+0.18%)
build/scripts/edit-widgets/index.min.js 22 kB +1.98 kB (+9.93%) ⚠️
build/scripts/editor/index.min.js 284 kB +187 B (+0.07%)
build/scripts/element/index.min.js 5.2 kB +2 B (+0.04%)
build/scripts/format-library/index.min.js 12.3 kB +1.45 kB (+13.37%) ⚠️
build/scripts/hooks/index.min.js 1.82 kB -5 B (-0.27%)
build/scripts/i18n/index.min.js 2.46 kB -4 B (-0.16%)
build/scripts/is-shallow-equal/index.min.js 569 B +1 B (+0.18%)
build/scripts/list-reusable-blocks/index.min.js 2.43 kB -6 B (-0.25%)
build/scripts/media-utils/index.min.js 72.4 kB +2.91 kB (+4.18%)
build/scripts/notices/index.min.js 1.12 kB +10 B (+0.9%)
build/scripts/nux/index.min.js 3.27 kB +1.39 kB (+73.8%) 🆘
build/scripts/patterns/index.min.js 9.41 kB +1.53 kB (+19.44%) ⚠️
build/scripts/plugins/index.min.js 3.52 kB +1.38 kB (+64.16%) 🆘
build/scripts/preferences-persistence/index.min.js 2.15 kB -2 B (-0.09%)
build/scripts/preferences/index.min.js 4.69 kB +1.38 kB (+41.75%) 🚨
build/scripts/reusable-blocks/index.min.js 4.35 kB +1.42 kB (+48.57%) 🚨
build/scripts/rich-text/index.min.js 12.9 kB -27 B (-0.21%)
build/scripts/router/index.min.js 5.95 kB -8 B (-0.13%)
build/scripts/server-side-render/index.min.js 1.9 kB -1 B (-0.05%)
build/scripts/style-engine/index.min.js 2.33 kB -7 B (-0.3%)
build/scripts/theme/index.min.js 20.7 kB -22 B (-0.11%)
build/scripts/viewport/index.min.js 1.23 kB +6 B (+0.49%)
build/scripts/warning/index.min.js 456 B +2 B (+0.44%)
build/scripts/widgets/index.min.js 9.35 kB +1.53 kB (+19.63%) 🚨
ℹ️ View Unchanged
Filename Size
build/modules/a11y/index.min.js 355 B
build/modules/block-library/accordion/view.min.js 779 B
build/modules/block-library/file/view.min.js 346 B
build/modules/block-library/form/view.min.js 528 B
build/modules/block-library/navigation/view.min.js 1.03 kB
build/modules/block-library/query/view.min.js 518 B
build/modules/block-library/search/view.min.js 498 B
build/modules/block-library/tabs/view.min.js 859 B
build/modules/core-abilities/index.min.js 890 B
build/modules/interactivity-router/full-page.min.js 451 B
build/modules/latex-to-mathml/index.min.js 56.5 kB
build/modules/latex-to-mathml/loader.min.js 131 B
build/scripts/a11y/index.min.js 1.06 kB
build/scripts/autop/index.min.js 2.18 kB
build/scripts/blob/index.min.js 631 B
build/scripts/block-serialization-default-parser/index.min.js 1.16 kB
build/scripts/block-serialization-spec-parser/index.min.js 3.08 kB
build/scripts/data-controls/index.min.js 793 B
build/scripts/deprecated/index.min.js 752 B
build/scripts/dom-ready/index.min.js 476 B
build/scripts/escape-html/index.min.js 586 B
build/scripts/html-entities/index.min.js 494 B
build/scripts/keyboard-shortcuts/index.min.js 1.57 kB
build/scripts/keycodes/index.min.js 1.53 kB
build/scripts/primitives/index.min.js 1.01 kB
build/scripts/priority-queue/index.min.js 1.61 kB
build/scripts/private-apis/index.min.js 1.06 kB
build/scripts/react-i18n/index.min.js 832 B
build/scripts/react-refresh-entry/index.min.js 9.44 kB
build/scripts/react-refresh-runtime/index.min.js 3.59 kB
build/scripts/redux-routine/index.min.js 3.36 kB
build/scripts/shortcode/index.min.js 1.58 kB
build/scripts/token-list/index.min.js 739 B
build/scripts/undo-manager/index.min.js 917 B
build/scripts/url/index.min.js 3.98 kB
build/scripts/vendors/react-dom.min.js 43 kB
build/scripts/vendors/react-jsx-runtime.min.js 691 B
build/scripts/vendors/react.min.js 4.27 kB
build/scripts/wordcount/index.min.js 1.04 kB
build/styles/block-directory/style-rtl.css 1.05 kB
build/styles/block-directory/style.css 1.05 kB
build/styles/block-editor/content-rtl.css 4.8 kB
build/styles/block-editor/content.css 4.79 kB
build/styles/block-editor/default-editor-styles-rtl.css 224 B
build/styles/block-editor/default-editor-styles.css 224 B
build/styles/block-editor/style-rtl.css 16.4 kB
build/styles/block-editor/style.css 16.4 kB
build/styles/block-library/accordion-heading/style-rtl.css 325 B
build/styles/block-library/accordion-heading/style.css 325 B
build/styles/block-library/accordion-item/style-rtl.css 180 B
build/styles/block-library/accordion-item/style.css 180 B
build/styles/block-library/accordion-panel/style-rtl.css 99 B
build/styles/block-library/accordion-panel/style.css 99 B
build/styles/block-library/accordion/style-rtl.css 62 B
build/styles/block-library/accordion/style.css 62 B
build/styles/block-library/archives/editor-rtl.css 61 B
build/styles/block-library/archives/editor.css 61 B
build/styles/block-library/archives/style-rtl.css 90 B
build/styles/block-library/archives/style.css 90 B
build/styles/block-library/audio/editor-rtl.css 149 B
build/styles/block-library/audio/editor.css 151 B
build/styles/block-library/audio/style-rtl.css 132 B
build/styles/block-library/audio/style.css 132 B
build/styles/block-library/audio/theme-rtl.css 134 B
build/styles/block-library/audio/theme.css 134 B
build/styles/block-library/avatar/editor-rtl.css 115 B
build/styles/block-library/avatar/editor.css 115 B
build/styles/block-library/avatar/style-rtl.css 104 B
build/styles/block-library/avatar/style.css 104 B
build/styles/block-library/breadcrumbs/style-rtl.css 203 B
build/styles/block-library/breadcrumbs/style.css 203 B
build/styles/block-library/button/editor-rtl.css 265 B
build/styles/block-library/button/editor.css 265 B
build/styles/block-library/button/style-rtl.css 554 B
build/styles/block-library/button/style.css 554 B
build/styles/block-library/buttons/editor-rtl.css 291 B
build/styles/block-library/buttons/editor.css 291 B
build/styles/block-library/buttons/style-rtl.css 349 B
build/styles/block-library/buttons/style.css 349 B
build/styles/block-library/calendar/style-rtl.css 239 B
build/styles/block-library/calendar/style.css 239 B
build/styles/block-library/categories/editor-rtl.css 132 B
build/styles/block-library/categories/editor.css 131 B
build/styles/block-library/categories/style-rtl.css 152 B
build/styles/block-library/categories/style.css 152 B
build/styles/block-library/classic-rtl.css 321 B
build/styles/block-library/classic.css 321 B
build/styles/block-library/code/editor-rtl.css 53 B
build/styles/block-library/code/editor.css 53 B
build/styles/block-library/code/style-rtl.css 139 B
build/styles/block-library/code/style.css 139 B
build/styles/block-library/code/theme-rtl.css 122 B
build/styles/block-library/code/theme.css 122 B
build/styles/block-library/columns/editor-rtl.css 108 B
build/styles/block-library/columns/editor.css 108 B
build/styles/block-library/columns/style-rtl.css 421 B
build/styles/block-library/columns/style.css 421 B
build/styles/block-library/comment-author-avatar/editor-rtl.css 124 B
build/styles/block-library/comment-author-avatar/editor.css 124 B
build/styles/block-library/comment-author-name/style-rtl.css 72 B
build/styles/block-library/comment-author-name/style.css 72 B
build/styles/block-library/comment-content/style-rtl.css 120 B
build/styles/block-library/comment-content/style.css 120 B
build/styles/block-library/comment-date/style-rtl.css 65 B
build/styles/block-library/comment-date/style.css 65 B
build/styles/block-library/comment-edit-link/style-rtl.css 70 B
build/styles/block-library/comment-edit-link/style.css 70 B
build/styles/block-library/comment-reply-link/style-rtl.css 71 B
build/styles/block-library/comment-reply-link/style.css 71 B
build/styles/block-library/comment-template/style-rtl.css 191 B
build/styles/block-library/comment-template/style.css 191 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.css 122 B
build/styles/block-library/comments-pagination-numbers/editor.css 121 B
build/styles/block-library/comments-pagination/editor-rtl.css 168 B
build/styles/block-library/comments-pagination/editor.css 168 B
build/styles/block-library/comments-pagination/style-rtl.css 201 B
build/styles/block-library/comments-pagination/style.css 201 B
build/styles/block-library/comments-title/editor-rtl.css 75 B
build/styles/block-library/comments-title/editor.css 75 B
build/styles/block-library/comments/editor-rtl.css 842 B
build/styles/block-library/comments/editor.css 842 B
build/styles/block-library/comments/style-rtl.css 637 B
build/styles/block-library/comments/style.css 637 B
build/styles/block-library/common-rtl.css 1.11 kB
build/styles/block-library/common.css 1.11 kB
build/styles/block-library/cover/editor-rtl.css 631 B
build/styles/block-library/cover/editor.css 631 B
build/styles/block-library/cover/style-rtl.css 1.82 kB
build/styles/block-library/cover/style.css 1.81 kB
build/styles/block-library/details/editor-rtl.css 65 B
build/styles/block-library/details/editor.css 65 B
build/styles/block-library/details/style-rtl.css 86 B
build/styles/block-library/details/style.css 86 B
build/styles/block-library/editor-elements-rtl.css 75 B
build/styles/block-library/editor-elements.css 75 B
build/styles/block-library/editor-rtl.css 11.8 kB
build/styles/block-library/editor.css 11.8 kB
build/styles/block-library/elements-rtl.css 54 B
build/styles/block-library/elements.css 54 B
build/styles/block-library/embed/editor-rtl.css 331 B
build/styles/block-library/embed/editor.css 331 B
build/styles/block-library/embed/style-rtl.css 448 B
build/styles/block-library/embed/style.css 448 B
build/styles/block-library/embed/theme-rtl.css 133 B
build/styles/block-library/embed/theme.css 133 B
build/styles/block-library/file/editor-rtl.css 324 B
build/styles/block-library/file/editor.css 324 B
build/styles/block-library/file/style-rtl.css 278 B
build/styles/block-library/file/style.css 278 B
build/styles/block-library/footnotes/style-rtl.css 198 B
build/styles/block-library/footnotes/style.css 197 B
build/styles/block-library/form-input/editor-rtl.css 229 B
build/styles/block-library/form-input/editor.css 229 B
build/styles/block-library/form-input/style-rtl.css 366 B
build/styles/block-library/form-input/style.css 366 B
build/styles/block-library/form-submission-notification/editor-rtl.css 344 B
build/styles/block-library/form-submission-notification/editor.css 341 B
build/styles/block-library/form-submit-button/style-rtl.css 69 B
build/styles/block-library/form-submit-button/style.css 69 B
build/styles/block-library/freeform/editor-rtl.css 2.59 kB
build/styles/block-library/freeform/editor.css 2.59 kB
build/styles/block-library/gallery/editor-rtl.css 615 B
build/styles/block-library/gallery/editor.css 616 B
build/styles/block-library/gallery/style-rtl.css 1.84 kB
build/styles/block-library/gallery/style.css 1.84 kB
build/styles/block-library/gallery/theme-rtl.css 108 B
build/styles/block-library/gallery/theme.css 108 B
build/styles/block-library/group/editor-rtl.css 335 B
build/styles/block-library/group/editor.css 335 B
build/styles/block-library/group/style-rtl.css 103 B
build/styles/block-library/group/style.css 103 B
build/styles/block-library/group/theme-rtl.css 79 B
build/styles/block-library/group/theme.css 79 B
build/styles/block-library/heading/style-rtl.css 205 B
build/styles/block-library/heading/style.css 205 B
build/styles/block-library/html/editor-rtl.css 419 B
build/styles/block-library/html/editor.css 419 B
build/styles/block-library/image/editor-rtl.css 763 B
build/styles/block-library/image/editor.css 763 B
build/styles/block-library/image/style-rtl.css 1.6 kB
build/styles/block-library/image/style.css 1.59 kB
build/styles/block-library/image/theme-rtl.css 137 B
build/styles/block-library/image/theme.css 137 B
build/styles/block-library/latest-comments/style-rtl.css 355 B
build/styles/block-library/latest-comments/style.css 354 B
build/styles/block-library/latest-posts/editor-rtl.css 139 B
build/styles/block-library/latest-posts/editor.css 138 B
build/styles/block-library/latest-posts/style-rtl.css 520 B
build/styles/block-library/latest-posts/style.css 520 B
build/styles/block-library/list/style-rtl.css 107 B
build/styles/block-library/list/style.css 107 B
build/styles/block-library/loginout/style-rtl.css 61 B
build/styles/block-library/loginout/style.css 61 B
build/styles/block-library/math/editor-rtl.css 105 B
build/styles/block-library/math/editor.css 105 B
build/styles/block-library/math/style-rtl.css 61 B
build/styles/block-library/math/style.css 61 B
build/styles/block-library/media-text/editor-rtl.css 321 B
build/styles/block-library/media-text/editor.css 320 B
build/styles/block-library/media-text/style-rtl.css 543 B
build/styles/block-library/media-text/style.css 542 B
build/styles/block-library/more/editor-rtl.css 393 B
build/styles/block-library/more/editor.css 393 B
build/styles/block-library/navigation-link/editor-rtl.css 645 B
build/styles/block-library/navigation-link/editor.css 647 B
build/styles/block-library/navigation-link/style-rtl.css 190 B
build/styles/block-library/navigation-link/style.css 188 B
build/styles/block-library/navigation-submenu/editor-rtl.css 295 B
build/styles/block-library/navigation-submenu/editor.css 294 B
build/styles/block-library/navigation/editor-rtl.css 2.24 kB
build/styles/block-library/navigation/editor.css 2.24 kB
build/styles/block-library/navigation/style-rtl.css 2.27 kB
build/styles/block-library/navigation/style.css 2.25 kB
build/styles/block-library/nextpage/editor-rtl.css 392 B
build/styles/block-library/nextpage/editor.css 392 B
build/styles/block-library/page-list/editor-rtl.css 356 B
build/styles/block-library/page-list/editor.css 356 B
build/styles/block-library/page-list/style-rtl.css 192 B
build/styles/block-library/page-list/style.css 192 B
build/styles/block-library/paragraph/editor-rtl.css 251 B
build/styles/block-library/paragraph/editor.css 251 B
build/styles/block-library/paragraph/style-rtl.css 341 B
build/styles/block-library/paragraph/style.css 340 B
build/styles/block-library/post-author-biography/style-rtl.css 74 B
build/styles/block-library/post-author-biography/style.css 74 B
build/styles/block-library/post-author-name/style-rtl.css 69 B
build/styles/block-library/post-author-name/style.css 69 B
build/styles/block-library/post-author/style-rtl.css 188 B
build/styles/block-library/post-author/style.css 189 B
build/styles/block-library/post-comments-count/style-rtl.css 72 B
build/styles/block-library/post-comments-count/style.css 72 B
build/styles/block-library/post-comments-form/editor-rtl.css 96 B
build/styles/block-library/post-comments-form/editor.css 96 B
build/styles/block-library/post-comments-form/style-rtl.css 525 B
build/styles/block-library/post-comments-form/style.css 525 B
build/styles/block-library/post-comments-link/style-rtl.css 71 B
build/styles/block-library/post-comments-link/style.css 71 B
build/styles/block-library/post-content/style-rtl.css 61 B
build/styles/block-library/post-content/style.css 61 B
build/styles/block-library/post-date/style-rtl.css 62 B
build/styles/block-library/post-date/style.css 62 B
build/styles/block-library/post-excerpt/editor-rtl.css 71 B
build/styles/block-library/post-excerpt/editor.css 71 B
build/styles/block-library/post-excerpt/style-rtl.css 155 B
build/styles/block-library/post-excerpt/style.css 155 B
build/styles/block-library/post-featured-image/editor-rtl.css 719 B
build/styles/block-library/post-featured-image/editor.css 717 B
build/styles/block-library/post-featured-image/style-rtl.css 347 B
build/styles/block-library/post-featured-image/style.css 347 B
build/styles/block-library/post-navigation-link/style-rtl.css 215 B
build/styles/block-library/post-navigation-link/style.css 214 B
build/styles/block-library/post-template/style-rtl.css 414 B
build/styles/block-library/post-template/style.css 414 B
build/styles/block-library/post-terms/style-rtl.css 96 B
build/styles/block-library/post-terms/style.css 96 B
build/styles/block-library/post-time-to-read/style-rtl.css 70 B
build/styles/block-library/post-time-to-read/style.css 70 B
build/styles/block-library/post-title/style-rtl.css 162 B
build/styles/block-library/post-title/style.css 162 B
build/styles/block-library/preformatted/style-rtl.css 125 B
build/styles/block-library/preformatted/style.css 125 B
build/styles/block-library/pullquote/editor-rtl.css 133 B
build/styles/block-library/pullquote/editor.css 133 B
build/styles/block-library/pullquote/style-rtl.css 365 B
build/styles/block-library/pullquote/style.css 365 B
build/styles/block-library/pullquote/theme-rtl.css 176 B
build/styles/block-library/pullquote/theme.css 176 B
build/styles/block-library/query-pagination-numbers/editor-rtl.css 121 B
build/styles/block-library/query-pagination-numbers/editor.css 118 B
build/styles/block-library/query-pagination/editor-rtl.css 154 B
build/styles/block-library/query-pagination/editor.css 154 B
build/styles/block-library/query-pagination/style-rtl.css 237 B
build/styles/block-library/query-pagination/style.css 237 B
build/styles/block-library/query-title/style-rtl.css 64 B
build/styles/block-library/query-title/style.css 64 B
build/styles/block-library/query-total/style-rtl.css 64 B
build/styles/block-library/query-total/style.css 64 B
build/styles/block-library/query/editor-rtl.css 438 B
build/styles/block-library/query/editor.css 438 B
build/styles/block-library/quote/style-rtl.css 238 B
build/styles/block-library/quote/style.css 238 B
build/styles/block-library/quote/theme-rtl.css 233 B
build/styles/block-library/quote/theme.css 236 B
build/styles/block-library/read-more/style-rtl.css 131 B
build/styles/block-library/read-more/style.css 131 B
build/styles/block-library/reset-rtl.css 472 B
build/styles/block-library/reset.css 472 B
build/styles/block-library/rss/editor-rtl.css 126 B
build/styles/block-library/rss/editor.css 126 B
build/styles/block-library/rss/style-rtl.css 284 B
build/styles/block-library/rss/style.css 283 B
build/styles/block-library/search/editor-rtl.css 199 B
build/styles/block-library/search/editor.css 199 B
build/styles/block-library/search/style-rtl.css 665 B
build/styles/block-library/search/style.css 666 B
build/styles/block-library/search/theme-rtl.css 113 B
build/styles/block-library/search/theme.css 113 B
build/styles/block-library/separator/editor-rtl.css 100 B
build/styles/block-library/separator/editor.css 100 B
build/styles/block-library/separator/style-rtl.css 248 B
build/styles/block-library/separator/style.css 248 B
build/styles/block-library/separator/theme-rtl.css 195 B
build/styles/block-library/separator/theme.css 195 B
build/styles/block-library/shortcode/editor-rtl.css 286 B
build/styles/block-library/shortcode/editor.css 286 B
build/styles/block-library/site-logo/editor-rtl.css 773 B
build/styles/block-library/site-logo/editor.css 770 B
build/styles/block-library/site-logo/style-rtl.css 218 B
build/styles/block-library/site-logo/style.css 218 B
build/styles/block-library/site-tagline/editor-rtl.css 87 B
build/styles/block-library/site-tagline/editor.css 87 B
build/styles/block-library/site-tagline/style-rtl.css 65 B
build/styles/block-library/site-tagline/style.css 65 B
build/styles/block-library/site-title/editor-rtl.css 85 B
build/styles/block-library/site-title/editor.css 85 B
build/styles/block-library/site-title/style-rtl.css 143 B
build/styles/block-library/site-title/style.css 143 B
build/styles/block-library/social-link/editor-rtl.css 314 B
build/styles/block-library/social-link/editor.css 314 B
build/styles/block-library/social-links/editor-rtl.css 339 B
build/styles/block-library/social-links/editor.css 338 B
build/styles/block-library/social-links/style-rtl.css 1.51 kB
build/styles/block-library/social-links/style.css 1.51 kB
build/styles/block-library/spacer/editor-rtl.css 346 B
build/styles/block-library/spacer/editor.css 346 B
build/styles/block-library/spacer/style-rtl.css 48 B
build/styles/block-library/spacer/style.css 48 B
build/styles/block-library/style-rtl.css 16.5 kB
build/styles/block-library/style.css 16.5 kB
build/styles/block-library/tab/style-rtl.css 202 B
build/styles/block-library/tab/style.css 202 B
build/styles/block-library/table-of-contents/style-rtl.css 83 B
build/styles/block-library/table-of-contents/style.css 83 B
build/styles/block-library/table/editor-rtl.css 394 B
build/styles/block-library/table/editor.css 394 B
build/styles/block-library/table/style-rtl.css 641 B
build/styles/block-library/table/style.css 640 B
build/styles/block-library/table/theme-rtl.css 152 B
build/styles/block-library/table/theme.css 152 B
build/styles/block-library/tabs/editor-rtl.css 236 B
build/styles/block-library/tabs/editor.css 236 B
build/styles/block-library/tabs/style-rtl.css 983 B
build/styles/block-library/tabs/style.css 983 B
build/styles/block-library/tag-cloud/editor-rtl.css 92 B
build/styles/block-library/tag-cloud/editor.css 92 B
build/styles/block-library/tag-cloud/style-rtl.css 248 B
build/styles/block-library/tag-cloud/style.css 248 B
build/styles/block-library/template-part/editor-rtl.css 368 B
build/styles/block-library/template-part/editor.css 368 B
build/styles/block-library/template-part/theme-rtl.css 113 B
build/styles/block-library/template-part/theme.css 113 B
build/styles/block-library/term-count/style-rtl.css 63 B
build/styles/block-library/term-count/style.css 63 B
build/styles/block-library/term-description/style-rtl.css 126 B
build/styles/block-library/term-description/style.css 126 B
build/styles/block-library/term-name/style-rtl.css 62 B
build/styles/block-library/term-name/style.css 62 B
build/styles/block-library/term-template/editor-rtl.css 225 B
build/styles/block-library/term-template/editor.css 225 B
build/styles/block-library/term-template/style-rtl.css 114 B
build/styles/block-library/term-template/style.css 114 B
build/styles/block-library/text-columns/editor-rtl.css 95 B
build/styles/block-library/text-columns/editor.css 95 B
build/styles/block-library/text-columns/style-rtl.css 165 B
build/styles/block-library/text-columns/style.css 165 B
build/styles/block-library/theme-rtl.css 715 B
build/styles/block-library/theme.css 719 B
build/styles/block-library/verse/style-rtl.css 123 B
build/styles/block-library/verse/style.css 123 B
build/styles/block-library/video/editor-rtl.css 415 B
build/styles/block-library/video/editor.css 416 B
build/styles/block-library/video/style-rtl.css 202 B
build/styles/block-library/video/style.css 202 B
build/styles/block-library/video/theme-rtl.css 134 B
build/styles/block-library/video/theme.css 134 B
build/styles/commands/style-rtl.css 1.72 kB
build/styles/commands/style.css 1.72 kB
build/styles/components/style-rtl.css 14 kB
build/styles/components/style.css 14 kB
build/styles/customize-widgets/style-rtl.css 1.44 kB
build/styles/customize-widgets/style.css 1.44 kB
build/styles/edit-post/classic-rtl.css 426 B
build/styles/edit-post/classic.css 427 B
build/styles/edit-post/style-rtl.css 3.38 kB
build/styles/edit-post/style.css 3.38 kB
build/styles/edit-site/style-rtl.css 15.9 kB
build/styles/edit-site/style.css 16 kB
build/styles/edit-widgets/style-rtl.css 4.62 kB
build/styles/edit-widgets/style.css 4.62 kB
build/styles/editor/style-rtl.css 18.6 kB
build/styles/editor/style.css 18.6 kB
build/styles/format-library/style-rtl.css 326 B
build/styles/format-library/style.css 326 B
build/styles/list-reusable-blocks/style-rtl.css 1.02 kB
build/styles/list-reusable-blocks/style.css 1.02 kB
build/styles/media-utils/style-rtl.css 400 B
build/styles/media-utils/style.css 400 B
build/styles/nux/style-rtl.css 622 B
build/styles/nux/style.css 618 B
build/styles/patterns/style-rtl.css 611 B
build/styles/patterns/style.css 611 B
build/styles/preferences/style-rtl.css 415 B
build/styles/preferences/style.css 415 B
build/styles/reusable-blocks/style-rtl.css 275 B
build/styles/reusable-blocks/style.css 275 B
build/styles/widgets/style-rtl.css 1.17 kB
build/styles/widgets/style.css 1.18 kB

compressed-size-action

"sideEffects": [
"build-style/**",
"src/**/*.scss",
"{src,build,build-module}/*/init.js"
Copy link
Member Author

Choose a reason for hiding this comment

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

The init.js files for individual blocks are still problematic. As far as I know, they are not used anywhere in the Gutenberg app. And the built package bundle (build-module/index.js) doesn't include them, because they are not imported anywhere.

They are exposed as package exports by virtue of the "./build-module/*" export in package.json. These exports are currently broken, however, because we don't build them as separate entrypoints yet.

"react-native": "src/index",
"wpScript": true,
"sideEffects": [
"{src,build,build-module}/{index.js,store/index.js}"
Copy link
Member Author

Choose a reason for hiding this comment

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

esbuild doesn't support the brace expansion syntax in globs, so this format for sideEffects doesn't work there. I'm making two changes for many package.json files in this PR:

  • for the build and build-module folders, declare the index.js file as having side effects. We don't have the build-module/store/index.js files any more.
  • convert the brace expansion syntax to an explicit list, for better bundler compat. We need to be more careful now when we don't use webpack exclusively.

return {
path: args.path,
external: true,
sideEffects: !! packageJson.sideEffects,
Copy link
Member Author

Choose a reason for hiding this comment

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

This tells the bundler whether the external import has side effects, and allows the bundler to eliminate the import completely.

This simple code is rather blunt. If a package declares only *.scss styles as side-effectful, which is rather common, we'll treat the entire package, including its JS code, as side-effectful.

It works for now, but should be expanded into really checking the list of file patterns.

@jsnajdr
Copy link
Member Author

jsnajdr commented Nov 26, 2025

The editor itself including e2e tests is now OK after the sideEffects patch. What is still failing is Storybook (npm run storybook:build):

Module build failed (from ./node_modules/babel-loader/lib/index.js):
RangeError: ./packages/components/build-module/index.js: Invalid string length
    at _append (./node_modules/@babel/generator/src/buffer.ts:270:25)
    at append (./node_modules/@babel/generator/src/buffer.ts:163:10)

The packages/components/build-module/index.js file is now a 3MB bundle of the entire package, and something in the Storybook pipeline has trouble working with such a big file.

@mirka do you have any clue what might cause this? Is there a part of Storybook that works directly with the source, e.g., doing syntax highlighting or something similar?

@mirka
Copy link
Member

mirka commented Nov 26, 2025

@mirka do you have any clue what might cause this? Is there a part of Storybook that works directly with the source, e.g., doing syntax highlighting or something similar?

The docgen maybe? I believe it's running source files through react-docgen-typescript to build the prop tables. (At least from my experience working with this docgen library directly, it starts parsing from the source files.)

@jsnajdr jsnajdr force-pushed the build/bundle-while-transpiling branch from 9527f9b to 2692a61 Compare November 28, 2025 13:12
@jsnajdr
Copy link
Member Author

jsnajdr commented Dec 1, 2025

The docgen maybe? I believe it's running source files through react-docgen-typescript to build the prop tables.

I managed to fix this error by excluding the build-module folders from babel-loader transpilation. A webpackFinal callback that finds the babel-loader rule (added by addon-webpack5-compiler-babel) and modifies its exclude field.

Seems that react-docgen-typescript works only with the type definitions in build-types and doesn't touch the large built files. After all, these files have types stripped, so the tool wouldn't find any useful info anyway.

Next possible steps to improve the Storybook build:

  • eliminate the Babel addon completely. We do transpilation (JSX) with TypeScript, so maybe all we need is to configure TS better in the Storybook config.
  • a much more ambitious step: eliminate also the webpack5 builder 🙂 And replace it with something custom based on our esbuild pipeline.

@aduth
Copy link
Member

aduth commented Dec 1, 2025

  • a much more ambitious step: eliminate also the webpack5 builder 🙂 And replace it with something custom based on our esbuild pipeline.

Related: #72488

@jsnajdr jsnajdr force-pushed the build/bundle-while-transpiling branch 2 times, most recently from b61a095 to d7f84ce Compare December 4, 2025 13:07
@github-actions
Copy link

github-actions bot commented Dec 4, 2025

Flaky tests detected in f41e47d.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/20026376102
📝 Reported issues:

const srcPathNormalized = normalizePath(
path.join( packageDir, srcPath )
);
// Find the real source file, with one of the supported extensions, with `glob`.
Copy link
Member

Choose a reason for hiding this comment

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

Another niche feature where I happen to have a package tailored to it 😅 https://github.com/aduth/resolve-file-extension Not sure if the approach may be more optimized.

Comment on lines +993 to +997
const rootCjsExport = rootExport.require || rootExport.default;
if ( rootCjsExport ) {
addBuildPath( cjsEntryPoints, rootCjsExport );
}
const rootModuleExport = rootExport.import || rootExport.default;
Copy link
Member

Choose a reason for hiding this comment

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

Is checking || rootExport.default for both of these valid? Shouldn't default only match for one or the other?

}

// Add `index` and `init` scripts for each block.
if ( packageName === 'block-library' ) {
Copy link
Member

Choose a reason for hiding this comment

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

Wonder if there's a way we can make this more generic without building in awareness of specific packages. I think the approach has generally been to try to abstract custom wp* properties that are defined at the package level to support specific behaviors like this.

@youknowriad
Copy link
Contributor

For me this PR as it stands feels like it's doing too much (I'm willing to be convinced). It's fixing side effects which seems like a good change but also changing how we transpile packages to avoid just fixing the exported file name extensions. Isn't there a simpler way to solve this that is esbuild native (tell it to generate the right extensions and the right imports)

I think "bundling" during transpiration phase is a big change and I'm not sure we understand all what it means.

@jsnajdr
Copy link
Member Author

jsnajdr commented Dec 5, 2025

I think "bundling" during transpiration phase is a big change and I'm not sure we understand all what it means.

Yes, I agree that this is most likely an unsuccessful experiment. It completely reorganizes the package structure, with uncertain consequences for consumers.

The bundled index.js files can be big, up to 3MB. And the Storybook fix shows that Babel can have problems working with such files. We've see Node.js failures (RangeError when appending to a big string) and Babel warnings:

[BABEL] Note: The code generator has deoptimised the styling of {filename} as it exceeds the max of 500KB.

I'll now do the following:

  • merge the side-effects and Storybook changes as separate PRs, as they are valuable and may improve build times and bundle sizes.
  • explore configuring esbuild to output compliant relative import statements on its own.

@jsnajdr
Copy link
Member Author

jsnajdr commented Dec 8, 2025

Closing this after merging the valuable parts separately (#73780 and #73795) and after the much simpler alternative in #73822 looks much more promising.

@jsnajdr jsnajdr closed this Dec 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Type] Build Tooling Issues or PRs related to build tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants