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

Add an example esm-example package and use it in edit-post #34172

Closed
wants to merge 3 commits into from

Conversation

youknowriad
Copy link
Contributor

@youknowriad youknowriad commented Aug 19, 2021

Related to #36716.
A simpler version of #34140

The idea of this PR is simpler than the other one, instead of rewriting all the core modules to be esm modules and trying to be backward compatible, the following PR does this instead:

  • Adds the import map APIs to WP
  • Adds an example ESM-ready package that can be lazy loaded. (Called `esm-example)
  • Lazy loads that package in edit-post (when loading the editor) as a proof of concept to ensure everything works as intended.

This is very promising and is almost ready IMO. Here are some of the tasks that I'd like to do to land it:

  • Add a shim/polyfill to make it work for other browsers than Chrome. I have tried this one https://github.com/guybedford/es-module-shims which seems to be the most compelling one but failed to make it work entirely. I made the import map work but dynamic import import( something ) no, I think we might need a web pack config to rewrite import( something ) to importShim( something ) but failed to do so. I could use some help to achieve this item.
  • Right now, each ESM modules generates a dedicated entry in the import map, this work but I'd like to see if I can manage to have a single item for all. @wordpress esm packages. It might require generating files without the .js extension and putting these files in the same folder.
  • Right now the WP importmap is only loaded in the admin, I think we should load it in the frontend as well (to allow themes to use these modules and add their own modules)

@youknowriad youknowriad added Framework Issues related to broader framework topics, especially as it relates to javascript [Type] Build Tooling Issues or PRs related to build tooling labels Aug 19, 2021
@youknowriad youknowriad self-assigned this Aug 19, 2021
@github-actions
Copy link

github-actions bot commented Aug 19, 2021

Size Change: +3.61 kB (0%)

Total Size: 1.04 MB

Filename Size Change
build/a11y/index.min.js 922 B -9 B (-1%)
build/admin-manifest/index.min.js 1.09 kB +1 B (0%)
build/annotations/index.min.js 2.69 kB -10 B (0%)
build/api-fetch/index.min.js 2.17 kB -17 B (-1%)
build/autop/index.min.js 2.07 kB -6 B (0%)
build/blob/index.min.js 446 B -13 B (-3%)
build/block-directory/index.min.js 6.17 kB -35 B (-1%)
build/block-editor/index.min.js 118 kB -1.22 kB (-1%)
build/block-editor/style-rtl.css 13.8 kB -33 B (0%)
build/block-editor/style.css 13.8 kB -32 B (0%)
build/block-library/blocks/file/view.min.js 315 B -7 B (-2%)
build/block-library/blocks/gallery/editor-rtl.css 879 B +172 B (+24%) 🚨
build/block-library/blocks/gallery/editor.css 876 B +170 B (+24%) 🚨
build/block-library/blocks/gallery/style-rtl.css 1.7 kB +644 B (+61%) 🆘
build/block-library/blocks/gallery/style.css 1.7 kB +641 B (+61%) 🆘
build/block-library/blocks/group/theme-rtl.css 70 B -23 B (-25%) 🎉
build/block-library/blocks/group/theme.css 70 B -23 B (-25%) 🎉
build/block-library/editor-rtl.css 9.95 kB +80 B (+1%)
build/block-library/editor.css 9.93 kB +82 B (+1%)
build/block-library/index.min.js 150 kB +3.08 kB (+2%)
build/block-library/style-rtl.css 10.9 kB +688 B (+7%) 🔍
build/block-library/style.css 10.9 kB +695 B (+7%) 🔍
build/block-library/theme-rtl.css 658 B -30 B (-4%)
build/block-library/theme.css 663 B -29 B (-4%)
build/block-serialization-default-parser/index.min.js 1.08 kB -8 B (-1%)
build/block-serialization-spec-parser/index.min.js 2.79 kB -1 B (0%)
build/blocks/index.min.js 47 kB -4 B (0%)
build/components/index.min.js 209 kB -170 B (0%)
build/compose/index.min.js 10.1 kB -31 B (0%)
build/core-data/index.min.js 12.3 kB -71 B (-1%)
build/customize-widgets/index.min.js 11.1 kB -17 B (0%)
build/data-controls/index.min.js 605 B -9 B (-1%)
build/data/index.min.js 7.05 kB -35 B (0%)
build/date/index.min.js 31.4 kB -15 B (0%)
build/deprecated/index.min.js 417 B -11 B (-3%)
build/dom-ready/index.min.js 292 B -12 B (-4%)
build/dom/index.min.js 4.48 kB -46 B (-1%)
build/edit-navigation/index.min.js 13.6 kB -28 B (0%)
build/edit-post/index.min.js 28.6 kB -13 B (0%)
build/edit-site/index.min.js 26.2 kB +15 B (0%)
build/edit-widgets/index.min.js 16 kB -51 B (0%)
build/editor/index.min.js 37.4 kB -258 B (-1%)
build/element/index.min.js 3.12 kB -36 B (-1%)
build/escape-html/index.min.js 506 B -11 B (-2%)
build/format-library/index.min.js 5.35 kB -11 B (0%)
build/hooks/index.min.js 1.53 kB -24 B (-2%)
build/html-entities/index.min.js 417 B -7 B (-2%)
build/i18n/index.min.js 3.58 kB -17 B (0%)
build/is-shallow-equal/index.min.js 493 B -8 B (-2%)
build/keyboard-shortcuts/index.min.js 1.48 kB -10 B (-1%)
build/keycodes/index.min.js 1.22 kB -30 B (-2%)
build/list-reusable-blocks/index.min.js 1.85 kB -6 B (0%)
build/media-utils/index.min.js 2.86 kB -13 B (0%)
build/notices/index.min.js 829 B -16 B (-2%)
build/nux/index.min.js 2.02 kB -8 B (0%)
build/plugins/index.min.js 1.82 kB -14 B (-1%)
build/primitives/index.min.js 905 B -16 B (-2%)
build/priority-queue/index.min.js 565 B -17 B (-3%)
build/react-i18n/index.min.js 664 B -7 B (-1%)
build/redux-routine/index.min.js 2.63 kB -4 B (0%)
build/reusable-blocks/index.min.js 2.27 kB -14 B (-1%)
build/rich-text/index.min.js 10.6 kB -38 B (0%)
build/server-side-render/index.min.js 1.31 kB -1 B (0%)
build/shortcode/index.min.js 1.47 kB -12 B (-1%)
build/token-list/index.min.js 556 B -6 B (-1%)
build/url/index.min.js 1.69 kB -29 B (-2%)
build/viewport/index.min.js 1.01 kB -10 B (-1%)
build/warning/index.min.js 236 B -12 B (-5%)
build/widgets/index.min.js 6.26 kB -10 B (0%)
build/wordcount/index.min.js 1.03 kB -4 B (0%)
ℹ️ View Unchanged
Filename Size
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 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 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 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 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 605 B
build/block-library/blocks/button/style.css 604 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 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/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 194 B
build/block-library/blocks/columns/editor.css 193 B
build/block-library/blocks/columns/style-rtl.css 474 B
build/block-library/blocks/columns/style.css 475 B
build/block-library/blocks/cover/editor-rtl.css 666 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/cover/style-rtl.css 1.23 kB
build/block-library/blocks/cover/style.css 1.23 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 400 B
build/block-library/blocks/embed/style.css 400 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 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 255 B
build/block-library/blocks/file/style.css 255 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/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/heading/editor-rtl.css 152 B
build/block-library/blocks/heading/editor.css 152 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 283 B
build/block-library/blocks/html/editor.css 284 B
build/block-library/blocks/image/editor-rtl.css 728 B
build/block-library/blocks/image/editor.css 728 B
build/block-library/blocks/image/style-rtl.css 482 B
build/block-library/blocks/image/style.css 487 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 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 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 63 B
build/block-library/blocks/list/style.css 63 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 488 B
build/block-library/blocks/media-text/style.css 485 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 474 B
build/block-library/blocks/navigation-link/editor.css 474 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation/editor-rtl.css 1.69 kB
build/block-library/blocks/navigation/editor.css 1.69 kB
build/block-library/blocks/navigation/style-rtl.css 1.65 kB
build/block-library/blocks/navigation/style.css 1.64 kB
build/block-library/blocks/navigation/view.min.js 2.52 kB
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 310 B
build/block-library/blocks/page-list/editor.css 310 B
build/block-library/blocks/page-list/style-rtl.css 242 B
build/block-library/blocks/page-list/style.css 242 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 248 B
build/block-library/blocks/paragraph/style.css 248 B
build/block-library/blocks/post-author/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-content/editor-rtl.css 138 B
build/block-library/blocks/post-content/editor.css 138 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 398 B
build/block-library/blocks/post-featured-image/editor.css 398 B
build/block-library/blocks/post-featured-image/style-rtl.css 143 B
build/block-library/blocks/post-featured-image/style.css 143 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 378 B
build/block-library/blocks/post-template/style.css 379 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 60 B
build/block-library/blocks/post-title/style.css 60 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 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 361 B
build/block-library/blocks/pullquote/style.css 360 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 270 B
build/block-library/blocks/query-pagination/editor.css 262 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B
build/block-library/blocks/query-pagination/style.css 168 B
build/block-library/blocks/query-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 169 B
build/block-library/blocks/quote/style.css 169 B
build/block-library/blocks/quote/theme-rtl.css 220 B
build/block-library/blocks/quote/theme.css 222 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 374 B
build/block-library/blocks/search/style.css 375 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 462 B
build/block-library/blocks/site-logo/editor.css 464 B
build/block-library/blocks/site-logo/style-rtl.css 153 B
build/block-library/blocks/site-logo/style.css 153 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 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.33 kB
build/block-library/blocks/social-links/style.css 1.33 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 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 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 636 B
build/block-library/blocks/template-part/editor.css 635 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/term-description/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 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 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 1.29 kB
build/block-library/common.css 1.29 kB
build/block-library/reset-rtl.css 527 B
build/block-library/reset.css 527 B
build/components/style-rtl.css 15.7 kB
build/components/style.css 15.8 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/edit-navigation/style-rtl.css 3.19 kB
build/edit-navigation/style.css 3.19 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/style-rtl.css 7.2 kB
build/edit-post/style.css 7.2 kB
build/edit-site/style-rtl.css 5.07 kB
build/edit-site/style.css 5.07 kB
build/edit-widgets/style-rtl.css 4.06 kB
build/edit-widgets/style.css 4.06 kB
build/editor/style-rtl.css 3.74 kB
build/editor/style.css 3.73 kB
build/format-library/style-rtl.css 668 B
build/format-library/style.css 669 B
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/widgets/style-rtl.css 1.05 kB
build/widgets/style.css 1.05 kB

compressed-size-action

@@ -147,6 +147,9 @@ export function initializeEditor(
);
}

// esm-example
import( '@wordpress/esm-example' ).then( ( mod ) => mod.run() );
Copy link
Member

Choose a reason for hiding this comment

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

Is the following case in webpack plugin necessary for the import above?

if ( ESM_PACKAGES.includes( request ) ) {
 	return 'import ' + request;
}

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yes, this config ensures webpack keeps the import as is and do not try to bundle or resolve the @wordpress/esm-example dependency.

Ideally, I'd like webpack to rewrite it importShim( '@wordpress/esm-example' ).then( ( mod ) => mod.run() ); but I was not able to do so.

Copy link
Contributor

@sarayourfriend sarayourfriend left a comment

Choose a reason for hiding this comment

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

I don't have much to add to this review, but it looks super interesting. What are the implications exactly?

packages/esm-example/README.md Outdated Show resolved Hide resolved
@youknowriad
Copy link
Contributor Author

@sarahmonster the implication is that we can start extracting code to lazy-loaded modules and have them work both in npm packages and in Gutenberg itself. There are several things we could explore later once this lands:

  • Explore extracting edit functions of large blocks (classic, ...) to separate lazy loaded packages
  • See if there are systematic ways to enable this for "edit" functions
  • Explore adding large lazy loaded dependencies (syntax highlighting is one that come to mind and that we delayed even before 5.0 because of that)
  • ...

@sarayourfriend
Copy link
Contributor

That's awesome!

Just a note that the heaviest part of the classic block isn't anything implemented in Gutenberg, but the dependency on TinyMCE itself (as initialized by WP core). Has that changed? Otherwise there'd still be a lot of work necessary to async load the classic/freeform block.

@youknowriad
Copy link
Contributor Author

youknowriad commented Aug 19, 2021

Has that changed?

No, I actually didn't look at the classic block at all, I was thinking that if we find a way to make tinymce available as an esm package somehow we could lazy load it using this PR. That may be utopia, I don't know but it's just one use-case.

@sarayourfriend
Copy link
Contributor

Yeah unfortunately it's a long shot... I spent a long time trying to figure out how to asynchronously load TinyMCE and it turns out there's a lot of work that WP core does to initialize TinyMCE (especially around i18n stuff) that become a blocker. Of course you could re-implement all that initialization client side.

It'd be a HUGE win to async load TinyMCE. That thing is a tremendous bloat for something that is so rarely used. I think it would have an actual measurable environmental impact considering the size and how often Gutenberg is loaded, not to mention a significant speed increase. More details about it here: #29681

@youknowriad
Copy link
Contributor Author

I have one good news and one bad news here:

  • The good news is that I was able to make the ship/polyfill work
  • The bad news is that I was not able to make it work while retaining the use of the default import function, instead I was forced to use importShim instead. This means we can't officially say that this is a public API for third-plugins to use because in the future, once the support is good enough, the ship will get removed. (maybe they can use at their own risk).

So basically, I think if folks like the approach, we can consider starting to use this in core code for some time.

@youknowriad
Copy link
Contributor Author

Right now, each ESM modules generates a dedicated entry in the import map, this work but I'd like to see if I can manage to have a single item for all. @WordPress esm packages. It might require generating files without the .js extension and putting these files in the same folder.

For this point, I read a bit and tried several approaches, I think extension less files might not be a great solution here. Let's start with one entry per module (like the standard recommends).

@tomalec
Copy link
Contributor

tomalec commented Nov 23, 2021

The bad news is that I was not able to make it work while retaining the use of the default import function, instead I was forced to use importShim instead. This means we can't officially say that this is a public API for third-plugins to use because in the future, once the support is good enough, the ship will get removed. (maybe they can use at their own risk).

I do agree this is a problem, but I think we can try somewhat sell it better. If we state to plugin developers something like:

"Hey! We are starting the process of modernizing our JS packages loading strategy, to use the latest and coolest ESM and import maps. Import-maps are not yet fully supported in all the browsers, so if you want to use the new ESM packages in your regular scripts, you would have to use wpImport instead of import so WP could apply the polyfill if needed."

  • We will rename importShim to something from WP namespace, so even once "once the support is good enough" and "the shim will get removed", we could keep aliasing the native import.

Now putting the plugin developer hat on, I'd read it as:

Oh, there is a breeze of new features coming. But for the old scripts, everything works as before, so I feel safe and calm.
Ah, and here is this new @wordpress/syntax-highlighting package, now shipped as a module. Ok, I'd import it slightly differently with wpImport to make sure it runs in my <script>-based plugin. Also, I'd start thinking of migrating my own code to ES modules, where I could import it natively.


Forgive me if I missed something important here. But for me personally, it does not look that bad. The trade of using a new Web feature in the WordPress platform does not require any refactor on the plugin end but just to use slightly WordPress-specific syntax instead of native. That's only 2 characters difference, and WP will keep its compatibility for a long.

Plus, if I understood the OP correctly, this difference applies only to the new packages, that we will ship as ESM, not to the existing ones.

@youknowriad
Copy link
Contributor Author

@tomalec your reasoning makes total sense to me yes, I just wanted to avoid that temporary step. But in the end it's not that bad, once it's well supported we could just do wpImport = import and call it a day.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Framework Issues related to broader framework topics, especially as it relates to javascript [Type] Build Tooling Issues or PRs related to build tooling
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants