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 new private vips package #64845

Merged
merged 18 commits into from
Oct 21, 2024
Merged

Add new private vips package #64845

merged 18 commits into from
Oct 21, 2024

Conversation

swissspidy
Copy link
Member

@swissspidy swissspidy commented Aug 27, 2024

What?

This is a new package for client-side media processing, see #61447.

It is a wrapper around wasm-vips, which is a WASM port of the powerful vips image library.

This package has been tested very well as part of https://github.com/swissspidy/media-experiments, where it runs in a dedicated web worker.

The package is private and shall not be published until later on when all of the subsequent PRs are merged.

Why?

Required for browser-based image editing.

How?

Adds a new lightweight package for using vips in a browser.

It's a separate package so it can be easily loaded in a (inline) web worker. That's also why there is this setLocation method, to ensure that works in a WordPress context.

Testing Instructions

None at this time, as this is not user-facing or anything.

There are some tests which should pass of course.

Testing Instructions for Keyboard

N/A

Screenshots or screencast

N/A

@swissspidy swissspidy added [Type] Enhancement A suggestion for improvement. [Feature] Media Anything that impacts the experience of managing media labels Aug 27, 2024
@swissspidy swissspidy force-pushed the fix/61447-vips-package branch 3 times, most recently from 1635cb4 to 7e84afe Compare August 27, 2024 21:41
@swissspidy swissspidy added the [Type] Build Tooling Issues or PRs related to build tooling label Aug 27, 2024
@swissspidy swissspidy removed the [Type] Enhancement A suggestion for improvement. label Aug 27, 2024
Copy link

github-actions bot commented Aug 27, 2024

Size Change: +36.2 kB (+2.05%)

Total Size: 1.8 MB

