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-directory: simplify the LOAD_ASSETS flow by making it an async function #25956

Merged
merged 1 commit into from
Jan 7, 2021

Conversation

jsnajdr
Copy link
Member

@jsnajdr jsnajdr commented Oct 8, 2020

Rewrites the LOAD_ASSETS control handler by converting it to an async function. That simplifies especially the async loop at the end that loads the missing assets.

Also fixes what I think is a bug: if one of the loadAsset calls failed, the surrounding promise was rejected by the reject call, but the loop continued to load the remaining assets! Even though their code can depend on the success of previous loads. After this patch, the loop terminates immediately on error.

@jsnajdr jsnajdr added [Type] Code Quality Issues or PRs that relate to code quality [Feature] Block Directory Related to the Block Directory, a repository of block plugins labels Oct 8, 2020
@jsnajdr jsnajdr requested a review from dd32 October 8, 2020 14:04
@jsnajdr jsnajdr self-assigned this Oct 8, 2020
@github-actions
Copy link

github-actions bot commented Oct 8, 2020

Size Change: +215 B (0%)

Total Size: 1.19 MB

Filename Size Change
build/block-directory/index.js 8.77 kB +215 B (2%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.54 kB 0 B
build/api-fetch/index.js 3.35 kB 0 B
build/autop/index.js 2.72 kB 0 B
build/blob/index.js 668 B 0 B
build/block-directory/style-rtl.css 943 B 0 B
build/block-directory/style.css 942 B 0 B
build/block-editor/index.js 129 kB 0 B
build/block-editor/style-rtl.css 11 kB 0 B
build/block-editor/style.css 11 kB 0 B
build/block-library/editor-rtl.css 8.65 kB 0 B
build/block-library/editor.css 8.65 kB 0 B
build/block-library/index.js 144 kB 0 B
build/block-library/style-rtl.css 7.66 kB 0 B
build/block-library/style.css 7.65 kB 0 B
build/block-library/theme-rtl.css 741 B 0 B
build/block-library/theme.css 741 B 0 B
build/block-serialization-default-parser/index.js 1.78 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 47.5 kB 0 B
build/components/index.js 169 kB 0 B
build/components/style-rtl.css 15.5 kB 0 B
build/components/style.css 15.4 kB 0 B
build/compose/index.js 9.43 kB 0 B
build/core-data/index.js 12 kB 0 B
build/data-controls/index.js 685 B 0 B
build/data/index.js 8.6 kB 0 B
build/date/index.js 31.9 kB 0 B
build/deprecated/index.js 772 B 0 B
build/dom-ready/index.js 568 B 0 B
build/dom/index.js 4.42 kB 0 B
build/edit-navigation/index.js 10.6 kB 0 B
build/edit-navigation/style-rtl.css 868 B 0 B
build/edit-navigation/style.css 871 B 0 B
build/edit-post/index.js 306 kB 0 B
build/edit-post/style-rtl.css 6.29 kB 0 B
build/edit-post/style.css 6.27 kB 0 B
build/edit-site/index.js 21 kB 0 B
build/edit-site/style-rtl.css 3.73 kB 0 B
build/edit-site/style.css 3.73 kB 0 B
build/edit-widgets/index.js 21.2 kB 0 B
build/edit-widgets/style-rtl.css 3.02 kB 0 B
build/edit-widgets/style.css 3.02 kB 0 B
build/editor/editor-styles-rtl.css 492 B 0 B
build/editor/editor-styles.css 493 B 0 B
build/editor/index.js 45.4 kB 0 B
build/editor/style-rtl.css 3.85 kB 0 B
build/editor/style.css 3.84 kB 0 B
build/element/index.js 4.45 kB 0 B
build/escape-html/index.js 734 B 0 B
build/format-library/index.js 7.49 kB 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.js 1.74 kB 0 B
build/html-entities/index.js 621 B 0 B
build/i18n/index.js 3.54 kB 0 B
build/is-shallow-equal/index.js 710 B 0 B
build/keyboard-shortcuts/index.js 2.39 kB 0 B
build/keycodes/index.js 1.85 kB 0 B
build/list-reusable-blocks/index.js 3.02 kB 0 B
build/list-reusable-blocks/style-rtl.css 476 B 0 B
build/list-reusable-blocks/style.css 476 B 0 B
build/media-utils/index.js 5.12 kB 0 B
build/notices/index.js 1.69 kB 0 B
build/nux/index.js 3.27 kB 0 B
build/nux/style-rtl.css 671 B 0 B
build/nux/style.css 668 B 0 B
build/plugins/index.js 2.44 kB 0 B
build/primitives/index.js 1.34 kB 0 B
build/priority-queue/index.js 790 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/rich-text/index.js 13 kB 0 B
build/server-side-render/index.js 2.6 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.24 kB 0 B
build/url/index.js 4.06 kB 0 B
build/viewport/index.js 1.74 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.17 kB 0 B

compressed-size-action

Copy link
Contributor

@ryelle ryelle left a comment

Choose a reason for hiding this comment

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

Looks good, thanks for the cleanup 👍

@ntsekouras
Copy link
Contributor

Hey - heads up I don't know the whole context for that code.. :) but have a question.

While I find it a bit difficult to understand the purpose of the previous code, it's a fact that let the other scripts to load and I'm not sure if there was some error bubbling or lead to unhandled promise rejections. An an asset might or might not be dependent as the comment mentions.

Are we sure we want to error on first failure and not refactor the code while keeping the loading of all assets that resolve?

@youknowriad
Copy link
Contributor

This was approved a long time ago, shoud we merge?

@jsnajdr
Copy link
Member Author

jsnajdr commented Jan 4, 2021

Are we sure we want to error on first failure and not refactor the code while keeping the loading of all assets that resolve?

@ntsekouras I assumed that if a block declares it depends on an asset, then that dependency is not optional -- it must be downloaded successfully in order for the block to work.

And even in the original code, if one asset fails to load, then the entire "install downloadable block" process fails: the user will be shown an error notice and the newly installed block will not be inserted into the post, as it would be in case of successful install.

Both before and after this patch, the load assets error leaves your editor in kind of a grey area: the block was actually successfully installed and you can insert it into the post. It just that some assets failed to load, and the block will be most likely unusable in the current editor session.

Page reload might or might not help, depending on how permanent the load error is.

There's one kind of block that would work before this patch and wouldn't work after: one that:

  • declares a broken dependency that fails to load
  • doesn't fail when that dependency is not loaded, e.g., by guarding for existence of its functions
  • declared a mandatory dependency after the failing one

An example would be a [ 'google-analytics-broken', 'lodash' ] dependency array and block code like:

if ( window.ga ) {
  window.ga.event( ... );
}
_.map( ... );

This block used to successfully load lodash and used to work, but now it's broken.

I don't know how often such blocks appear and whether it's OK to break them and force the authors to fix the broken depenendencies.

@ryelle
Copy link
Contributor

ryelle commented Jan 6, 2021

I don't know how often such blocks appear and whether it's OK to break them and force the authors to fix the broken depenendencies.

Blocks in the block directory are meant to be self-contained, so I have a hard time thinking of a scenario where they would load a script that's functionally optional… your google analytics example would not be allowed in the directory, for example. I think it's okay to merge this, because any failure to load a script should be an error - either it's required, and the block will break without it, or it's "optional", and goes against the intent of the directory guidelines.

@jsnajdr
Copy link
Member Author

jsnajdr commented Jan 7, 2021

Thanks @ryelle for confirming what is the expected behavior. And thanks @ntsekouras for asking good questions 🙂 Going to merge now.

@jsnajdr jsnajdr merged commit b119559 into master Jan 7, 2021
@jsnajdr jsnajdr deleted the simplify/block-directory-load-assets branch January 7, 2021 09:32
@github-actions github-actions bot added this to the Gutenberg 9.8 milestone Jan 7, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Block Directory Related to the Block Directory, a repository of block plugins [Type] Code Quality Issues or PRs that relate to code quality
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants