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

Site Editor: Improve loading experience (v2) #47612

Closed
wants to merge 5 commits into from

Conversation

tyxla
Copy link
Member

@tyxla tyxla commented Jan 31, 2023

What?

This is an experiment - DO NOT MERGE!

This PR aims to experiment with Suspense, specifically with our useSuspenseSelect() implementation to load the site editor behind the scenes and display it once it's finished loading.

This PR is an alternative to #42525.

Why?

We're aiming to find a way to improve the editor loading experience.

As @mtias says:

The end goal should be that things load like a "screenshot"; all fully loaded when you start interacting.

See #35503 for more details and motivation.

How?

We're building on what we've learned from #42525 and borrowing the loading screen from there.

We're also introducing a new concept of SuspenseDataDependency. That is essentially a component that corresponds to a particular selector from a store that we know we're going to need somewhere in the app. That component will suspend when the data in question is still resolved. That allows us to use separate Suspense boundaries with separate data dependencies that we can specify declaratively.

With that approach, we won't need to alter blocks and other components to use useSuspendSelect.

See my self-review for additional inline information.

This is obviously not landable in this version - we'll need to do a better job tweaking the data dependencies. I'd love some feedback on suggested dependencies.

E2E tests are also expected to fail right now - they don't know about this new loading screen 😉

Testing Instructions

  • Load the site editor and observe the loading experience.
  • Observe that at the time the fallback placeholder has been hidden, the editor has more or less fully loaded.

@tyxla tyxla added [Status] In Progress Tracking issues with work in progress [Type] Performance Related to performance efforts [Type] Experimental Experimental feature or API. [Package] Edit Site /packages/edit-site [Feature] Site Editor Related to the overarching Site Editor (formerly "full site editing") labels Jan 31, 2023
@tyxla tyxla self-assigned this Jan 31, 2023
@tyxla tyxla requested a review from ellatrix as a code owner January 31, 2023 12:24
Comment on lines +24 to +36
const SuspenseDataDependency = ( { store, selector, args = [] } ) => {
useSuspenseSelect(
( select ) => select( store )[ selector ]( ...args ),
[]
);

return null;
};
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 is the component that we render for each declared data dependency. It will suspend when the data has not been resolved yet.

Comment on lines +61 to +88
{ dataDependencies.map(
( { store, selector, args }, depindex ) => (
<SuspenseDataDependency
key={ `suspense-dep-${ depindex }-${ store.name }-${ selector }` }
store={ store }
selector={ selector }
args={ args }
/>
)
) }
Copy link
Member Author

Choose a reason for hiding this comment

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

Here's where we render one SuspenseDataDependency per data dependency.

Comment on lines 165 to 207
const contentDependencies = [
// Global styles entity ID
{
store: coreStore,
selector: '__experimentalGetCurrentGlobalStylesId',
},
// Global styles entity
globalStylesId && {
store: coreStore,
selector: 'getEditedEntityRecord',
args: [ 'root', 'globalStyles', globalStylesId ],
},
// Menus
{
store: coreStore,
selector: 'getEntityRecords',
args: [ 'root', 'menu', { per_page: -1, context: 'edit' } ],
},
// Pages
{
store: coreStore,
selector: 'getEntityRecords',
args: [
'postType',
'page',
{
parent: 0,
order: 'asc',
orderby: 'id',
per_page: -1,
context: 'view',
},
],
},
].filter( Boolean );
Copy link
Member Author

@tyxla tyxla Jan 31, 2023

Choose a reason for hiding this comment

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

Here's where we specifically declare the dependencies for a suspense boundary.

Each dependency is represented by a store descriptor, selector and optional args to pass to the selector.

We'll need to tweak these a bit.