Filename Size Change
build/block-editor/index.min.js 255 kB +3 B (0%)
build/editor/index.min.js 103 kB +23 B (+0.02%)
build/vips/index.min.js 36.2 kB +36.2 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size
build-module/a11y/index.min.js 482 B
build-module/block-library/file/view.min.js 447 B
build-module/block-library/image/view.min.js 1.78 kB
build-module/block-library/navigation/view.min.js 1.16 kB
build-module/block-library/query/view.min.js 742 B
build-module/block-library/search/view.min.js 616 B
build-module/interactivity-router/index.min.js 3.03 kB
build-module/interactivity/debug.min.js 17.2 kB
build-module/interactivity/index.min.js 13.6 kB
build/a11y/index.min.js 952 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.26 kB
build/block-directory/style-rtl.css 1 kB
build/block-directory/style.css 1 kB
build/block-editor/content-rtl.css 4.46 kB
build/block-editor/content.css 4.45 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-editor/style-rtl.css 15.3 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 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 132 B
build/block-library/blocks/audio/style.css 132 B
build/block-library/blocks/audio/theme-rtl.css 134 B
build/block-library/blocks/audio/theme.css 134 B
build/block-library/blocks/avatar/editor-rtl.css 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 265 B
build/block-library/blocks/button/editor.css 265 B
build/block-library/blocks/button/style-rtl.css 538 B
build/block-library/blocks/button/style.css 538 B
build/block-library/blocks/buttons/editor-rtl.css 291 B
build/block-library/blocks/buttons/editor.css 291 B
build/block-library/blocks/buttons/style-rtl.css 345 B
build/block-library/blocks/buttons/style.css 345 B
build/block-library/blocks/calendar/style-rtl.css 240 B
build/block-library/blocks/calendar/style.css 240 B
build/block-library/blocks/categories/editor-rtl.css 132 B
build/block-library/blocks/categories/editor.css 131 B
build/block-library/blocks/categories/style-rtl.css 152 B
build/block-library/blocks/categories/style.css 152 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 139 B
build/block-library/blocks/code/style.css 139 B
build/block-library/blocks/code/theme-rtl.css 122 B
build/block-library/blocks/code/theme.css 122 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 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-author-name/style-rtl.css 72 B
build/block-library/blocks/comment-author-name/style.css 72 B
build/block-library/blocks/comment-content/style-rtl.css 120 B
build/block-library/blocks/comment-content/style.css 120 B
build/block-library/blocks/comment-date/style-rtl.css 65 B
build/block-library/blocks/comment-date/style.css 65 B
build/block-library/blocks/comment-edit-link/style-rtl.css 70 B
build/block-library/blocks/comment-edit-link/style.css 70 B
build/block-library/blocks/comment-reply-link/style-rtl.css 71 B
build/block-library/blocks/comment-reply-link/style.css 71 B
build/block-library/blocks/comment-template/style-rtl.css 200 B
build/block-library/blocks/comment-template/style.css 199 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 228 B
build/block-library/blocks/comments-pagination/editor.css 217 B
build/block-library/blocks/comments-pagination/style-rtl.css 234 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 832 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 631 B
build/block-library/blocks/cover/editor-rtl.css 641 B
build/block-library/blocks/cover/editor.css 642 B
build/block-library/blocks/cover/style-rtl.css 1.64 kB
build/block-library/blocks/cover/style.css 1.63 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 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 331 B
build/block-library/blocks/embed/editor.css 331 B
build/block-library/blocks/embed/style-rtl.css 419 B
build/block-library/blocks/embed/style.css 419 B
build/block-library/blocks/embed/theme-rtl.css 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 279 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-input/style-rtl.css 357 B
build/block-library/blocks/form-input/style.css 357 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 470 B
build/block-library/blocks/freeform/editor-rtl.css 2.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/editor-rtl.css 946 B
build/block-library/blocks/gallery/editor.css 951 B
build/block-library/blocks/gallery/style-rtl.css 1.83 kB
build/block-library/blocks/gallery/style.css 1.82 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 334 B
build/block-library/blocks/group/editor.css 334 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 346 B
build/block-library/blocks/html/editor.css 347 B
build/block-library/blocks/image/editor-rtl.css 785 B
build/block-library/blocks/image/editor.css 787 B
build/block-library/blocks/image/style-rtl.css 1.59 kB
build/block-library/blocks/image/style.css 1.59 kB
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 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/editor-rtl.css 179 B
build/block-library/blocks/latest-posts/editor.css 179 B
build/block-library/blocks/latest-posts/style-rtl.css 509 B
build/block-library/blocks/latest-posts/style.css 510 B
build/block-library/blocks/list/style-rtl.css 107 B
build/block-library/blocks/list/style.css 107 B
build/block-library/blocks/loginout/style-rtl.css 61 B
build/block-library/blocks/loginout/style.css 61 B
build/block-library/blocks/media-text/editor-rtl.css 321 B
build/block-library/blocks/media-text/editor.css 320 B
build/block-library/blocks/media-text/style-rtl.css 558 B
build/block-library/blocks/media-text/style.css 556 B
build/block-library/blocks/more/editor-rtl.css 427 B
build/block-library/blocks/more/editor.css 427 B
build/block-library/blocks/navigation-link/editor-rtl.css 644 B
build/block-library/blocks/navigation-link/editor.css 645 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/editor-rtl.css 2.2 kB
build/block-library/blocks/navigation/editor.css 2.2 kB
build/block-library/blocks/navigation/style-rtl.css 2.25 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 378 B
build/block-library/blocks/page-list/editor.css 378 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 236 B
build/block-library/blocks/paragraph/editor.css 236 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 B
build/block-library/blocks/post-author-biography/style-rtl.css 74 B
build/block-library/blocks/post-author-biography/style.css 74 B
build/block-library/blocks/post-author-name/style-rtl.css 69 B
build/block-library/blocks/post-author-name/style.css 69 B
build/block-library/blocks/post-author/editor-rtl.css 107 B
build/block-library/blocks/post-author/editor.css 107 B
build/block-library/blocks/post-author/style-rtl.css 188 B
build/block-library/blocks/post-author/style.css 189 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 527 B
build/block-library/blocks/post-comments-form/style.css 528 B
build/block-library/blocks/post-content/style-rtl.css 61 B
build/block-library/blocks/post-content/style.css 61 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 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 155 B
build/block-library/blocks/post-excerpt/style.css 155 B
build/block-library/blocks/post-featured-image/editor-rtl.css 729 B
build/block-library/blocks/post-featured-image/editor.css 726 B
build/block-library/blocks/post-featured-image/style-rtl.css 347 B
build/block-library/blocks/post-featured-image/style.css 347 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 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 399 B
build/block-library/blocks/post-template/style.css 398 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 70 B
build/block-library/blocks/post-time-to-read/style.css 70 B
build/block-library/blocks/post-title/style-rtl.css 162 B
build/block-library/blocks/post-title/style.css 162 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 134 B
build/block-library/blocks/pullquote/editor.css 134 B
build/block-library/blocks/pullquote/style-rtl.css 342 B
build/block-library/blocks/pullquote/style.css 342 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 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/editor-rtl.css 154 B
build/block-library/blocks/query-pagination/editor.css 154 B
build/block-library/blocks/query-pagination/style-rtl.css 237 B
build/block-library/blocks/query-pagination/style.css 237 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 452 B
build/block-library/blocks/query/editor.css 451 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 233 B
build/block-library/blocks/quote/theme.css 236 B
build/block-library/blocks/read-more/style-rtl.css 138 B
build/block-library/blocks/read-more/style.css 138 B
build/block-library/blocks/rss/editor-rtl.css 101 B
build/block-library/blocks/rss/editor.css 101 B
build/block-library/blocks/rss/style-rtl.css 288 B
build/block-library/blocks/rss/style.css 287 B
build/block-library/blocks/search/editor-rtl.css 199 B
build/block-library/blocks/search/editor.css 199 B
build/block-library/blocks/search/style-rtl.css 672 B
build/block-library/blocks/search/style.css 671 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 806 B
build/block-library/blocks/site-logo/editor.css 803 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-tagline/style-rtl.css 65 B
build/block-library/blocks/site-tagline/style.css 65 B
build/block-library/blocks/site-title/editor-rtl.css 85 B
build/block-library/blocks/site-title/editor.css 85 B
build/block-library/blocks/site-title/style-rtl.css 143 B
build/block-library/blocks/site-title/style.css 143 B
build/block-library/blocks/social-link/editor-rtl.css 338 B
build/block-library/blocks/social-link/editor.css 338 B
build/block-library/blocks/social-links/editor-rtl.css 729 B
build/block-library/blocks/social-links/editor.css 727 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.5 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 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-of-contents/style-rtl.css 83 B
build/block-library/blocks/table-of-contents/style.css 83 B
build/block-library/blocks/table/editor-rtl.css 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 B
build/block-library/blocks/tag-cloud/editor-rtl.css 144 B
build/block-library/blocks/tag-cloud/editor.css 144 B
build/block-library/blocks/tag-cloud/style-rtl.css 266 B
build/block-library/blocks/tag-cloud/style.css 265 B
build/block-library/blocks/template-part/editor-rtl.css 368 B
build/block-library/blocks/template-part/editor.css 368 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 126 B
build/block-library/blocks/term-description/style.css 126 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 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/editor-rtl.css 396 B
build/block-library/blocks/video/editor.css 397 B
build/block-library/blocks/video/style-rtl.css 192 B
build/block-library/blocks/video/style.css 192 B
build/block-library/blocks/video/theme-rtl.css 134 B
build/block-library/blocks/video/theme.css 134 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.08 kB
build/block-library/common.css 1.08 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.7 kB
build/block-library/editor.css 11.7 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 220 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.9 kB
build/block-library/style.css 14.9 kB
build/block-library/theme-rtl.css 708 B
build/block-library/theme.css 712 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 52.5 kB
build/commands/index.min.js 16.1 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/components/index.min.js 227 kB
build/components/style-rtl.css 12.4 kB
build/components/style.css 12.4 kB
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 3.11 kB
build/core-data/index.min.js 73.4 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.35 kB
build/customize-widgets/style.css 1.35 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.97 kB
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.66 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/index.min.js 13.7 kB
build/edit-post/style-rtl.css 2.76 kB
build/edit-post/style.css 2.75 kB
build/edit-site/index.min.js 218 kB
build/edit-site/posts-rtl.css 7.32 kB
build/edit-site/posts.css 7.32 kB
build/edit-site/style-rtl.css 12.6 kB
build/edit-site/style.css 12.6 kB
build/edit-widgets/index.min.js 17.7 kB
build/edit-widgets/style-rtl.css 4.19 kB
build/edit-widgets/style.css 4.19 kB
build/editor/style-rtl.css 9.37 kB
build/editor/style.css 9.38 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.04 kB
build/format-library/style-rtl.css 476 B
build/format-library/style.css 476 B
build/hooks/index.min.js 1.65 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.13 kB
build/list-reusable-blocks/style-rtl.css 852 B
build/list-reusable-blocks/style.css 852 B
build/media-utils/index.min.js 3.2 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.62 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/index.min.js 7.34 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 554 B
build/preferences/style.css 554 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 960 B
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.55 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.1 kB
build/router/index.min.js 1.96 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.04 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.9 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react-jsx-runtime.min.js 556 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

