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

File: Add experimental integration with Interactivity API #50377

Merged
merged 5 commits into from
May 17, 2023

Conversation

gziolo
Copy link
Member

@gziolo gziolo commented May 5, 2023

What?

Explore using the Interactivity API for the File block.

It's mostly a follow-up for #49994 where Interactivity API runtime landed.

I also spend some time looking at how we can scale the Interactivity API experiment so it is easier to convert more blocks using a more unified approach. Part of the effort included the refactoring, where I checked how we could generalize the experiment to all core blocks that want to use Interactivity API.

Why?

My main goal was to validate the current webpack configuration against integration with the existing core block. I also wanted to see how easy it is to convert an existing block to use Interactivity API.

How?

I’m still contemplating whether it’s a good idea to convert the File block to Interactivity API, as in practice, it isn’t needed at all… It only increases the bundle size (the size of runtime + directives), which people can use to counterargument the proposal. I see the value in migrating all view scripts to one approach, but I’d love to hear feedback from other folks.

Regarding the block, the only part I wasn't sure about was whether we should hide the PDF preview initially and only enable it when we ensure that the browser can support it. It's the opposite of what is in the trunk today, but I also experienced some issues with that approach when I was enforcing Safari to hide the object while it started loading the PDF document. It's hard to tell whether it's an actual issue on mobile devices that don't support PDF preview.

I explored a few changes to the webpack config:

Testing Instructions

  1. Go to the post/page editor.
  2. Insert a file block.
  3. Upload a PDF file.
  4. Ensure that "Show inline embed" option present in the sidebar is checked.
  5. Save the post/page.
  6. Navigate to the post/page and ensure that the PDF file preview is present in the supported browser.
  7. Use a tablet or a mobile device to verify that the PDF preview gets removed.

Screenshots or screencast

Show inline embed setting in the editor:

Screenshot 2023-05-08 at 21 42 46

Webpack warning addressed in this PR:

Screenshot 2023-05-08 at 09 46 06

JavaScript size before this PR:

Screenshot 2023-05-08 at 10 49 10

JavaScript size after this PR

Screenshot 2023-05-08 at 10 44 52

The size for the File block's view script is nearly the same, but we have to load the Interactivity runtime, which is around 11 kB.

@gziolo gziolo added [Type] Enhancement A suggestion for improvement. [Block] File Affects the File Block [Feature] Interactivity API API to add frontend interactivity to blocks. labels May 5, 2023
@gziolo gziolo self-assigned this May 5, 2023
@gziolo gziolo force-pushed the update/file-block-interactivity-api branch from 630294d to 335e9f8 Compare May 5, 2023 13:09
@github-actions
Copy link

github-actions bot commented May 5, 2023

Size Change: -11.2 kB (-1%)

Total Size: 1.39 MB

Filename Size Change
build/block-library/interactive-blocks/interactivity.min.js 0 B -2.19 kB (removed) 🏆
build/block-library/interactive-blocks/navigation.min.js 0 B -841 B (removed) 🏆
build/block-library/interactive-blocks/vendors.min.js 0 B -8.15 kB (removed) 🏆
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.33 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.05 kB
build/block-directory/style.css 1.05 kB
build/block-editor/content-rtl.css 4.17 kB
build/block-editor/content.css 4.16 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/index.min.js 205 kB
build/block-editor/style-rtl.css 15.4 kB
build/block-editor/style.css 15.3 kB
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 90 B
build/block-library/blocks/archives/style.css 90 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 138 B
build/block-library/blocks/audio/theme.css 138 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 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 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 121 B
build/block-library/blocks/code/style.css 121 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 409 B
build/block-library/blocks/columns/style.css 409 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 199 B
build/block-library/blocks/comment-template/style.css 198 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 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.62 kB
build/block-library/blocks/cover/style.css 1.61 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 159 B
build/block-library/blocks/details/style.css 159 B
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 138 B
build/block-library/blocks/embed/theme.css 138 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/interactivity.min.js 408 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 379 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 957 B
build/block-library/blocks/gallery/editor.css 962 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 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 340 B
build/block-library/blocks/html/editor.css 341 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 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 478 B
build/block-library/blocks/latest-posts/style.css 478 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 716 B
build/block-library/blocks/navigation-link/editor.css 715 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 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/interactivity.min.js 878 B
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.21 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 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 401 B
build/block-library/blocks/page-list/editor.css 401 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 279 B
build/block-library/blocks/paragraph/style.css 281 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 501 B
build/block-library/blocks/post-comments-form/style.css 501 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 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 322 B
build/block-library/blocks/post-featured-image/style.css 322 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 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 281 B
build/block-library/blocks/post-template/style.css 281 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 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 335 B
build/block-library/blocks/pullquote/style.css 335 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 288 B
build/block-library/blocks/query-pagination/style.css 284 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 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 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 149 B
build/block-library/blocks/rss/editor.css 149 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 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 434 B
build/block-library/blocks/search/style.css 432 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 234 B
build/block-library/blocks/separator/style.css 234 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 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/editor-rtl.css 760 B
build/block-library/blocks/site-logo/editor.css 760 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 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.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 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 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.12 kB
build/block-library/common.css 1.12 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.8 kB
build/block-library/editor.css 11.8 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 205 kB
build/block-library/interactivity/runtime.min.js 2.22 kB
build/block-library/interactivity/vendors.min.js 8.18 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.8 kB
build/block-library/style.css 12.8 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 51.1 kB
build/commands/index.min.js 15 kB
build/commands/style-rtl.css 851 B
build/commands/style.css 849 B
build/components/index.min.js 210 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.4 kB
build/core-commands/index.min.js 1.83 kB
build/core-data/index.min.js 16.6 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 718 B
build/data/index.min.js 8.73 kB
build/date/index.min.js 40.5 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.76 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 35.4 kB
build/edit-post/style-rtl.css 7.84 kB
build/edit-post/style.css 7.83 kB
build/edit-site/index.min.js 65.9 kB
build/edit-site/style-rtl.css 10.6 kB
build/edit-site/style.css 10.6 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.58 kB
build/edit-widgets/style.css 4.58 kB
build/editor/index.min.js 46.1 kB
build/editor/style-rtl.css 3.59 kB
build/editor/style.css 3.59 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.8 kB
build/format-library/style-rtl.css 577 B
build/format-library/style.css 577 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.75 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.86 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 952 B
build/react-i18n/index.min.js 702 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.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 11.1 kB
build/router/index.min.js 1.77 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.42 kB
build/style-engine/index.min.js 1.55 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.74 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.3 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@gziolo gziolo force-pushed the update/file-block-interactivity-api branch from 335e9f8 to cf365be Compare May 8, 2023 08:42
@github-actions
Copy link

