@babel/preset-react is a Babel preset that configures all the essential plugins needed for React development. It provides JSX transformation, development-specific debugging features, and optimization plugins in a single, comprehensive preset package.
npm install --save-dev @babel/preset-react// As a Babel preset in babel.config.js
module.exports = {
presets: ["@babel/preset-react"]
};
// With options
module.exports = {
presets: [
["@babel/preset-react", {
runtime: "automatic",
development: true
}]
]
};For programmatic usage:
const presetReact = require("@babel/preset-react");// babel.config.js - Basic configuration
module.exports = {
presets: ["@babel/preset-react"]
};
// With runtime configuration
module.exports = {
presets: [
["@babel/preset-react", {
runtime: "automatic", // Use React 17+ JSX transform
development: process.env.NODE_ENV === "development"
}]
]
};
// Classic runtime configuration
module.exports = {
presets: [
["@babel/preset-react", {
runtime: "classic",
pragma: "React.createElement",
pragmaFrag: "React.Fragment"
}]
]
};The preset is built around several core components:
declarePreset that configures React transformation pluginsnormalizeOptionsThe main preset function that configures all React transformation plugins.
/**
* Main preset function that configures React transformation plugins
* @param api - Babel API object with version assertion and environment methods
* @param opts - Configuration options for the preset
* @returns Preset configuration object with plugins array
*/
function presetReact(api: any, opts: Options): {
plugins: Array<[Plugin, PluginOptions] | Plugin | false>;
};Complete configuration interface for customizing preset behavior.
interface Options {
/** Enable development-specific transformations (default: false) */
development?: boolean;
/** Custom import source for JSX functions (default: "react" for automatic runtime) */
importSource?: string;
/** JSX pragma function name for classic runtime (default: "React.createElement") */
pragma?: string;
/** JSX fragment pragma for classic runtime (default: "React.Fragment") */
pragmaFrag?: string;
/** Pure annotation for tree-shaking optimization (default: true) */
pure?: boolean;
/** JSX transformation runtime mode */
runtime?: "automatic" | "classic";
/** Throw error on JSX namespaces (default: true) */
throwIfNamespace?: boolean;
/** Use built-in helpers (legacy, Babel 7 only) */
useBuiltIns?: boolean;
/** Use spread syntax (legacy, Babel 7 only) */
useSpread?: boolean;
}The preset supports two JSX transformation modes:
Uses the new JSX transform that doesn't require React to be in scope:
// Configuration
{
runtime: "automatic",
importSource: "react" // default
}
// Input JSX
<div>Hello World</div>
// Output (production)
import { jsx as _jsx } from "react/jsx-runtime";
/*#__PURE__*/_jsx("div", { children: "Hello World" });Uses the traditional React.createElement transform:
// Configuration
{
runtime: "classic",
pragma: "React.createElement", // default
pragmaFrag: "React.Fragment" // default
}
// Input JSX
<div>Hello World</div>
// Output
React.createElement("div", null, "Hello World");When development: true or in development environment:
@babel/plugin-transform-react-jsx-development for enhanced debugging// Development output
var _jsxFileName = "/path/to/file.jsx";
import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
/*#__PURE__*/_jsxDEV("div", {
children: "Hello World"
}, void 0, false, {
fileName: _jsxFileName,
lineNumber: 1,
columnNumber: 1
}, this);The preset automatically configures these Babel plugins:
Comprehensive options validation and normalization.
/**
* Validates and normalizes preset configuration options
* @param options - Raw options object from user configuration
* @returns Normalized options with validated values and defaults
*/
function normalizeOptions(options: any): {
development?: boolean;
importSource?: string;
pragma?: string;
pragmaFrag?: string;
pure?: string;
runtime?: "automatic" | "classic";
throwIfNamespace?: boolean;
useBuiltIns?: boolean;
useSpread?: boolean;
};// babel.config.js
module.exports = {
presets: ["@babel/preset-react"]
};// babel.config.js
module.exports = {
presets: [
["@babel/preset-react", {
runtime: "automatic"
}]
]
};// babel.config.js - For custom JSX libraries
module.exports = {
presets: [
["@babel/preset-react", {
runtime: "classic",
pragma: "h", // Use Preact's h function
pragmaFrag: "Fragment"
}]
]
};// babel.config.js
module.exports = {
presets: [
["@babel/preset-react", {
runtime: "automatic",
development: process.env.NODE_ENV === "development"
}]
]
};// babel.config.js - For custom React implementations
module.exports = {
presets: [
["@babel/preset-react", {
runtime: "automatic",
importSource: "@emotion/react" // Use Emotion's JSX
}]
]
};The preset provides comprehensive error handling and validation:
Common errors and solutions:
// Invalid runtime
{
runtime: "invalid"
}
// Error: @babel/preset-react: 'runtime' must be one of ['automatic', 'classic']
// Babel 8 deprecated options
{
useSpread: true
}
// Error: Since Babel 8, the "useSpread" option is no longer available