Comment on lines 51 to 57
resolve: {
// Ensure "require" has a higher priority when matching export conditions.
// Needed for wasm-vips which is used by the @wordpress/vips package.
// https://webpack.js.org/configuration/resolve/#resolveconditionnames
// https://github.com/kleisauke/wasm-vips/issues/50#issuecomment-1664118137
conditionNames: [ 'require', 'import' ],
},
Copy link
Member Author

Choose a reason for hiding this comment

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

Looks like this has implications for other packages as well :/

Copy link
Member

Choose a reason for hiding this comment

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

@swissspidy
Copy link
Member Author

@youknowriad @ntsekouras Would appreciate your early thoughts on this one

The vips package is used by the upcoming upload-media package (all coming from https://github.com/swissspidy/media-experiments), which loads it in an inline web worker.

It is a wrapper around wasm-vips which — surprise — contains .wasm files. I used to load these from a CDN before, but they should really be served from the local server instead. I tried to update the webpack config to make that work.

There are currently two big issues with that:

  1. I need to ensure the wasm files are part of the build output everywhere, as the JS files need to load them.
  2. I need to load the CJS version of wasm-vips, not the ESM version.
    Fiddling with conditionNames works but seems to have unintended effects on other packages' imports

The whole thing is best tested once I add the PR for the upload-media package, but for that I need some of my other PRs to be merged first :-)

