JSX compiled to React.createElement required React to be in scope; the new transform imports what it needs itself.
// before
import React from 'react'
export const Badge = () => <span>new</span>
// after — no import needed for JSX alone
export const Badge = () => <span>new</span>
// the compiler emits:
// import { jsx as _jsx } from 'react/jsx-runtime'
//
// hooks still need importing. only the JSX import goes.
The output is marginally smaller and the ceremony disappears, and the real value is that a file using JSX and no React API no longer imports something it does not use — which the linter had to be told to ignore. Removing the imports across a codebase is a codemod rather than a manual pass. It requires React 17 and a build tool that knows about the runtime, so a project on an older Babel configuration gets a confusing error rather than a fallback.