React 17 Upgrade
Most of the MFEs of edX are currently using React JS v16. In order to use latest React JS, we are planning to upgrade React JS to v17. React 17 doesn’t add any new developer-facing features, so its upgrade might not cause any breaking changes. Our end goal is to upgrade React to v18 but v18 no longer support enzyme, so we are upgrading to React 17 and then we’ll migrate from enzyme.
Features of React 17
Enabling the gradual upgrades: Previously required upgrading whole app at once, gets increasingly challenging if the codebase was ancient and isn’t actively maintained. We can now upgrade it in parts apart from upgrading the whole app (better to upgrade the whole app though).
Event delegation Change: Previously attaches all the events at a document(top) level, in 17 they decided to shift from document level to the root DOM container into which React tree is rendered.
New JSX transform: React imports no longer required to use JSX, more geared towards how JSX is compiled rather than a feature change, comes with a performance boost. This does bring about code changes, but nothing major and pretty easy to manage. (Removing import statement will result in linter going off but
eslint
config upgrade should take care of it)
From changeLog
Don't emulate bubbling of the
onScroll
eventUse browser
focusin
andfocusout
foronFocus
andonBlur
Make all
Capture
events use the browser capture phraseRemove event pooling
Run
useEffect
cleanup function asynchronouslyFor some packages their older versions could cause issues with react v17 upgrade (pinned couple)
Approach
We will create tickets in each MFE for React upgrade and all the tickets will be added in Maintenance board. Then we’ll create PRs in each MFEs and will add those in the Maintenance board as well.
Steps to upgrade
Node version set to 18
Update
react
&react-dom
to v17Remove node_modules, package-lock.
rm -rf node_modules package-lock.json
Reinstall and re-build:
npm install && npm run build
You may need to upgrade other libraries, for example in case of Typescript:
npm install @types/react@17.0.0
If you are using React Testing Library, you would want to be under 12.1.5, which is the latest version that supports React < 18. Replaceenzyme-adapter-react-16
with@wojtekmaj/enzyme-adapter-react-17
since enzyme doesn't provide support for react 17.react-test-renderer
should also be updated.Upgrade all other packages causing dependency conflicts
Upgrade all edx packages used in the MFE to their react 17 versions
Try to run the project
npm run start
and fix dependencies along with possible breaks, note all the issuesRemove node_modules, package-lock.
rm -rf node_modules package-lock.json
Reinstall and re-build:
npm install && npm run build
Run unit tests, linting and build scripts if exists.
Test extract (pull/push) translations
Start & test the project, full regression test and hopefully a good coverage
Perform consumer testing if its a library to check its impacts on consumers
If its a library and consumers are breaking with React JS upgrade, it should be release as a major version so renovate doesn’t auto merge its changes in consumers.
Roadmap Link
React 17 upgrade · Issue #277 · openedx/platform-roadmap
In case of any help/queries, you can contact us on slack at #tech-fed-bom.