Comment on lines 29 to 33
"exports": {
".": {
"default": "./src/index.ts"
}
},
Copy link
Member

Choose a reason for hiding this comment

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

This seems new, I don't think any other packages use it. That's not a bad thing and we're considering using exports for building more script modules. CC @gziolo 👀

Since this is unused so far in WordPress packages, I'd prefer not to introduce it here. It can be added to all packages at the same time in the same way when we decide to do that.


I am surprised to see it point to a TypeScript file. I think this should point to a compiled file, probably the same as the module field:

Suggested change
"exports": {
".": {
"default": "./src/index.ts"
}
},
"exports": {
".": {
"default": "./build-module/index.js"
}
},

When the field is defined like this with only a single . export, there's a shorthand form: "exports": "./build-module/index.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 is mostly leftover from testing I think, agree it should be removed for consistency :-)

But my main focus right now is getting the WASM thing to work 😄

@sirreal
Copy link
Member

sirreal commented Sep 9, 2024

Will you provide some details about the build issues? In particular how should the behavior be verified. Is a successful npm run build sufficient?

@swissspidy
Copy link
Member Author

Will you provide some details about the build issues? In particular how should the behavior be verified. Is a successful npm run build sufficient?

As per the PR description, after a build, the .wasm files should appear in build/vips. Ideally without hardcoding.
I think they need to be in packages/vips/build and packages/vips/build-module as well, because e.g. WP core will need to be able to load those files as well.

I'll see if I can add some simple demo or so to verify the behavior more easily in the browser / editor 👍

  • I understand that the changes in tools/webpack/packages.js should be updated so they're not package-specific. Is there anything else with that file?

