Plain ReactNative-Expo setup with pure JavaScript

Published: (December 2, 2025 at 10:32 AM EST)
2 min read
Source: Dev.to

Source: Dev.to

Presets

  • Package manager: Bun
  • SDK: 54.0.25
  • Language: JavaScript
  • Command interface: Bash integrated into terminal
  • OS: Windows

For this guide we’ll use bun as the package manager.

Create a project from the starter template

degit https://github.com/Franklivania/expo-js-starter.git 

Initialise a bare‑bones Expo project

bun create expo --template blank 

Navigate into the project and open it in your editor (the example uses Cursor):

cd  && cursor .

Install required dependencies

bun install \
  react-native-reanimated \
  react-native-screens \
  lucide-react-native \
  expo-haptics \
  expo-router \
  expo-image \
  expo-linking \
  expo-font \
  expo-constants \
  expo-blur \
  expo-system-ui \
  react-native-web \
  react-native-worklets \
  react-native-safe-area-context \
  @react-native-community/netinfo \
  @react-native-async-storage/async-storage@next \
  @react-navigation/bottom-tabs \
  @react-navigation/elements \
  @react-navigation/native \
  expo-splash-screen \
  react-dom \
  react-native-svg

These packages provide the core functionality needed for a plain JavaScript Expo app.

Configuration

jsconfig.json (optional)

Create or update jsconfig.json to simplify import paths:

{
  "compilerOptions": {
    "paths": {
      "@/*": ["./src/*"],
      "~/*": ["./assets/*"]
    }
  }
}

Babel (babel.config.js)

Configure Babel to use the Expo preset and the worklets plugin:

module.exports = function (api) {
  api.cache(true);
  return {
    presets: ["babel-preset-expo"],
    plugins: ["react-native-worklets/plugin"]
  };
};

app.json

Add the required plugins (Expo Router and Splash Screen) to app.json:

{
  "plugins": [
    "expo-router",
    [
      "expo-splash-screen",
      {
        "image": "./assets/images/splash-icon.png",
        "imageWidth": 200,
        "resizeMode": "contain",
        "backgroundColor": "#ffffff",
        "dark": {
          "backgroundColor": "#000000"
        }
      }
    ]
  ]
}

Entry point

Update the main field in package.json to point to the Expo Router entry:

{
  "main": "expo-router/entry"
}

Expo will automatically locate your layout file (e.g., /app/_layout.jsx or /src/app/_layout.jsx).

Verify dependency compatibility

Run the Expo doctor to check for mismatched versions:

bunx expo-doctor

If issues are reported, fix them with:

bunx expo install --check

After confirming everything is compatible, you can safely delete the default index.js and App.js files.

Final notes

That’s it! You now have a plain JavaScript Expo project set up without the default TypeScript configuration. Happy coding! 🍻💻

Back to Blog

Related posts

Read more »