What is @react-native-community/cli-plugin-metro?
The @react-native-community/cli-plugin-metro package is a plugin for the React Native CLI that integrates Metro, the JavaScript bundler for React Native. This plugin facilitates the configuration and customization of Metro for React Native projects, enhancing the development experience by providing tools for optimizing and managing the bundling process.
What are @react-native-community/cli-plugin-metro's main functionalities?
Custom Metro Configuration
Allows developers to customize the Metro configuration specific to their React Native project needs, such as defining file extensions, blacklisting files, and setting transformer options.
module.exports = {
resolver: {
sourceExts: ['jsx', 'js', 'ts', 'tsx', 'json'],
blacklistRE: blacklist([/ignore_files\/.*$/])
},
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false,
},
}),
},
serializer: {
getPolyfills: () => [require.resolve('react-native/Libraries/polyfills/console.js')]
}
};
Optimizing Bundling
Enhances the performance of the JavaScript bundling process by allowing developers to define optimization settings such as minification and mangling to improve load times and application performance.
const { makeMetroConfig } = require('@react-native-community/cli-plugin-metro');
const config = makeMetroConfig({
projectRoot: __dirname + '/src',
watchFolders: [__dirname + '/node_modules'],
transformer: {
minifierConfig: {
mangle: true,
keep_classnames: true,
keep_fnames: true,
output: {
ascii_only: true,
quote_style: 3,
wrap_iife: true
}
}
}
});
Other packages similar to @react-native-community/cli-plugin-metro
metro-react-native-babel-preset
This package provides a set of Babel presets configured for React Native applications using Metro. It is similar to @react-native-community/cli-plugin-metro in that it helps in setting up the project's Babel configuration for optimal performance with Metro, but it focuses more on the Babel presets rather than the broader Metro configuration.
haul
Haul is a drop-in replacement for Metro bundler built on webpack, offering a similar feature set with additional customization options that webpack provides. It compares to @react-native-community/cli-plugin-metro by offering an alternative bundling solution with potentially more familiar configuration options for developers experienced with webpack.
This package is part of the React Native CLI.
It contains commands for managing the Metro bundler.
Installation
yarn add @react-native-community/cli-plugin-metro
Commands
start
Usage:
react-native start [option]
Starts the server that communicates with connected devices
Options
--port <number>
Specify port to listen on
--projectRoot <path>
Path to a custom project root
--watchFolders <list>
Specify any additional folders to be added to the watch list
--assetPlugins <list>
Specify any additional asset plugins to be used by the packager by full filepath
--sourceExts <list>
Specify any additional source extensions to be used by the packager
--max-workers <number>
Specifies the maximum number of workers the worker-pool will spawn for transforming files. This defaults to the number of the cores available on your machine
--transformer <string>
Specify a custom transformer to be used
--reset-cache, --resetCache
Removes cached files
--custom-log-reporter-path, --customLogReporterPath <string>
Path to a JavaScript file that exports a log reporter as a replacement for TerminalReporter
--https
Enables https connections to the server
--key <path>
Path to custom SSL key
--cert <path>
Path to custom SSL cert
--config <string>
Path to the CLI configuration file
--no-interactive
Disables interactive mode
bundle
Usage:
react-native bundle <flag>
Builds the JavaScript bundle for offline use.
--entry-file <path>
Path to the root JS file, either absolute or relative to JS root.
--platform <string>
default: ios
Either "ios" or "android".
--transformer <string>
Specify a custom transformer to be used.
--dev [boolean]
default: true
If false, warnings are disabled and the bundle is minified.
--minify [boolean]
Allows overriding whether bundle is minified. This defaults to false if dev is true, and true if dev is false. Disabling minification can be useful for speeding up production builds for testing purposes.
--bundle-output <string>
File name where to store the resulting bundle, ex. /tmp/groups.bundle
.
If you are planning on building a debug APK, that will run without the packager, by invoking ./gradlew assembleDebug
you can simply set bundleInDebug: true
in your app/build.gradle file, inside the project.ext.react
map.
Alternatively if you want to run react-native bundle
manually and then create the APK with ./gradlew assembleDebug
you have to make sure to put the bundle into the right directory and give it the right name, so that gradle can find it.
For react-native versions 0.57 and above the bundle output path should be:
android/app/build/generated/assets/react/debug/index.android.js
To find out the correct path for previous react-native versions, take a look at the react.gradle
file here: https://github.com/facebook/react-native/blob/0.57-stable/react.gradle or inside your node_modules/react-native
directory.
The expected path for the js bundle can be found on the line that starts with jsBundleDir =
.
--bundle-encoding <string>
default: utf8
Encoding the bundle should be written in (https://nodejs.org/api/buffer.html#buffer_buffer).
--max-workers <number>
Specifies the maximum number of workers the worker-pool will spawn for transforming files. This defaults to the number of the cores available on your machine.
--sourcemap-output <string>
File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map
.
--sourcemap-sources-root <string>
Path to make sourcemap sources entries relative to, ex. /root/dir
.
--sourcemap-use-absolute-path
default: false
Report SourceMapURL using its full path.
--assets-dest <string>
Directory name where to store assets referenced in the bundle.
If you are planning on building a debug APK that will run without the packager, see (--bundle-output)
Alternatively if you want to run react-native bundle
manually and then create the APK with ./gradlew assembleDebug
you have to make sure to put the assets into the right directory, so that gradle can find them.
For react-native versions 0.57 and above the --assets-dest
path should be:
android/app/build/generated/res/react/debug
The expected path for the assets can be found in the react.gradle file on the line that starts with resourcesDir =
--reset-cache
default: false
Removes cached files.
--read-global-cache
default: false
Try to fetch transformed JS code from the global cache, if configured.
--config <string>
Path to the CLI configuration file.
ram-bundle
Usage:
react-native ram-bundle [options]
Builds JavaScript as a "Random Access Module" bundle for offline use.
Options
Accepts all of bundle commands and following:
--indexed-ram-bundle
Force the "Indexed RAM" bundle file format, even when building for Android.