@@ -173,7 +222,9 @@ export default function Editor() {
}
notices={ isEditMode && <EditorSnackbars /> }
content={
<>
<LoadingScreen
dataDependencies={ contentDependencies }
Copy link
Member Author

Choose a reason for hiding this comment

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

Here's how we pass declared dependencies to the suspense boundary.

Technically, this gives us the flexibility to have multiple suspense boundaries that have different data dependencies.

@github-actions
Copy link

github-actions bot commented Jan 31, 2023

Size Change: +745 B (0%)

Total Size: 1.37 MB

Filename Size Change
build/block-editor/index.min.js 201 kB +335 B (0%)
build/block-editor/style-rtl.css 15.2 kB +90 B (+1%)
build/block-editor/style.css 15.2 kB +91 B (+1%)
build/edit-site/index.min.js 64.8 kB +229 B (0%)
ℹ️ 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.27 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.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.17 kB
build/block-editor/content.css 4.17 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 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 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.6 kB
build/block-library/blocks/cover/style.css 1.59 kB
build/block-library/blocks/details-summary/editor-rtl.css 65 B
build/block-library/blocks/details-summary/editor.css 65 B
build/block-library/blocks/details-summary/style-rtl.css 61 B
build/block-library/blocks/details-summary/style.css 61 B
build/block-library/blocks/details/style-rtl.css 54 B
build/block-library/blocks/details/style.css 54 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/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 353 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 984 B
build/block-library/blocks/gallery/editor.css 988 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/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 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 408 B
build/block-library/blocks/search/style.css 406 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 756 B
build/block-library/blocks/site-logo/editor.css 756 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 204 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 14.8 kB
build/commands/style-rtl.css 789 B
build/commands/style.css 786 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-data/index.min.js 16.3 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.68 kB
build/date/index.min.js 40.4 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.2 kB
build/edit-post/style-rtl.css 7.83 kB
build/edit-post/style.css 7.83 kB
build/edit-site/style-rtl.css 10.2 kB
build/edit-site/style.css 10.2 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.56 kB
build/edit-widgets/style.css 4.56 kB
build/editor/index.min.js 45.9 kB
build/editor/style-rtl.css 3.49 kB
build/editor/style.css 3.48 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 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.94 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 942 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/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 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

@jameskoster
Copy link
Contributor

Here's what I'm seeing:

loader.mp4

There appears to be one loader in the frame/canvas, then another overlay the doesn't quite cover the entire viewport. Unsure if we need both?

For a moment you're able to see the UI before the overlay appears which seems undesirable.

@tyxla
Copy link
Member Author

tyxla commented Jan 31, 2023

Thanks @jameskoster, there's definitely more that can be done on the visual part. I did most of my testing in the edit canvas mode, but I've now done some additional polish so the overlay would cover all of the viewport area.

FWIW the purpose of this PR was to demonstrate the mechanism to take advantage of useSuspenseSelect with declarative data dependencies. But I'm happy to take it further.

In any case, it seems like with the different canvas modes, we'll still have to have a single spinner/loading screen instead of the initial plan to split into multiple sections that load separately.

In the following days I'm planning to iterate and further polish the current state, which might mean at least:

  • Removing the original canvas spinner that was there before this PR, no need for double spinners.
  • Moving the suspense boundary up the tree, to make sure it gets rendered earlier.
  • Adding more dependencies to map the behavior of what data we actually need.
  • Adding a spinner on the server side so it will appear initially and not cause a flicker.

Any other feedback is welcome, of course. Thanks!

@github-actions
Copy link

Flaky tests detected in 894d3d4.
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/4055425813
📝 Reported issues:

Copy link
Contributor

@youknowriad youknowriad left a comment

Choose a reason for hiding this comment

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

What's the reasoning for picking this approach over updating the blocks that make these requests instead?

I'm asking because I believe these requests can be dynamic: like template parts (we need the ids of the template parts), query blocks (we need the actual query which is dependent on the block config), the menus (menu ids)...

@tyxla
Copy link
Member Author

tyxla commented Feb 1, 2023

What's the reasoning for picking this approach over updating the blocks that make these requests instead?

I'm asking because I believe these requests can be dynamic: like template parts (we need the ids of the template parts), query blocks (we need the actual query which is dependent on the block config), the menus (menu ids)...

Thanks for asking. This was just another, more static and declarative approach that I wanted to get out of my brain and share with y'all.

I realize the dynamic requirements and understand that it might end up being a blocker. However, this approach does have quite a few pros, too. It gives us complete control over the data we're interested in, which might be preferred in many cases. It also works without having to modify all of the components and blocks to use useSuspenseSelect, which would also be unrealistic because we obviously can't do it for all 3rd party blocks.

In any case, there are various angles we can approach this one from and I'd like to try a few different approaches before settling on a particular way forward.

For example, another alternative could be recording all requests in some sort of request tracker, then waiting for all of them to resolve, and once they do, display the fully loaded editor. I'd like to tinker with that and see where it takes us. Maybe it will be a better compromise between staying flexible and dynamic and still not having to update all the blocks to specifically suspend rendering while loading.

@youknowriad
Copy link
Contributor

Personally, I've always felt like regular "Suspense" is the perfect use case for the editor loading. Isn't it an API that was specifically introduce to block rendering and orchestrate loaders.

I think it's not important to solve everything in one go. Even if we start by just the template parts block, that would be a great start for me.

My personal worry is on the "updates". In other words, if I use useSuspenseSelect today on template parts and have a suspense provider around the whole editor. How do I make sure that new "template parts" blocks added after the initial loading (or tweaking the config of the template part to require another resolver to trigger) doesn't trigger the "global loader".

Do you have any ideas how they solve this kind of problem in React user land? In other words, can we have a "Suspense" loader that "removes" itself after the initial rendering?

@youknowriad
Copy link
Contributor

youknowriad commented Feb 1, 2023

I guess according to React docs, the answer is to wrap our updates (inserting blocks, block attributes change...) with startTransition. I wonder if there's a way to know which of our actions should be wrapper with this.

@tyxla
Copy link
Member Author

tyxla commented Feb 1, 2023

My personal worry is on the "updates". In other words, if I use useSuspenseSelect today on template parts and have a suspense provider around the whole editor. How do I make sure that new "template parts" blocks added after the initial loading (or tweaking the config of the template part to require another resolver to trigger) doesn't trigger the "global loader".

Do you have any ideas how they solve this kind of problem in React user land? In other words, can we have a "Suspense" loader that "removes" itself after the initial rendering?

As I mentioned in my earlier comment, I have a separate idea of how to approach that problem. This behavior not supported by default in React, since in React, if we have components that suspend rendering, they'll keep suspending any time they are making a new request to retrieve data. That is expected to work well in the React world, but not when we only want to do it only for the initial loading of the app. So what we can do is a combination of two things: 1) having a "has initial loading finished" flag that starts as false and changes to true after initial loading and 2) having a separate place to manage suspension that is watching all requests - that would allow us to use the suspense mechanism, but without having to declare the dependencies specifically - we'd just wait for all requests. I'm planning to try that out next, in a separate PR.

I guess according to React docs, the answer is to wrap our updates (inserting blocks, block attributes change...) with startTransition. I wonder if there's a way to know which of our actions should be wrapper with this.

Yes, that's what we intended to use, but that's not possible if we use useSyncExternalStore, which we're now using in useSelect, because all those updates would be synchronous, and concurrency applies only for reading. @jsnajdr explained that in #42525 (comment) and you can read the original discussion and rationale. That's why I'm trying out different approaches. In the next experiment that I've described above, I'll aim to solve the problem you recognized with this one - the dependencies being dynamic and hard to declare specifically.

@annezazu annezazu mentioned this pull request Feb 7, 2023
57 tasks
@tyxla tyxla force-pushed the try/suspense-site-edit-2 branch from 894d3d4 to 5444d21 Compare April 25, 2023 14:50
@tyxla tyxla changed the title Site Editor: Improve loading experience Site Editor: Improve loading experience (v2) May 1, 2023
@tyxla
Copy link
Member Author

tyxla commented May 1, 2023

I'm working on a more stable and flexible version of this in #50222.

@tyxla
Copy link
Member Author

tyxla commented May 8, 2023

Since #50222 is much more reliable and flexible, I'm closing this one in its favor.

@tyxla tyxla closed this May 8, 2023
@tyxla tyxla deleted the try/suspense-site-edit-2 branch May 8, 2023 12:49
@priethor priethor removed the [Status] In Progress Tracking issues with work in progress label May 17, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Site Editor Related to the overarching Site Editor (formerly "full site editing") [Package] Edit Site /packages/edit-site [Type] Experimental Experimental feature or API. [Type] Performance Related to performance efforts
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants