{"id":20210,"library":"metro-babel-register","title":"metro-babel-register","description":"A babel/register configuration specifically for Metro, the JavaScript bundler for React Native. Version 0.84.3 is the latest stable release, with monthly releases on the Metro 0.84.x branch. It provides a pre-configured Babel require hook that enables on-the-fly transpilation of Node.js modules during Metro's build process. Key differentiators: it is deeply integrated with Metro's own Babel presets and plugins, ensuring compatibility with React Native's transform pipeline. Unlike generic `@babel/register`, this package automatically applies Metro's custom transforms and ignores, matching the bundler's internal behavior. It is designed for development-time use, typically in custom Metro plugins or scripts that need to evaluate source files with Babel. No external dependencies beyond @babel/register and @babel/core.","status":"active","version":"0.84.3","language":"javascript","source_language":"en","source_url":"https://github.com/facebook/metro","tags":["javascript"],"install":[{"cmd":"npm install metro-babel-register","lang":"bash","label":"npm"},{"cmd":"yarn add metro-babel-register","lang":"bash","label":"yarn"},{"cmd":"pnpm add metro-babel-register","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"Core peer dependency; provides the babel/register hook that can be configured with Metro's presets.","package":"@babel/register","optional":false},{"reason":"Required by @babel/register; may need to be installed explicitly.","package":"@babel/core","optional":true}],"imports":[{"note":"This package is intended for CommonJS require hook; ESM import may not work because it modifies Node's require.extensions before module evaluation. Use require() at the top of entry file.","wrong":"import 'metro-babel-register'","symbol":"metro-babel-register","correct":"require('metro-babel-register')"},{"note":"The module exports a function `register` that can be called to customize the hook. ESM import is not recommended; use require for side-effect hook.","wrong":"import { register } from 'metro-babel-register'","symbol":"register","correct":"require('metro-babel-register').register()"},{"note":"The default export is a function that configures and applies the hook. Use require() to avoid ESM/CommonJS interop issues.","wrong":"import metroBabelRegister from 'metro-babel-register'","symbol":"default","correct":"const metroBabelRegister = require('metro-babel-register'); metroBabelRegister();"}],"quickstart":{"code":"// Install: npm install --save-dev metro-babel-register\n\n// In your entry script (e.g., metro-plugin.js):\nrequire('metro-babel-register')({\n  // Optional: override babel config options\n  ignore: [/node_modules/], // default ignores node_modules\n  presets: ['@babel/preset-env'],\n  plugins: ['@babel/plugin-transform-modules-commonjs']\n});\n\n// Now you can require files that use modern JS/JSX:\nconst myModule = require('./path/to/component.jsx');\n\n// Or simply use default behavior (no options):\nrequire('metro-babel-register');\nconst { App } = require('./App');","lang":"javascript","description":"Shows how to require and configure metro-babel-register to enable on-the-fly transpilation for Node.js scripts, with example of overriding default Babel presets."},"warnings":[{"fix":"Use Node >=20.19.4 (LTS) or >=22.x. Avoid Node v21, v23.","message":"Node.js version requirements changed: v0.84.0 dropped support for Node v21, v23, and LTS minors before v20.19.","severity":"breaking","affected_versions":">=0.84.0"},{"fix":"Only use in isolated scripts or ensure it is loaded after other hooks. Consider using it as the first require in your entry point.","message":"metro-babel-register modifies Node's require hook globally. This can interfere with other tools that rely on their own require hooks (e.g., ts-node or @babel/register).","severity":"gotcha","affected_versions":"*"},{"fix":"Provide an explicit `ignore` array that does not exclude the specific dependency, or set `ignore: []` to transpile everything.","message":"The default ignore list excludes node_modules. If you need to transpile dependencies (e.g., for ES module interop), you must override the 'ignore' option.","severity":"gotcha","affected_versions":"*"},{"fix":"Call `require('metro-babel-register')({ /* options */ })` even if empty object.","message":"Using default export without options may be deprecated in future versions; prefer calling with explicit config object.","severity":"deprecated","affected_versions":">=0.84"}],"env_vars":null,"last_verified":"2026-04-25T00:00:00.000Z","next_check":"2026-07-24T00:00:00.000Z","problems":[{"fix":"npm install --save-dev @babel/core","cause":"Missing peer dependency @babel/core.","error":"Error: Cannot find module '@babel/core'"},{"fix":"Use dynamic import() for .mjs files or convert to .js with CommonJS syntax.","cause":"metro-babel-register does not handle native ESM files (.mjs). It only transpiles CommonJS modules.","error":"require() of ES Module /path/to/file.mjs not supported"},{"fix":"Use require('metro-babel-register') instead of import, or use require('metro-babel-register').default() to get the function.","cause":"Using ESM import syntax (import ... from) which returns a module namespace object, not the function directly.","error":"TypeError: metro_babel_register is not a function"}],"ecosystem":"npm","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}