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

Editor: Replace deep clone dependency with native structured clone #11799

Merged
merged 5 commits into from
Jul 1, 2022

Conversation

timarney
Copy link
Contributor

@timarney timarney commented Jun 24, 2022

Context

structuredClone is now available in all browsers. We currently use clone-deep for this purpose.

We should remove this dependency and use the browser native alternative.

Summary

Replaces clone-deep with structuredClone

Relevant Technical Choices

To-do

User-facing changes

Testing Instructions

  • This is a non-user-facing change and requires no QA

This PR can be tested by following these steps:

Reviews

Does this PR have a security-related impact?

No

Does this PR change what data or activity we track or use?

No

Does this PR have a legal-related impact?

No

Checklist

  • This PR addresses an existing issue and I have linked this PR to it in ZenHub
  • I have tested this code to the best of my abilities
  • I have verified accessibility to the best of my abilities (docs)
  • I have verified i18n and l10n (translation, right-to-left layout) to the best of my abilities
  • This code is covered by automated tests (unit, integration, and/or e2e) to verify it works as intended (docs)
  • I have added documentation where necessary
  • I have added a matching Type: XYZ label to the PR

Fixes #11505

@timarney timarney added Package: Story Editor /packages/story-editor Pod: Prometheus Type: Code Quality Things that need a refactor, rewrite or just some good old developer ❤️ Type: Enhancement New feature or improvement of an existing feature labels Jun 24, 2022
Copy link
Contributor

@barklund barklund 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!

Have you checked for any cloning via JSON (i.e. JSON.parse(JSON.stringify(object))) in the source code? I have a feeling we might be doing that, but not sure.

@timarney
Copy link
Contributor Author

Have you checked for any cloning via JSON (i.e. JSON.parse(JSON.stringify(object))) in the source code? I have a feeling we might be doing that, but not sure.

I searched the code base ... I didn't turn up any instances.

@timarney timarney marked this pull request as ready for review June 27, 2022 09:38
@spacedmonkey
Copy link
Contributor

Just checking this is not related

function getUniquePresets(presets) {
const list = presets.map((preset) => JSON.stringify(preset));
return Array.from(new Set(list)).map((preset) => JSON.parse(preset));
}

@merapi
Copy link
Contributor

merapi commented Jun 27, 2022

Just checking this is not related

function getUniquePresets(presets) {
const list = presets.map((preset) => JSON.stringify(preset));
return Array.from(new Set(list)).map((preset) => JSON.parse(preset));
}

Not related, here we would need something native for deep comparison.

@merapi
Copy link
Contributor

merapi commented Jun 27, 2022

Regarding the #11505 (comment)

@swissspidy you commented on May 18 and the second Safari version with structuredClone was released on May 17 so technically we were already good back then, but the first version that supported it was released not that long ago on March 14 so the question is - should we include the polyfill for those users? Chrome/Edge/Opera supports it since early Feb so any device with an older browser will not run the editor. Maybe we can check our analytics data?

@timarney
Copy link
Contributor Author

timarney commented Jun 29, 2022

@merapi

I think the polyfill is automatic from the browser config for whatever browsers need it

so with our browserslist config (last 2 Safari versions), this will probably include the structuredClone polyfill from core-js in our bundle,

See: #11505 (comment)

Regarding the #11505 (comment)

@swissspidy you commented on May 18 and the second Safari version with structuredClone was released on May 17 so technically we were already good back then, but the first version that supported it was released not that long ago on March 14 so the question is - should we include the polyfill for those users? Chrome/Edge/Opera supports it since early Feb so any device with an older browser will not run the editor. Maybe we can check our analytics data?

@swissspidy
Copy link
Collaborator

swissspidy commented Jun 29, 2022

I think what Marcin is saying is that with our current browserslist config the polyfill would not be included anymore, since the addition to browsers is rather new but there have been >2 new releases since then, yet not all users might be on these latest two versions.

So in accordance with our browser support policy, the question is whether we'd want/need to force our polyfill to be included so that our editor still works for users on Safari 15.3 or older. So the ask is to check analytics to see how our Safari usage looks like to inform such a decision.

I'll happily check our analytics.

From what I can see at first glance, the polyfill should still be included because of the "last 2 Opera versions" directive, and structuredClone was only added in the latest Opera version v84.

I haven't checked the built code though to confirm.

@github-actions
Copy link
Contributor

github-actions bot commented Jun 29, 2022

Size Change: +9.06 kB (0%)

Total Size: 2.65 MB

Filename Size Change
assets/js/3570.js 0 B -26.6 kB (removed) 🏆
assets/js/wp-story-editor.js 322 kB +977 B (0%)
assets/js/2505.js 34.8 kB +34.8 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size Change
assets/css/carousel-view-rtl.css 702 B 0 B
assets/css/carousel-view.css 701 B 0 B
assets/css/web-stories-block-rtl.css 4.5 kB 0 B
assets/css/web-stories-block.css 4.55 kB 0 B
assets/css/web-stories-embed-rtl.css 318 B 0 B
assets/css/web-stories-embed.css 317 B 0 B
assets/css/web-stories-list-styles-rtl.css 2.34 kB 0 B
assets/css/web-stories-list-styles.css 2.37 kB 0 B
assets/css/web-stories-theme-style-twentyeleven-rtl.css 102 B 0 B
assets/css/web-stories-theme-style-twentyeleven.css 102 B 0 B
assets/css/web-stories-theme-style-twentyfifteen-rtl.css 251 B 0 B
assets/css/web-stories-theme-style-twentyfifteen.css 251 B 0 B
assets/css/web-stories-theme-style-twentyfourteen-rtl.css 287 B 0 B
assets/css/web-stories-theme-style-twentyfourteen.css 287 B 0 B
assets/css/web-stories-theme-style-twentyseventeen-rtl.css 288 B 0 B
assets/css/web-stories-theme-style-twentyseventeen.css 288 B 0 B
assets/css/web-stories-theme-style-twentysixteen-rtl.css 224 B 0 B
assets/css/web-stories-theme-style-twentysixteen.css 224 B 0 B
assets/css/web-stories-theme-style-twentyten-rtl.css 143 B 0 B
assets/css/web-stories-theme-style-twentyten.css 143 B 0 B
assets/css/web-stories-theme-style-twentytwelve-rtl.css 256 B 0 B
assets/css/web-stories-theme-style-twentytwelve.css 256 B 0 B
assets/css/web-stories-theme-style-twentytwenty-rtl.css 86 B 0 B
assets/css/web-stories-theme-style-twentytwenty.css 86 B 0 B
assets/css/web-stories-theme-style-twentytwentyone-rtl.css 326 B 0 B
assets/css/web-stories-theme-style-twentytwentyone.css 326 B 0 B
assets/css/web-stories-widget-rtl.css 482 B 0 B
assets/css/web-stories-widget.css 482 B 0 B
assets/css/wp-dashboard-rtl.css 657 B 0 B
assets/css/wp-dashboard.css 659 B 0 B
assets/css/wp-story-editor-rtl.css 737 B 0 B
assets/css/wp-story-editor.css 738 B 0 B
assets/js/1814.js 7.45 kB 0 B
assets/js/3617.js 224 kB 0 B
assets/js/4422.js 49.3 kB 0 B
assets/js/5980.js 5.48 kB 0 B
assets/js/7.js 1.14 MB 0 B
assets/js/carousel-view.js 3.41 kB 0 B
assets/js/chunk-colorthief.js 2.64 kB 0 B
assets/js/chunk-ffmpeg.js 5.64 kB 0 B
assets/js/chunk-focus-visible.js 1.01 kB 0 B
assets/js/chunk-getStoryMarkup.js 5.82 kB -13 B (0%)
assets/js/chunk-html-to-image.js 4.6 kB 0 B
assets/js/chunk-opentype.js 96 B 0 B
assets/js/chunk-react-calendar.js 12.4 kB 0 B
assets/js/chunk-react-color.js 44.3 kB 0 B
assets/js/chunk-resize-observer-polyfill.js 2.57 kB 0 B
assets/js/chunk-web-animations-js.js 14.6 kB 0 B
assets/js/chunk-web-stories-template-0-metaData.js 546 B 0 B
assets/js/chunk-web-stories-template-0.js 10.6 kB 0 B
assets/js/chunk-web-stories-template-1-metaData.js 540 B 0 B
assets/js/chunk-web-stories-template-1.js 9.01 kB 0 B
assets/js/chunk-web-stories-template-10-metaData.js 533 B 0 B
assets/js/chunk-web-stories-template-10.js 6.91 kB 0 B
assets/js/chunk-web-stories-template-11-metaData.js 540 B 0 B
assets/js/chunk-web-stories-template-11.js 8.51 kB 0 B
assets/js/chunk-web-stories-template-12-metaData.js 496 B 0 B
assets/js/chunk-web-stories-template-12.js 9.48 kB 0 B
assets/js/chunk-web-stories-template-13-metaData.js 525 B 0 B
assets/js/chunk-web-stories-template-13.js 7.3 kB 0 B
assets/js/chunk-web-stories-template-14-metaData.js 582 B 0 B
assets/js/chunk-web-stories-template-14.js 7.58 kB 0 B
assets/js/chunk-web-stories-template-15-metaData.js 544 B 0 B
assets/js/chunk-web-stories-template-15.js 8.21 kB 0 B
assets/js/chunk-web-stories-template-16-metaData.js 588 B 0 B
assets/js/chunk-web-stories-template-16.js 10.3 kB 0 B
assets/js/chunk-web-stories-template-17-metaData.js 539 B 0 B
assets/js/chunk-web-stories-template-17.js 8.52 kB 0 B
assets/js/chunk-web-stories-template-18-metaData.js 585 B 0 B
assets/js/chunk-web-stories-template-18.js 9.05 kB 0 B
assets/js/chunk-web-stories-template-19-metaData.js 501 B 0 B
assets/js/chunk-web-stories-template-19.js 9.99 kB 0 B
assets/js/chunk-web-stories-template-2-metaData.js 586 B 0 B
assets/js/chunk-web-stories-template-2.js 9.16 kB 0 B
assets/js/chunk-web-stories-template-20-metaData.js 548 B 0 B
assets/js/chunk-web-stories-template-20.js 8.59 kB 0 B
assets/js/chunk-web-stories-template-21-metaData.js 534 B 0 B
assets/js/chunk-web-stories-template-21.js 9.16 kB 0 B
assets/js/chunk-web-stories-template-22-metaData.js 525 B 0 B
assets/js/chunk-web-stories-template-22.js 7.37 kB 0 B
assets/js/chunk-web-stories-template-23-metaData.js 605 B 0 B
assets/js/chunk-web-stories-template-23.js 6.99 kB 0 B
assets/js/chunk-web-stories-template-24-metaData.js 518 B 0 B
assets/js/chunk-web-stories-template-24.js 10.8 kB 0 B
assets/js/chunk-web-stories-template-25-metaData.js 544 B 0 B
assets/js/chunk-web-stories-template-25.js 7.07 kB 0 B
assets/js/chunk-web-stories-template-26-metaData.js 601 B 0 B
assets/js/chunk-web-stories-template-26.js 6.85 kB 0 B
assets/js/chunk-web-stories-template-27-metaData.js 543 B 0 B
assets/js/chunk-web-stories-template-27.js 7.36 kB 0 B
assets/js/chunk-web-stories-template-28-metaData.js 532 B 0 B
assets/js/chunk-web-stories-template-28.js 8.49 kB 0 B
assets/js/chunk-web-stories-template-29-metaData.js 561 B 0 B
assets/js/chunk-web-stories-template-29.js 8.49 kB 0 B
assets/js/chunk-web-stories-template-3-metaData.js 540 B 0 B
assets/js/chunk-web-stories-template-3.js 8.22 kB 0 B
assets/js/chunk-web-stories-template-30-metaData.js 576 B 0 B
assets/js/chunk-web-stories-template-30.js 7.67 kB 0 B
assets/js/chunk-web-stories-template-31-metaData.js 503 B 0 B
assets/js/chunk-web-stories-template-31.js 9.61 kB 0 B
assets/js/chunk-web-stories-template-32-metaData.js 551 B 0 B
assets/js/chunk-web-stories-template-32.js 12.2 kB 0 B
assets/js/chunk-web-stories-template-33-metaData.js 492 B 0 B
assets/js/chunk-web-stories-template-33.js 8.86 kB 0 B
assets/js/chunk-web-stories-template-34-metaData.js 571 B 0 B
assets/js/chunk-web-stories-template-34.js 7.57 kB 0 B
assets/js/chunk-web-stories-template-35-metaData.js 565 B 0 B
assets/js/chunk-web-stories-template-35.js 8.81 kB 0 B
assets/js/chunk-web-stories-template-36-metaData.js 576 B 0 B
assets/js/chunk-web-stories-template-36.js 11.6 kB 0 B
assets/js/chunk-web-stories-template-37-metaData.js 528 B 0 B
assets/js/chunk-web-stories-template-37.js 6.47 kB 0 B
assets/js/chunk-web-stories-template-38-metaData.js 572 B 0 B
assets/js/chunk-web-stories-template-38.js 7.96 kB 0 B
assets/js/chunk-web-stories-template-39-metaData.js 589 B 0 B
assets/js/chunk-web-stories-template-39.js 7.67 kB 0 B
assets/js/chunk-web-stories-template-4-metaData.js 565 B 0 B
assets/js/chunk-web-stories-template-4.js 11.5 kB 0 B
assets/js/chunk-web-stories-template-40-metaData.js 556 B 0 B
assets/js/chunk-web-stories-template-40.js 9.13 kB 0 B
assets/js/chunk-web-stories-template-41-metaData.js 572 B 0 B
assets/js/chunk-web-stories-template-41.js 7.75 kB 0 B
assets/js/chunk-web-stories-template-42-metaData.js 522 B 0 B
assets/js/chunk-web-stories-template-42.js 7 kB 0 B
assets/js/chunk-web-stories-template-43-metaData.js 558 B 0 B
assets/js/chunk-web-stories-template-43.js 8.37 kB 0 B
assets/js/chunk-web-stories-template-44-metaData.js 582 B 0 B
assets/js/chunk-web-stories-template-44.js 10.1 kB 0 B
assets/js/chunk-web-stories-template-45-metaData.js 564 B 0 B
assets/js/chunk-web-stories-template-45.js 7.12 kB 0 B
assets/js/chunk-web-stories-template-46-metaData.js 531 B 0 B
assets/js/chunk-web-stories-template-46.js 5.01 kB 0 B
assets/js/chunk-web-stories-template-47-metaData.js 592 B 0 B
assets/js/chunk-web-stories-template-47.js 8.46 kB 0 B
assets/js/chunk-web-stories-template-48-metaData.js 556 B 0 B
assets/js/chunk-web-stories-template-48.js 8.31 kB 0 B
assets/js/chunk-web-stories-template-49-metaData.js 518 B 0 B
assets/js/chunk-web-stories-template-49.js 9.7 kB 0 B
assets/js/chunk-web-stories-template-5-metaData.js 555 B 0 B
assets/js/chunk-web-stories-template-5.js 9.38 kB 0 B
assets/js/chunk-web-stories-template-50-metaData.js 504 B 0 B
assets/js/chunk-web-stories-template-50.js 8.26 kB 0 B
assets/js/chunk-web-stories-template-51-metaData.js 527 B 0 B
assets/js/chunk-web-stories-template-51.js 9.89 kB 0 B
assets/js/chunk-web-stories-template-52-metaData.js 602 B 0 B
assets/js/chunk-web-stories-template-52.js 10.1 kB 0 B
assets/js/chunk-web-stories-template-53-metaData.js 553 B 0 B
assets/js/chunk-web-stories-template-53.js 5.79 kB 0 B
assets/js/chunk-web-stories-template-54-metaData.js 547 B 0 B
assets/js/chunk-web-stories-template-54.js 7.52 kB 0 B
assets/js/chunk-web-stories-template-55-metaData.js 574 B 0 B
assets/js/chunk-web-stories-template-55.js 6.56 kB 0 B
assets/js/chunk-web-stories-template-56-metaData.js 543 B 0 B
assets/js/chunk-web-stories-template-56.js 9.5 kB 0 B
assets/js/chunk-web-stories-template-57-metaData.js 528 B 0 B
assets/js/chunk-web-stories-template-57.js 14.1 kB 0 B
assets/js/chunk-web-stories-template-58-metaData.js 556 B 0 B
assets/js/chunk-web-stories-template-58.js 5.61 kB 0 B
assets/js/chunk-web-stories-template-59-metaData.js 588 B 0 B
assets/js/chunk-web-stories-template-59.js 8.52 kB 0 B
assets/js/chunk-web-stories-template-6-metaData.js 569 B 0 B
assets/js/chunk-web-stories-template-6.js 7.04 kB 0 B
assets/js/chunk-web-stories-template-60-metaData.js 509 B 0 B
assets/js/chunk-web-stories-template-60.js 8.89 kB 0 B
assets/js/chunk-web-stories-template-7-metaData.js 569 B 0 B
assets/js/chunk-web-stories-template-7.js 7.21 kB 0 B
assets/js/chunk-web-stories-template-8-metaData.js 569 B 0 B
assets/js/chunk-web-stories-template-8.js 8.4 kB 0 B
assets/js/chunk-web-stories-template-9-metaData.js 581 B 0 B
assets/js/chunk-web-stories-template-9.js 8.49 kB 0 B
assets/js/chunk-web-stories-templates.js 443 B 0 B
assets/js/chunk-web-stories-textset-0.js 5.08 kB 0 B
assets/js/chunk-web-stories-textset-1.js 6.64 kB 0 B
assets/js/chunk-web-stories-textset-2.js 7.67 kB 0 B
assets/js/chunk-web-stories-textset-3.js 15.1 kB 0 B
assets/js/chunk-web-stories-textset-4.js 4.16 kB 0 B
assets/js/chunk-web-stories-textset-5.js 5.49 kB 0 B
assets/js/chunk-web-stories-textset-6.js 5.3 kB 0 B
assets/js/chunk-web-stories-textset-7.js 10.2 kB 0 B
assets/js/generateBlurhash.worker.worker.js 1.1 kB 0 B
assets/js/imgareaselect.js 3.77 kB 0 B
assets/js/lightbox.js 550 B 0 B
assets/js/tinymce-button.js 2.84 kB 0 B
assets/js/web-stories-activation-notice.js 26.9 kB 0 B
assets/js/web-stories-block.js 22.7 kB 0 B
assets/js/web-stories-embed.js 20 B 0 B
assets/js/web-stories-widget.js 587 B 0 B
assets/js/wp-dashboard.js 72 kB -27 B (0%)

compressed-size-action

@googleforcreators-bot
Copy link
Collaborator

googleforcreators-bot commented Jun 29, 2022

Plugin builds for d244fee are ready 🛎️!

@merapi
Copy link
Contributor

merapi commented Jun 29, 2022

From what I can see at first glance, the polyfill should still be included because of the "last 2 Opera versions" directive, and structuredClone was only added in the latest Opera version v84.

Opera should be fine, I have v86 and structuredClone is supported like your said since v84.
The polyfill is not included - tested on older Safari:

image

@swissspidy
Copy link
Collaborator

So it looks like ~20% of Safari users are on version ≤ 15.3, so it would be good if we could include the polyfill for now.

We should be able to achieve this by adding Safari 15.3 to .browserslistrc for the time being (with an explanatory comment) and then remove it after a while when numbers drop.

Of course needs verification that the polyfill is indeed included as expected.

@swissspidy
Copy link
Collaborator

^ Can you all confirm that the polyfill is included with this change? Needs testing for sure.

@merapi
Copy link
Contributor

merapi commented Jun 30, 2022

Of course needs verification that the polyfill is indeed included as expected.

I'm testing that and something is wrong here, even last 10 Safari versions don't make it work on older Safari, maybe this structuredClone is too new or I'm making some mistake.

@merapi
Copy link
Contributor

merapi commented Jun 30, 2022

I tested it on multiple browsers e.g. Chrome 97. The polyfill is just not included no matter what I try, I also tested Array.at polyfill on Chrome 91 to rule out the one-off oddity of structuredClone polyfill - also no luck.

@swissspidy
Copy link
Collaborator

swissspidy commented Jul 1, 2022

Does changing this line:

to corejs: '3.23' change things for you?

I just read in the docs that apparently corejs: 3 is interpreted as 3.0, and in 3.0 that polyfill was not included yet.

When I do this and run npm run dev I do see references to core-js/modules/web.structured-clone.js in the generated JS files. I just don't have an older Safari around to verify it.

With corejs: 3 I do not see these references. So it does make a difference.

@merapi
Copy link
Contributor

merapi commented Jul 1, 2022

Does changing this line:

to corejs: '3.23' change things for you?

I just read in the docs that apparently corejs: 3 is interpreted as 3.0, and in 3.0 that polyfill was not included yet.

When I do this and run npm run dev I do see references to core-js/modules/web.structured-clone.js in the generated JS files. I just don't have an older Safari around to verify it.

With corejs: 3 I do not see these references. So it does make a difference.

It works! 🎉
Great find Pascal!
TIL, I was playing with core-js options and didn't see this:

image

- Who puts "Warning" in a grayed-out color instead of big bold red? 😄 

…js: 3 doesn't include minor releases - credit to Pascal
Copy link
Contributor

@merapi merapi left a comment

Choose a reason for hiding this comment

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

Also tested on QA env on older Safari - ✅

@merapi merapi merged commit 083202e into main Jul 1, 2022
@merapi merapi deleted the fix/11505-remove-clone-deep branch July 1, 2022 21:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Package: Story Editor /packages/story-editor Type: Code Quality Things that need a refactor, rewrite or just some good old developer ❤️ Type: Enhancement New feature or improvement of an existing feature
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Editor: Replace deep clone dependency with native structured clone
6 participants