I don't know. Is this file also used for creating the packages/*/build folders? As per the above, I think I need to include the .wasm files in there as well.

  • Will you explain this comment in the shared webpack config #64845 (files)? I'd like to understand why that was added.

As per #64845 (comment), I need to load the CJS version of wasm-vips, not the ESM version. Fiddling with conditionNames works but seems to have unintended effects on other packages' imports.

See the exports of wasm-vips:

https://github.com/kleisauke/wasm-vips/blob/87958eda7f54cdc04fbe9991a3068dbb74b05737/package.json#L16-L33

With the change to conditionNames it will load vips.js instead of the vips-es6.js file

@sirreal
Copy link
Member

sirreal commented Sep 9, 2024

Will you share some details on the unintended consequences for other packages? Is it breaking some behavior or how does it manifest?

@swissspidy
Copy link
Member Author

Will you share some details on the unintended consequences for other packages? Is it breaking some behavior or how does it manifest?

The bundle size increases for build/components/index.min.js and build/editor/index.min.js are very suspicious. Because the conditionNames change affects all packages loaded by webpack, I assume editor and components now load different (bigger) files for some of their dependencies.

@swissspidy
Copy link
Member Author

@sirreal I just pushed a bunch of changes to make it easier to test the PR. I will remove those changes again before merge.

You can test this by dropping an image file into the editor. It should upload normally, but behind the scenes it will be compressed by vips.

The setup is similar to the desired end state with the new client-side media processing. @wordpress/vips will be dynamically loaded in an inline worker using https://www.npmjs.com/package/@shopify/web-worker. That's why it requires __webpack_public_path__, so the worker knows where to find the WASM files.

Note: We probably don't want to use __webpack_public_path__ directly in published packages, so we could use something like globalThis.PUBLIC_PATH & DefinePlugin or so in the final implementation.

@sirreal
Copy link
Member

sirreal commented Sep 9, 2024

This is a mess 😖

In theory, webpack supports wasm natively by enabling experiments.asyncWebAssembly. I also switched from using conditionNames (affecting all packages) to patch the wasm-vips package. This still didn't get things working.