github-actions bot commented May 8, 2023

Flaky tests detected in cf365be.
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/4913216119
📝 Reported issues:

@@ -39,7 +45,7 @@ function gutenberg_register_interactivity_scripts( $scripts ) {
* @return string The modified script tag.
*/
function gutenberg_interactivity_scripts_add_defer_attribute( $tag, $handle ) {
if ( str_starts_with( $handle, 'wp-interactivity-' ) ) {
if ( str_starts_with( $handle, 'wp-interactivity-' ) || str_contains( $tag, 'view/interactivity.min.js' ) ) {
Copy link
Member Author

@gziolo gziolo May 8, 2023

Choose a reason for hiding this comment

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

Assuming that we always have the Interactivity script in view/interactivity.min.js file, we can temporarily enforce defer. Otherwise, the runtime might load after the view script.

In the future, we can handle defer in the WordPress core by detecting its dependency on the wp-interactivity-runtime.

@@ -220,15 +220,21 @@ module.exports = [
].filter( Boolean ),
},
{
...baseConfig,
Copy link
Member Author

@gziolo gziolo May 8, 2023

Choose a reason for hiding this comment

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

This brings some shared setting used for all other configs:

  • Browserslist integration (see Add Interactivity API runtime #49994 (comment)).
  • Bundle analyzer integration.
  • Custom config for the terser plugin.
  • Development vs production mode aligned with how npm run build and npm run dev work.
  • Integration with devtol.

@@ -278,5 +286,12 @@ module.exports = [
},
],
},
plugins: [
...plugins,
Copy link
Member Author

@gziolo gziolo May 8, 2023

Choose a reason for hiding this comment

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

Integrates webpack plugins used with all other configs:

  • Integration with bundle analyzer.
  • Integration with the plugin that replaces globals like process.env.IS_GUTENBERG_PLUGIN, process.env.IS_WORDPRESS_CORE. Once Warning: Introduce SCRIPT_DEBUG to make the package compatible with webpack 5 #50122 lands, it would also make it possible using SCRIPT_DEBUG - that could be a way to run console.log only in development mode in a way where it's completely removed in the production build.
  • Custom setup for DependencyExtractionWebpackPlugin, that together with another WP specific plugin ReadableJsAssetsWebpackPlugin ensure that all necessary files are created in the filesystem inside build/block-library:

Screenshot 2023-05-08 at 21 04 19

entry: {
// blockname: './packages/block-library/src/blockname/interactivity.js',
file: './packages/block-library/src/file/view/interactivity.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.

This made me realize that interactive blocks are the only scripts that are transpiled with Babel from webpack. We have a two-step workflow for everything else to ensure that 3rd party projects can consume files from build (CJS) and build-module folders (ESM).

'build/block-library/interactive-blocks/vendors.min.js'
)
);
foreach ( array( 'vendors', 'runtime' ) as $script_name ) {
Copy link
Member Author

Choose a reason for hiding this comment

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

I wanted to explore how we could automate registering the runtime based on the asset files that we use for all other scripts built with webpack. In particular, the version generate is very important as it only changes when the file's content changes, so it's essential for proper caching in WordPress core.

@@ -95,9 +95,6 @@ function gutenberg_enable_experiments() {
if ( $gutenberg_experiments && array_key_exists( 'gutenberg-details-blocks', $gutenberg_experiments ) ) {
wp_add_inline_script( 'wp-block-editor', 'window.__experimentalEnableDetailsBlocks = true', 'before' );
}
if ( $gutenberg_experiments && array_key_exists( 'gutenberg-interactivity-api-navigation-block', $gutenberg_experiments ) ) {
Copy link
Member Author

Choose a reason for hiding this comment

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

window.__experimentalEnableNavigationBlockInteractivity is never used so can safely remove it.

@gziolo gziolo force-pushed the update/file-block-interactivity-api branch from 77db14b to 8939ef9 Compare May 16, 2023 13:19
@gziolo gziolo marked this pull request as ready for review May 16, 2023 13:34
@gziolo gziolo requested a review from luisherranz May 16, 2023 13:35
@luisherranz
Copy link
Member

I’m still contemplating whether it’s a good idea to convert the File block to Interactivity API, as in practice, it isn’t needed at all… It only increases the bundle size (the size of runtime + directives), which people can use to counterargument the proposal. I see the value in migrating all view scripts to one approach, but I’d love to hear feedback from other folks.

It's true that as the feature itself, migrating doesn't make much sense. But the downside of not migrating this block would be that in the future, site-wide features that require all blocks to be built with the Interactivity API, like client-side navigation, would be disabled when this block is added.

Regarding the size, here's how I see it:

  • For a site with multiple interactive blocks, the JS size of this block is similar to what it is today.
  • For a site with only this block, the size increases by 10KB.

But if a site is so simple that it has only this block, 10KB is still minimal, and the site will load quickly anyway. It won't affect the UX. It's more important to optimize for sites that have many interactive blocks.

An additional API could be created for these types of blocks to "hook" into the Interactivity API, but I believe the complexity of introducing such a feature doesn't outweigh the fact that if a site only has one interactive block, we'd be optimizing something that won't benefit from such optimization.

Copy link
Member

@luisherranz luisherranz left a comment

Choose a reason for hiding this comment

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

LGTM 🙂

Thanks for making the changes to make the experiment for other blocks than just the Navigation block.

I've just added a note about the use of data-wp-bind instead of data-wp-init.

Comment on lines 26 to 27
$processor->set_attribute( 'data-wp-init', 'effects.core.file.init' );
$processor->set_attribute( 'hidden', true );
Copy link
Member

@luisherranz luisherranz May 16, 2023

Choose a reason for hiding this comment

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

It feels a bit strange to me to use a function to mutate the DOM when we have a primitive to do so. Have you considered using data-wp-bind instead? Something like this:

$processor->set_attribute( 'data-wp-bind.hidden', '!selectors.core.browserSupportsPdfs' );
import { browserSupportsPdfs } from "./utils";

store({ selectors: { core: { browserSupportsPdfs } } });

Copy link
Member Author

Choose a reason for hiding this comment

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

Will bind run only once on the client? I wasn't sure how it would work internally.

I'm all for using bind if that is the best way to tackle it 👍🏻

Copy link
Member

Choose a reason for hiding this comment

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

Yes, it's reactive to state and context, but it won't react (rerender) because we are not accessing them, so it will only run once.

Copy link
Contributor

Choose a reason for hiding this comment

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

If I am not mistaken, it should run only once as it has no references that change. I run a quick test and that part seems to work.

However, it seems the negation operator doesn't work with selectors. My first guess is that in these functions, we are not considering properly that current can be a function. I believe this could be solved moving the hasNegationOperator logic to the getEvaluate function. Something like this:

// Resolve the path to some property of the store object.
const resolve = ( path, ctx ) => {
	let current = { ...store, context: ctx };
	path.split( '.' ).forEach( ( p ) => ( current = current[ p ] ) );
	return current;
};

// Generate the evaluate function.
const getEvaluate =
	( { ref } = {} ) =>
	( path, extraArgs = {} ) => {
		// If path starts with !, remove it and save a flag.
		const hasNegationOperator =
			path[ 0 ] === '!' && !! ( path = path.slice( 1 ) );
		const value = resolve( path, extraArgs.context );

		const returnValue =
			typeof value === 'function'
				? value( {
						ref: ref.current,
						...store,
						...extraArgs,
				  } )
				: value;

		return hasNegationOperator ? ! returnValue : returnValue;
	};

I quickly tested and it seems to work, but I am not sure if it is the correct approach.

Copy link
Member Author

Choose a reason for hiding this comment

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

I will wrap the function for now in the custom selector to handle negation, but we should follow-up with extending the handling for ! as it seems to important to have it working universally with both the context and selectors.

Copy link
Member Author

Choose a reason for hiding this comment

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

It works correctly with 2d1c63b 🎉

Copy link
Member Author

Choose a reason for hiding this comment

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

I tested that the bind never updates again with the following code:

diff --git a/lib/experimental/interactivity-api/blocks.php b/lib/experimental/interactivity-api/blocks.php
index 755c1d1d4f..8f900501f6 100644
--- a/lib/experimental/interactivity-api/blocks.php
+++ b/lib/experimental/interactivity-api/blocks.php
@@ -24,6 +24,7 @@ function gutenberg_block_core_file_add_directives_to_content( $block_content, $b
 	$processor->set_attribute( 'data-wp-island', '' );
 	$processor->next_tag( 'object' );
 	$processor->set_attribute( 'data-wp-bind.hidden', 'selectors.core.file.hasNoPdfPreview' );
+	$processor->set_attribute( 'data-wp-on.click', 'actions.core.file.incrementCount' );
 	$processor->set_attribute( 'hidden', true );
 	return $processor->get_updated_html();
 }
diff --git a/packages/block-library/src/file/interactivity.js b/packages/block-library/src/file/interactivity.js
index cf9ae41002..76696511cc 100644
--- a/packages/block-library/src/file/interactivity.js
+++ b/packages/block-library/src/file/interactivity.js
@@ -5,13 +5,27 @@ import { store } from '../utils/interactivity';
 import { browserSupportsPdfs } from './utils';
 
 store( {
+	state: {
+		count: 0,
+	},
 	selectors: {
 		core: {
 			file: {
 				hasNoPdfPreview() {
+					console.log( 'Run!' );
 					return ! browserSupportsPdfs();
 				},
 			},
 		},
 	},
+	actions: {
+		core: {
+			file: {
+				incrementCount( { state } ) {
+					state.count = state.count + 1;
+					console.log( state.count );
+				},
+			},
+		},
+	},
 } );

This is what I see printed in the console when clicking on the PDF preview:

Screenshot 2023-05-17 at 10 18 26

It made me realize that we use Preact Signals behind the scenes, which means that the selector doesn't use any signal, so it will never update as there is nothing it needs to listen to for change ...

As simple as that when you switch the mindset from React 😄

Copy link
Member

Choose a reason for hiding this comment

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

I believe this could be solved moving the hasNegationOperator logic to the getEvaluate function.

That seems much better, yes 🙂

Copy link
Contributor

Choose a reason for hiding this comment

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

I created a pull request in the block-interactivity-experiments repo to handle that. We can keep the conversation about that there.

@@ -238,12 +245,14 @@ module.exports = [
vendors: {
name: 'vendors',
test: /[\\/]node_modules[\\/]/,
Copy link
Member

Choose a reason for hiding this comment

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

I'd like to change this to the list of dependencies, even if we have to do it manually. Maybe in another PR :)

Copy link
Member Author

Choose a reason for hiding this comment

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

If I recall correctly, @DAreRodz tried listing dependencies, but you also need to list their dependencies and so on. It might be difficult to maintain, but it's worth trying.

luisherranz

This comment was marked as duplicate.

Copy link
Contributor

@SantosGuillamot SantosGuillamot left a comment

Choose a reason for hiding this comment

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

I tested the UX, and everything seems to work fine 🙂 Thanks for the pull request!

Apart from Luis' comment, it looks good to me.

@gziolo gziolo force-pushed the update/file-block-interactivity-api branch 2 times, most recently from ef99a48 to fdd4b5d Compare May 17, 2023 08:01
@gziolo gziolo force-pushed the update/file-block-interactivity-api branch from fdd4b5d to 2d1c63b Compare May 17, 2023 08:02
@gziolo
Copy link
Member Author

gziolo commented May 17, 2023

Tested in Safari on macOS:

Screenshot 2023-05-17 at 10 43 51

Tested in Safari on iOS

Hello world! – gutenberg

It works as expected 🎉

@gziolo gziolo merged commit 6f2d112 into trunk May 17, 2023
@gziolo gziolo deleted the update/file-block-interactivity-api branch May 17, 2023 08:45
@github-actions github-actions bot added this to the Gutenberg 15.9 milestone May 17, 2023
@ramonjd ramonjd added the Needs PHP backport Needs PHP backport to Core label Jun 5, 2023
@cbravobernal cbravobernal removed the Needs PHP backport Needs PHP backport to Core label Jun 15, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] File Affects the File Block [Feature] Interactivity API API to add frontend interactivity to blocks. [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants