-
Notifications
You must be signed in to change notification settings - Fork 4.1k
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
Interactivity: Fix broken react usage in published package #58258
Conversation
Size Change: -66 B (0%) Total Size: 1.7 MB
ℹ️ View Unchanged
|
1f488c5
to
7d6bb36
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Working fine! 🙂
7d6bb36
to
9e136ff
Compare
Flaky tests detected in 9e136ff. 🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/7695209496
|
@wordpress/interactivity depends on preact, not react. - Enable the "no react in scope" eslint rule for the interactivity packages. - Add pragmas to set the JSX transform the use createElement. - Import Preact's `h` as `createElement` explicitly. This setup ensures that `@wordpress/babel-plugin-import-jsx-pragma` does not add a `createElement` import from React because it detects createElement is already in scope.
I just cherry-picked this PR to the release/17.6 branch to get it included in the next release: |
@wordpress/interactivity depends on preact, not react. - Enable the "no react in scope" eslint rule for the interactivity packages. - Add pragmas to set the JSX transform the use createElement. - Import Preact's `h` as `createElement` explicitly. This setup ensures that `@wordpress/babel-plugin-import-jsx-pragma` does not add a `createElement` import from React because it detects createElement is already in scope.
What?
Fix broken
@wordpress/interactivity
published package.Why?
@wordpress/interactivity
depends on preact, not react.Packages are built two ways:
When this package is built for the plugin, it uses a different webpack config that correctly handles the jsx transform and the preact jsx auto imports:
gutenberg/tools/webpack/interactivity.js
Lines 58 to 67 in 388a1e9
However, when built for NPM it uses the standard configuration which imports
createElement
fromreact
resulting in a package that doesn't work as expected. You can see the unexpected react import here.How?
I consider this a short-term fix:
createElement
.h
ascreateElement
explicitly.This setup ensures that
@wordpress/babel-plugin-import-jsx-pragma
does not add acreateElement
import fromreact
(because it detectscreateElement
is already in scope.It is fragile because if we don't alias the preact
h
import tocreateElement
then@wordpress/babel-plugin-import-jsx-pragma
would add a react import.Testing Instructions
I've tested this 2 ways
In WordPress, locally build and run WordPress and confirm that interactivity is still working. I tested with the default themes navigation block query loop by disabling its "force page reload" setting.
As an npm package. I published a version of this for testing (confirm no react here) and made a small app that I compiled with
webpack-cli
(default config) and served locally. Gist of the source is here.Next
This is a short term fix so the package is not broken in the short term.
It would be nice to see if we can remove and deprecate some of our custom babel transforms and use babel's react preset with the automatic JSX runtime. That's a bigger and more complicated change.
Concerns
This is fragile and not a long term solution. It relies on adding and aliasing an import and there are limited safeguards to ensure it's done correctly.
Fortunately, I don't believe the other things using the Interactivity API (the view files listed here) can use Preact directly, which mitigates some of the problems.