Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Block Library: Make it possible to import individual blocks #42258

Merged
merged 2 commits into from
Aug 29, 2022

Conversation

gziolo
Copy link
Member

@gziolo gziolo commented Jul 8, 2022

What?

Exploration to make it possible to import individual core blocks from @wordpress/block-library.

Why?

At the moment, you can either import all core blocks with:

import { registerCoreBlocks } from '@wordpress/block-library';

registerCoreBlocks();

If you would like to import individual blocks, you can still do it, but it isn't straightforward:

import * as verse from '@wordpress/block-library/build-module/verse';

const { metadata, settings, name } = verse;
return registerBlockType( { name, ...metadata }, settings );

How?

We could organize the @wordpress/block-library package to make the following possible:

import { init } from '@wordpress/block-library/build-module/verse';

init();

or

import '@wordpress/block-library/build-module/verse/init';

or

import verseBlock from '@wordpress/block-library/build-module/verse/init';

Implementation notes

My goal was to have a more ergonomic imports without /build-module/ section like:

import '@wordpress/block-library/verse/init';

However, it isn't that simple to achieve with partial ES Modules support with exports field in the package.json file. We can change that in the future when we convert all WordPress packages to ES Modules.

Some blocks run some custom logic before registering the block so the newly introduced init method is a perfect way to postpone their executing until their are essential for the corresponding block to work correctly. This also removes the need to keep the list of block files with side-effects in `package.json.

@gziolo gziolo added [Status] In Progress Tracking issues with work in progress [Package] Block library /packages/block-library Developer Experience Ideas about improving block and theme developer experience labels Jul 8, 2022
@gziolo gziolo requested a review from sgomes July 8, 2022 07:19
@github-actions
Copy link

github-actions bot commented Jul 8, 2022

Size Change: +1.25 kB (0%)

Total Size: 1.24 MB

Filename Size Change
build/block-editor/index.min.js 160 kB +115 B (0%)
build/block-editor/style-rtl.css 15 kB -108 B (-1%)
build/block-editor/style.css 15 kB -109 B (-1%)
build/block-library/blocks/cover/editor-rtl.css 605 B -10 B (-2%)
build/block-library/blocks/cover/editor.css 607 B -9 B (-1%)
build/block-library/blocks/group/editor-rtl.css 337 B -7 B (-2%)
build/block-library/blocks/group/editor.css 337 B -7 B (-2%)
build/block-library/blocks/navigation/editor-rtl.css 1.96 kB -4 B (0%)
build/block-library/blocks/navigation/editor.css 1.96 kB -8 B (0%)
build/block-library/blocks/navigation/style-rtl.css 2.04 kB +57 B (+3%)
build/block-library/blocks/navigation/style.css 2.03 kB +52 B (+3%)
build/block-library/editor-rtl.css 10.9 kB -10 B (0%)
build/block-library/editor.css 10.9 kB -11 B (0%)
build/block-library/index.min.js 188 kB +2.13 kB (+1%)
build/block-library/style-rtl.css 11.9 kB +49 B (0%)
build/block-library/style.css 11.9 kB +49 B (0%)
build/blocks/index.min.js 49.6 kB +3 B (0%)
build/components/index.min.js 197 kB +12 B (0%)
build/components/style-rtl.css 11.5 kB -68 B (-1%)
build/components/style.css 11.6 kB -69 B (-1%)
build/core-data/index.min.js 15.4 kB -61 B (0%)
build/data/index.min.js 8.05 kB +1 B (0%)
build/edit-site/index.min.js 57.8 kB -2 B (0%)
build/editor/index.min.js 41.5 kB +25 B (0%)
build/rich-text/index.min.js 10.4 kB -765 B (-7%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.26 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 475 B
build/block-directory/index.min.js 7.06 kB
build/block-directory/style-rtl.css 990 B
build/block-directory/style.css 991 B
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 110 B
build/block-library/blocks/audio/theme.css 110 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 441 B
build/block-library/blocks/button/editor.css 441 B
build/block-library/blocks/button/style-rtl.css 505 B
build/block-library/blocks/button/style.css 505 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 187 B
build/block-library/blocks/comment-template/style.css 185 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 834 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 630 B
build/block-library/blocks/cover/style-rtl.css 1.55 kB
build/block-library/blocks/cover/style.css 1.55 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 110 B
build/block-library/blocks/embed/theme.css 110 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 253 B
build/block-library/blocks/file/style.css 254 B
build/block-library/blocks/file/view.min.js 346 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 948 B
build/block-library/blocks/gallery/editor.css 950 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 327 B
build/block-library/blocks/html/editor.css 329 B
build/block-library/blocks/image/editor-rtl.css 876 B
build/block-library/blocks/image/editor.css 873 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 110 B
build/block-library/blocks/image/theme.css 110 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 705 B
build/block-library/blocks/navigation-link/editor.css 703 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation-submenu/view.min.js 423 B
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 443 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 493 B
build/block-library/blocks/post-comments-form/style.css 493 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 507 B
build/block-library/blocks/post-featured-image/editor.css 505 B
build/block-library/blocks/post-featured-image/style-rtl.css 166 B
build/block-library/blocks/post-featured-image/style.css 166 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 282 B
build/block-library/blocks/query-pagination/style.css 278 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 439 B
build/block-library/blocks/query/editor.css 439 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 396 B
build/block-library/blocks/search/style.css 393 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 464 B
build/block-library/blocks/shortcode/editor.css 464 B
build/block-library/blocks/site-logo/editor-rtl.css 455 B
build/block-library/blocks/site-logo/editor.css 455 B
build/block-library/blocks/site-logo/style-rtl.css 192 B
build/block-library/blocks/site-logo/style.css 192 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.39 kB
build/block-library/blocks/social-links/style.css 1.38 kB
build/block-library/blocks/spacer/editor-rtl.css 322 B
build/block-library/blocks/spacer/editor.css 322 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 494 B
build/block-library/blocks/table/editor.css 494 B
build/block-library/blocks/table/style-rtl.css 611 B
build/block-library/blocks/table/style.css 609 B
build/block-library/blocks/table/theme-rtl.css 175 B
build/block-library/blocks/table/theme.css 175 B
build/block-library/blocks/tag-cloud/style-rtl.css 239 B
build/block-library/blocks/tag-cloud/style.css 239 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 561 B
build/block-library/blocks/video/editor.css 563 B
build/block-library/blocks/video/style-rtl.css 174 B
build/block-library/blocks/video/style.css 174 B
build/block-library/blocks/video/theme-rtl.css 110 B
build/block-library/blocks/video/theme.css 110 B
build/block-library/common-rtl.css 1.01 kB
build/block-library/common.css 1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 695 B
build/block-library/theme.css 700 B
build/block-serialization-default-parser/index.min.js 1.11 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/compose/index.min.js 12 kB
build/customize-widgets/index.min.js 11.3 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 653 B
build/date/index.min.js 32 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.69 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 4 kB
build/edit-navigation/style.css 4.01 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.5 kB
build/edit-post/style-rtl.css 6.94 kB
build/edit-post/style.css 6.94 kB
build/edit-site/style-rtl.css 8.22 kB
build/edit-site/style.css 8.2 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.35 kB
build/edit-widgets/style.css 4.35 kB
build/editor/style-rtl.css 3.66 kB
build/editor/style.css 3.65 kB
build/element/index.min.js 4.68 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 6.75 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.77 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.81 kB
build/list-reusable-blocks/index.min.js 1.74 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.93 kB
build/notices/index.min.js 953 B
build/nux/index.min.js 2.05 kB
build/nux/style-rtl.css 732 B
build/nux/style.css 728 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.3 kB
build/primitives/index.min.js 933 B
build/priority-queue/index.min.js 612 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.74 kB
build/reusable-blocks/index.min.js 2.21 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.53 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.61 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.2 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.19 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@gziolo gziolo force-pushed the update/block-library-import-split branch 2 times, most recently from 8107cbf to b201a0b Compare July 8, 2022 08:20
@gziolo gziolo self-assigned this Jul 8, 2022
Copy link
Contributor

@sgomes sgomes left a comment

Choose a reason for hiding this comment

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

Thank you so much for working on this, @gziolo! 🙌 Sorry for the late reply 😞

In general it looks great, but I don't think the current code reflects the code example in the PR description. Taking the archives as the example, it seems to me that the correct code should instead be:

import '@wordpress/block-library/archives/init';

if the user only cares about registering, or

import archiveBlock from '@wordpress/block-library/archives/init';

if the user wants a reference to the block after it's registered.

The other option is of course to change the code to reflect the example instead, but having a separate init.js file seems like the better and most reliable (tree-shaking-wise) option to me.

In that case, though, packages/block-library/src/archives/init.js would need to be added to the list of modules with side effects in package.json, as it performs registration at the top level, which is a side effect.

@gziolo gziolo force-pushed the update/block-library-import-split branch from b201a0b to e9d28c3 Compare July 22, 2022 09:43
@gziolo gziolo marked this pull request as ready for review July 22, 2022 11:09
@gziolo
Copy link
Member Author

gziolo commented Jul 22, 2022

@sgomes, I completed the refactoring based on your feedback. I also updated the description of the PR with the following examples:

import { init } from '@wordpress/block-library/verse';

init();

or

import '@wordpress/block-library/verse/init';

or

import verseBlock from '@wordpress/block-library/verse/init';

I added a new section to the README file for the @wordpress/block-library package that covers it as well.

I'm happy about the idea I had where I created an exported init function for every block inside their index.js file. This way I could move all side effects to be evaluated only when that function gets called. In result, the list of side effects in package.json looks as follows:

"sideEffects": [
	"build-style/**",
	"src/**/*.scss",
	"{src,build,build-module}/*/init.js"
],

The other thing I played with is exports in package.json so we don't have to use build-module for the import statements:

"exports": {
	".": {
		"import": "./build-module/index.js",
		"require": "./build/index.js"
	},
	"./babel-plugin": "./babel-plugin.js",
	"./*": "./build-module/*/index.js",
	"./*/init": "./build-module/*/init.js",
	"./utils/*": null
},

I'm using it for the first time, so I'm not entirely sure if that is correct usage. It probably will be a breaking change for projects that use undocumented code like:

import * as verse from '@wordpress/block-library/build-module/verse';

I kept CJS support for requiring only the @wordpress/block-library. It's something that we should get rid of at some point as well to make the size of the package smaller when publishing to npm.

Anyway, I'm looking for more feedback now that all the required changes are applied.

@gziolo gziolo requested review from dmsnell and adamziel July 22, 2022 12:05
@gziolo
Copy link
Member Author

gziolo commented Jul 22, 2022

This is a bit surprising. I will investigate what went wrong.

Screenshot 2022-07-22 at 14 10 11

@gziolo
Copy link
Member Author

gziolo commented Jul 22, 2022

It looks like bringing back module in package.json with 6a790d2 resolves the issue with the increased size of the @wordpress/block-library package. I will need to investigate how to update package.json correctly.

Unfortunately, having an additional init function in every core block has some tiny impact on the size of the entry point:

Screenshot 2022-07-22 at 17 14 49

@gziolo gziolo mentioned this pull request Jul 26, 2022
69 tasks
@sgomes
Copy link
Contributor

sgomes commented Aug 1, 2022

It looks like bringing back module in package.json with 6a790d2 resolves the issue with the increased size of the @wordpress/block-library package. I will need to investigate how to update package.json correctly.

Interesting, thank you for looking into that! Note that this may be an artifact of how the GH action is building things, specifically the webpack config it uses. There are a lot of moving parts with webpack and package.json, unfortunately 😞

@sgomes
Copy link
Contributor

sgomes commented Aug 1, 2022

Unfortunately, having an additional init function in every core block has some tiny impact on the size of the entry point:

That may still go away, depending on what the final package.json ends up being, but even if it stays I think it's worth the extra modularity 👍

@sgomes
Copy link
Contributor

sgomes commented Aug 1, 2022

As for the exports configuration, that one's pretty complex, with several things I hadn't seen before. It looks good, but I'm not quite sure how to test it for correctness 😕

@gziolo gziolo force-pushed the update/block-library-import-split branch from 6a790d2 to 001a83e Compare August 25, 2022 08:35
@gziolo
Copy link
Member Author

gziolo commented Aug 25, 2022

I brought this branch up to date. I was playing a bit more with the package.json changes to test whether it's possible to use simplified import paths with ES Modules syntax. However, it's something we probably can't easily offer without converting all packages to ESM first ("type": "modules"), as we learned from #43434. I tried to rename init.js files to ESM by renaming them to init.mjs but it can't be as simple as that because the code imports CJS which isn't allowed...

@gziolo
Copy link
Member Author

gziolo commented Aug 25, 2022

@sgomes, do you think it would still be valuable to include the changes and document the more verbose syntax that will work with the existing package.json:

import verseBlock from '@wordpress/block-library/build-module/verse/init';

@sgomes
Copy link
Contributor

sgomes commented Aug 25, 2022

@sgomes, do you think it would still be valuable to include the changes and document the more verbose syntax that will work with the existing package.json?

I think so, because it seems to me that having a (documented) mechanism to get proper tree-shaking, even if verbose, is better than not having that mechanism at all. Projects could start making use of it now, and then hopefully move to a terser import once everything has been converted to ESM.

Thanks again for working on this, @gziolo! 🙏

@gziolo gziolo force-pushed the update/block-library-import-split branch from 001a83e to 4c4d2c8 Compare August 26, 2022 07:25
@gziolo gziolo added [Type] New API New API to be used by plugin developers or package users. and removed [Status] In Progress Tracking issues with work in progress labels Aug 26, 2022
@gziolo
Copy link
Member Author

gziolo commented Aug 26, 2022

I think so, because it seems to me that having a (documented) mechanism to get proper tree-shaking, even if verbose, is better than not having that mechanism at all. Projects could start making use of it now, and then hopefully move to a terser import once everything has been converted to ESM.

I went ahead and updated the branch to use the paths including /build-module/ 👍🏻

I think this is ready for the final review.

Copy link
Contributor

@sgomes sgomes left a comment

Choose a reason for hiding this comment

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

LGTM from an API and documentation perspective. Thank you, @gziolo! 👍

Comment on lines +37 to +58
## Registering individual blocks

1. When you only care about registering the block when file gets imported:

```js
import '@wordpress/block-library/build-module/verse/init';
```

2. When you want to use the reference to the block after it gets automatically registered:

```js
import verseBlock from '@wordpress/block-library/build-module/verse/init';
```

3. When you need a full control over when the block gets registered:

```js
import { init } from '@wordpress/block-library/build-module/verse';

const verseBlock = init();
```

Copy link
Contributor

Choose a reason for hiding this comment

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

Perfect! Very clear and easy to follow 👍

packages/block-library/README.md Outdated Show resolved Hide resolved
@gziolo gziolo merged commit 4f7c19e into trunk Aug 29, 2022
@gziolo gziolo deleted the update/block-library-import-split branch August 29, 2022 18:22
@github-actions github-actions bot added this to the Gutenberg 14.1 milestone Aug 29, 2022
@bph bph added the Needs Dev Note Requires a developer note for a major WordPress release cycle label Sep 14, 2022
@bph bph mentioned this pull request Sep 14, 2022
89 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Developer Experience Ideas about improving block and theme developer experience Needs Dev Note Requires a developer note for a major WordPress release cycle [Package] Block library /packages/block-library [Type] New API New API to be used by plugin developers or package users.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants