# react-native-esbuild **Repository Path**: mirrors_trending/react-native-esbuild ## Basic Information - **Project Name**: react-native-esbuild - **Description**: Fast bundler and dev server for react-native using esbuild - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-06-19 - **Last Updated**: 2026-01-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

react-native-esbuild

The fastest bundler for React Native.

## Features - **Fast** – ~10-50x faster depending on project - **Tree shaking** – Smaller bundles means faster apps (**21% smaller** for `init` project) - **Compatible** – Drop-in replacement for metro - **Configurable** – Support for custom transformers and env variables ## Sponsoring If this library helped you, please consider [sponsoring](https://github.com/sponsors/oblador). ## Installation ```shell yarn add react-native-esbuild esbuild ``` ## Configuration ### `react-native` CLI plugin Make sure `react-native.config.js` exists in the root of your project, and create one if not. Add this library to the `commands` section like this: ```js // react-native.config.js const { commands } = require('react-native-esbuild'); module.exports = { commands, }; ``` ### Optional: Esbuild settings If you want to customize the [esbuild configuration](https://esbuild.github.io/api/#simple-options), for example by adding your own plugins you may do so with the `createEsbuildCommands` function: ```js // react-native.config.js const { createEsbuildCommands, babelPlugin } = require('react-native-esbuild'); // See https://esbuild.github.io/api/#simple-options const commands = createEsbuildCommands((config) => ({ ...config, plugins: config.plugins.concat( babelPlugin({ filter: /src\/my-babel-components\/.+\.[tj]sx?$/, }) ), })); module.exports = { commands, }; ``` ### Optional: Use esbuild for development 1. Open `package.json` in your editor and locate `scripts` section. 2. Edit `start` script to be `react-native esbuild-start`. 3. Prevent metro from starting automatically by appending `--no-packager` to the `ios`/`android` scripts. ```json { "scripts": { "android": "react-native run-android --no-packager", "ios": "react-native run-ios --no-packager", "start": "react-native esbuild-start" } } ``` ### Optional: Build production app with esbuild #### Android Set `project.ext.react.bundleCommand` to `esbuild-bundle` in `android/app/build.gradle`: ```gradle // android/app/build.gradle project.ext.react = [ enableHermes: false, bundleCommand: "esbuild-bundle", ] ``` #### iOS 1. Open your iOS project in Xcode manually or with `xed ios` 2. Select the `Build Phases` tab in your project settings. 3. Expand the `Bundle React Native code and images` section and add `export BUNDLE_COMMAND=esbuild-bundle` so it looks like this: ```shell set -e export BUNDLE_COMMAND=esbuild-bundle export NODE_BINARY=node ../node_modules/react-native/scripts/react-native-xcode.sh ``` ## Usage This library aims to be a plug-in replacement for the metro equivalent commands with the `esbuild-` prefix. ### `react-native esbuild-start` | **Argument** | **Description** | **Default** | | ------------------ | -------------------------------- | ----------- | | `--port` | Port to listen for http requests | `8081` | | `--host` | Host to listen for http requests | `127.0.0.1` | | `--projectRoot` | Path to a custom project root. | _None_ | | `--reset-cache` | Removes cached files. | _N/A_ | | `--no-interactive` | Disables interactive mode. | `false` | ### `react-native esbuild-bundle` | **Argument** | **Description** | **Default** | | -------------------- | --------------------------------------------------------------------------------- | ----------------- | | `--entry-file` | Path to the root JS file, either absolute or relative to JS root | `index.js` | | `--platform` | Either `ios` or `android` | `ios` | | `--dev` | If `false`, warnings are disabled and the bundle is minified | `true` | | `--minify` | Allows overriding whether bundle is minified otherwise determined by `dev` value. | Opposite of `dev` | | `--bundle-output` | File name where to store the resulting bundle. | _None_ | | `--sourcemap-output` | File name where to store the sourcemap file for resulting bundle. | _None_ | | `--assets-dest` | Directory name where to store assets referenced in the bundle. | _None_ | | `--reset-cache` | Removes cached files. | _N/A_ | ## Troubleshooting ### Flow syntax errors such as `Expected "from" but found "{"` Esbuild doesn't natively support flow so such syntax needs to be stripped with a plugin. By default any file with `@flow` or `@noflow` pragmas will be stripped from flow, but you may also opt-in to flow stripping for more files by passing a custom flow syntax checker: ```js // react-native.config.js const { createEsbuildCommands, defaultHasFlowSyntax, syntaxAwareLoaderPlugin, } = require('react-native-esbuild'); const FLOW_MODULES_WITHOUT_PRAGMA = ['react-native-video', 'rn-fetch-blob']; const commands = createEsbuildCommands((config, args) => ({ ...config, plugins: config.plugins .filter((plugin) => plugin.name !== 'syntax-aware-loader') .concat( syntaxAwareLoaderPlugin({ filter: /\.([mc]js|[tj]sx?)$/, cache: args.dev, hasFlowSyntax: (contents, filePath) => defaultHasFlowSyntax(contents, filePath) || FLOW_MODULES_WITHOUT_PRAGMA.find((m) => filePath.includes(`node_modules/${m}/`) ), }) ), })); module.exports = { commands, }; ``` ## Limitations ### Hermes engine Hermes doesn't support crucial ES6 features like block level scoping (`let`/`const`) and the team doesn't seem to want to merge this feature mentioning it [being a too big of a change](https://github.com/facebook/hermes/issues/575#issuecomment-902169154) without [having good enough reasons to add it](https://github.com/facebook/hermes/issues/715#issuecomment-1083236894). ### HMR/Fast Refresh Esbuild [doesn't support Fast Refresh or Hot Module Replacement](https://github.com/evanw/esbuild/issues/151#issuecomment-634441809), but this library supports live reload instead. ## License MIT © Joel Arvidsson 2022-