patch with some ideas
diff --git before/patches/wasm-vips+0.0.10.patch after/patches/wasm-vips+0.0.10.patch
new file mode 100644
index 00000000000..3310b706e5a
--- /dev/null
+++ after/patches/wasm-vips+0.0.10.patch
@@ -0,0 +1,15 @@
+diff --git a/node_modules/wasm-vips/package.json b/node_modules/wasm-vips/package.json
+index c20f052..b26a38a 100644
+--- a/node_modules/wasm-vips/package.json
++++ b/node_modules/wasm-vips/package.json
+@@ -15,10 +15,6 @@
+   "type": "commonjs",
+   "exports": {
+     ".": {
+-      "browser": {
+-        "import": "./lib/vips-es6.js",
+-        "require": "./lib/vips.js"
+-      },
+       "node": {
+         "import": "./lib/vips-node.mjs",
+         "require": "./lib/vips-node.js"
diff --git before/tools/webpack/packages.js after/tools/webpack/packages.js
index d4bf1243c8f..6fd792e424f 100644
--- before/tools/webpack/packages.js
+++ after/tools/webpack/packages.js
@@ -143,20 +143,6 @@ module.exports = {
 		// This is the default, but required for @shopify/web-worker.
 		globalObject: 'self',
 	},
-	module: {
-		rules: [
-			...baseConfig.module.rules,
-			{
-				test: /\.wasm$/,
-				type: 'asset/resource',
-				generator: {
-					// FIXME: Do not hardcode path.
-					filename: './build/vips/[name].wasm',
-					publicPath: '',
-				},
-			},
-		],
-	},
 	performance: {
 		hints: false, // disable warnings about package sizes
 	},
diff --git before/tools/webpack/shared.js after/tools/webpack/shared.js
index bad55ca53cd..51aba37dee0 100644
--- before/tools/webpack/shared.js
+++ after/tools/webpack/shared.js
@@ -16,6 +16,9 @@ const { NODE_ENV: mode = 'development', WP_DEVTOOL: devtool = 'source-map' } =
 
 const baseConfig = {
 	target: 'browserslist',
+	experiments: {
+		asyncWebAssembly: true,
+	},
 	optimization: {
 		// Only concatenate modules in production, when not analyzing bundles.
 		concatenateModules:
@@ -48,13 +51,6 @@ const baseConfig = {
 			},
 		],
 	},
-	resolve: {
-		// Ensure "require" has a higher priority when matching export conditions.
-		// Needed for wasm-vips which is used by the @wordpress/vips package.
-		// https://webpack.js.org/configuration/resolve/#resolveconditionnames
-		// https://github.com/kleisauke/wasm-vips/issues/50#issuecomment-1664118137
-		conditionNames: [ 'require', 'import' ],
-	},
 	watchOptions: {
 		ignored: [
 			'**/node_modules',

Could this be used as a Script Module? I haven't tried yet, but if it were compiled as an actual module it might solve some of these issues. I'm working on building some more script modules in #65064.

@swissspidy
Copy link
Member Author

This is a mess 😖

Sort of... At least right now, the PR in its current form, the WASM files were correctly loaded, so it did seem to work as expected.

I also switched from using conditionNames (affecting all packages) to patch the wasm-vips package. This still didn't get things working.

What exactly isn't working? Does that break the build step?

(Aside: the wasm-vips maintainer is super responsive, in case we need to make any upstream changes)

In theory, webpack supports wasm natively by enabling experiments.asyncWebAssembly.
Could this be used as a Script Module? I haven't tried yet, but if it were compiled as an actual module it might solve some of these issues. I'm working on building some more script modules in #65064.

Are script modules really the answer? 😄 That opens a whole other can of worms IMHO. This library needs to be called from the editor, but that isn't a script module.

@sirreal
Copy link
Member

sirreal commented Sep 20, 2024

I plan to help sort out the details here, but I'm prioritizing other work I hope to ship in WordPress 6.7. After that work is settled I can dedicate some more focus to this. Some of that work is related, such as how we're building and shipping Script Modules: #65460

Extract unrelated changes (e.g. the PHP changes, the web worker implementation I added) into new PRs

This is always good if we can land the parts that are clear and postpone the parts that are complicated 👍

@swissspidy
Copy link
Member Author

New PR for the PHP changes: #65701

@swissspidy swissspidy marked this pull request as ready for review October 10, 2024 21:03
Copy link

github-actions bot commented Oct 10, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: swissspidy <swissspidy@git.wordpress.org>
Co-authored-by: sirreal <jonsurrell@git.wordpress.org>
Co-authored-by: youknowriad <youknowriad@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@swissspidy
Copy link
Member Author

I removed all the web worker stuff now from this PR to keep this to the bare minimum, unblocking further work on this feature.

@sirreal I'd appreciate another review here, just focusing on the existing code. The real fun begins (again) in subsequent PRs when actually using the wasm files in a worker.

Copy link
Member

@sirreal sirreal left a comment

Choose a reason for hiding this comment

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

I did a quick scan and have some minor notes to share. I'll come back and do a proper review sometime this week.

packages/vips/src/types.ts Outdated Show resolved Hide resolved
packages/vips/src/types.ts Outdated Show resolved Hide resolved
@sirreal sirreal self-requested a review October 14, 2024 17:03
Copy link
Member

@sirreal sirreal left a comment

Choose a reason for hiding this comment

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

I've been reviewing this in depth, I'm leaving another round of feedback. I haven't finished reviewing the main TS files yet.

I'd strongly prefer that if and when this arrives in WordPress it's as a script module. I know there are pieces missing for that but they're things I'm working on and I think we can have for 6.8.

On Monday I'll finish this complete review. Thanks for your patience 🙂

test/unit/config/global-mocks.js Show resolved Hide resolved
test/unit/config/wasm-stub.js Outdated Show resolved Hide resolved
packages/vips/package.json Show resolved Hide resolved
packages/vips/src/index.ts Outdated Show resolved Hide resolved
packages/vips/src/types.ts Show resolved Hide resolved
packages/vips/src/types.ts Outdated Show resolved Hide resolved
Copy link
Member

@sirreal sirreal left a comment

Choose a reason for hiding this comment

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

I've reviewed this and it seems ready. There are some remaining questions and minor suggestions from my previous review #64845 (review), but nothing blocking.

},
},
],
},
Copy link
Contributor

Choose a reason for hiding this comment

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

Can someone explain to me how we're building this. What's the story here? We just copy the "wasm" files into the built folders? What does webpack outputs when it finds a wasm dependency? What about the npm packages that we publish, are we changing the constraints for developers using these npm packages if these packages start to require wasm dependencies?

Basically, I'm trying to understand the impact on:

  • npm consumers.
  • WordPress scripts.

Copy link
Member

Choose a reason for hiding this comment

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

It's configured as a webpack "asset", similar to images and other assets. Webpack basically copies the file and exposes the path when the asset is imported.

It shouldn't be published to npm for now, so I don't think that's a concern at this time.

For WordPress scripts it should work because we can figure out the path that needs to be used to access the wasm assets.

These wasm assets are one reason I'd really like to use script modules for this package. Webpack has some wasm module support and the library relies on some modules features, so there may be some simplification available.

Copy link
Contributor

Choose a reason for hiding this comment

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

It shouldn't be published to npm for now, so I don't think that's a concern at this time.

For me that's a concern, my guess is that we're going to add the vips packages as a dependency of block-editor package. So my question is what happens to third-party block editors, will they have to change how their applications builds, feels heavy? How do regular npm packages (in the npm registry) that use wasm dependencies work.

Copy link
Contributor

Choose a reason for hiding this comment

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

In other words, will we have to update https://wordpress.org/gutenberg-framework/ as a consequence of this?

Copy link
Member Author

Choose a reason for hiding this comment

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

For me that's a concern, my guess is that we're going to add the vips packages as a dependency of block-editor package.

Indirectly through the new upload-media package, yes. Note that first this will be behind an experiment in the plugin only, and wouldn't be exposed through the published npm packages (at least that's my idea). So we have some time to iterate on this. Right now this change doesn't affect any published packages.

