Skip to content

Reanimated 2 Failed to Create a Worklet Error

This common React Native error occurs when integrating the Reanimated 2 library, typically due to incorrect configuration or caching issues. The error message suggests that Reanimated's Babel plugin might be missing from your configuration.

Problem Overview

When using React Native Reanimated 2, you may encounter the following error:

"Reanimated 2 failed to create a worklet, maybe you forgot to add Reanimated's babel plugin?"

This happens because Reanimated requires its Babel plugin to properly transform worklet functions that run on the UI thread rather than the JavaScript thread.

Primary Solutions

1. Configure Babel Correctly

The most common fix is to ensure Reanimated's plugin is properly added to your Babel configuration:

javascript
// babel.config.js
module.exports = {
  presets: ['module:metro-react-native-babel-preset' || 'module:@react-native/babel-preset'],
  plugins: [
    'react-native-reanimated/plugin', // Must be the last plugin
  ],
};

IMPORTANT

The react-native-reanimated/plugin must be the last item in your plugins array to work correctly.

2. Clear Cache and Restart

After modifying your Babel configuration, clear your build cache:

bash
npm start -- --reset-cache
bash
yarn start --reset-cache
bash
expo start -c
# or
expo start --clear

3. Complete Setup for React Native CLI

If using React Native CLI (not Expo), ensure you've completed all installation steps:

gradle
// android/app/build.gradle
project.ext.react = [
  enableHermes: true
]
java
// android/app/src/main/java/com/your-app/MainApplication.java
import com.facebook.react.bridge.JSIModulePackage;
import com.swmansion.reanimated.ReanimatedJSIModulePackage;

public class MainApplication extends Application implements ReactApplication {
  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    // ... other methods
    
    @Override
    protected JSIModulePackage getJSIModulePackage() {
      return new ReanimatedJSIModulePackage();
    }
  };
}

Advanced Configuration Scenarios

With Other Plugins

When using additional Babel plugins, ensure Reanimated's plugin remains last:

javascript
module.exports = {
  presets: ['babel-preset-expo'],
  plugins: [
    ['module-resolver', { 
      extensions: [".tsx", ".ts", ".js", ".json"] 
    }],
    ["@babel/plugin-transform-private-methods", { loose: true }],
    'react-native-reanimated/plugin', // Always last
  ],
};

Expo-Specific Solutions

For Expo projects, ensure you're using the correct preset and installation method:

javascript
// For Expo projects
module.exports = {
  presets: ['babel-preset-expo'],
  plugins: ['react-native-reanimated/plugin'],
};

Install Reanimated in Expo projects with:

bash
expo install react-native-reanimated

Environment-Specific Configuration Issues

If your Babel configuration has environment-specific settings, ensure the plugin is available in all environments:

javascript
// ❌ Problematic configuration
module.exports = {
  presets: ["babel-preset-expo"],
  env: {
    production: {
      plugins: ["react-native-reanimated/plugin"], // Only in production
    },
  },
};

// ✅ Correct configuration  
module.exports = {
  presets: ["babel-preset-expo"],
  plugins: ["react-native-reanimated/plugin"], // Available in all environments
};

Additional Troubleshooting Steps

If the above solutions don't work, try these advanced troubleshooting techniques:

  1. Full Clean and Reinstall:

    bash
    watchman watch-del-all
    rm -rf node_modules yarn.lock package-lock.json
    rm -rf android/app/build
    rm -rf ios/Pods ios/Podfile.lock
    npm install
    cd ios && pod install && cd ..
  2. Check Reanimated Version Compatibility:

    bash
    npm install react-native-reanimated@^2.9.1
    # or for latest version
    npm install react-native-reanimated@latest
  3. Verify Import Order:

    javascript
    // App.js or index.js
    import 'react-native-gesture-handler'; // Should be first
    // Other imports...
  4. Use Expo Doctor (Expo projects only):

    bash
    expo doctor --fix-dependencies

Common Pitfalls

  • Cache issues: The most frequent cause of this error is not clearing the cache after adding the Babel plugin
  • Plugin order: Reanimated's plugin must be the last in the Babel configuration
  • Environment restrictions: Ensure the plugin isn't limited to only production or development environments
  • Incomplete installation: React Native CLI projects require additional native configuration

When to Seek Further Help

If you've tried all these solutions and still encounter the error:

  1. Check the official Reanimated documentation
  2. Ensure your React Native version is compatible with your Reanimated version
  3. Look for similar issues on the Reanimated GitHub repository

PRO TIP

Always run the reset cache command after modifying your Babel configuration. This resolves the issue in most cases.

By following these steps, you should be able to resolve the "failed to create a worklet" error and successfully use React Native Reanimated in your project.