So my question is what happens to third-party block editors, will they have to change how their applications builds, feels heavy? How do regular npm packages (in the npm registry) that use wasm dependencies work.
In other words, will we have to update https://wordpress.org/gutenberg-framework/ as a consequence of this?

My understanding is that third-party block editor applications will need to update their bundler config to ensure that it supports wasm files. Once this package is published as a script module only, usage might become a bit easier.

Vite (as used by https://wordpress.org/gutenberg-framework/) has some wasm support built-in, but for ESM integration there is vite-plugin-wasm

Copy link
Contributor

Choose a reason for hiding this comment

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

I wonder if asset/inline is actually better for us, that way we can ship npm packages that are ready to use regardless of the bundler config. I'm not sure how I feel about pushing this burden towards consumers.

Ok for me to start as a Gutenberg experiment not exposed to WordPress and npm users.

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 wonder if asset/inline is actually better for us, that way we can ship npm packages that are ready to use regardless of the bundler config.

That sounds really bad for performance if we shove several MB worth of WASM files as data URIs into the JS bundles... I'd much rather have them as separate files so that they can be cached by the browser or even offloaded to a CDN.

Copy link
Contributor

Choose a reason for hiding this comment

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

That sounds really bad for performance if we shove several MB worth of WASM files as data URIs into the JS bundles... I'd much rather have them as separate files so that they can be cached by the browser or even offloaded to a CDN.

Isn't it the same thing for the JS, it can also be cached and offloaded if needed, not sure I follow what's different here.

This comment was marked as resolved.

@swissspidy swissspidy merged commit 5d7ecbe into trunk Oct 21, 2024
68 of 69 checks passed
@swissspidy swissspidy deleted the fix/61447-vips-package branch October 21, 2024 12:41
@github-actions github-actions bot added this to the Gutenberg 19.6 milestone Oct 21, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Media Anything that impacts the experience of managing media [Type] Build Tooling Issues or PRs related to build tooling
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants