Beim Ausführen von eas build / npx expo update für Android schlägt die Bündelung fehl und es kommt ein Fehler vom expo-router, der besagt, dass das erste Argument von require.context eine Zeichenfolge sein muss. Die App funktioniert in Expo Go, schlägt jedoch nur während EAS/Verpackung fehl. Ich habe versucht, expo-router/babel zu babel.config.js hinzuzufügen (wie empfohlen), aber der Fehler bleibt bestehen.
Beispielbild
https://i.sstatic.net/YjEJVSWx.png
Umgebung
- Betriebssystem: Windows 10/11
- Knoten: v24.7.0
- Expo CLI / EAS: Verwendung von eas-Befehlen (Build/Update)
- Expo SDK: 54.0.30
- expo-router: ~6.0.21
- React Native: 0.81.5
- Relevante Deps: metro-react-native-babel-preset ^0.77.0
- npx expo export:embed --eager --platform android --dev false --reset-cache
- eas build (oder eas update)
Code: Select all
Starting Metro Bundler
SyntaxError: node_modules\expo-router\_ctx.android.js: node_modules\expo-router\_ctx.android.js:Invalid call at line 2: process.env.EXPO_ROUTER_APP_ROOT
First argument of `require.context` should be a string denoting the directory to require.
Error: node_modules\expo-router\_ctx.android.js:Invalid call at line 2: process.env.EXPO_ROUTER_APP_ROOT
First argument of `require.context` should be a string denoting the directory to require.
at transformJS ... @expo/metro-config\build\transform-worker\metro-transform-worker.js:337:23
at transformJSWithBabel ... @expo/metro-config\build\transform-worker\metro-transform-worker.js:487:18
- package.json
Code: Select all
"main": "expo-router/entry",
"dependencies": {
"expo": "^54.0.30",
"expo-router": "~6.0.21",
"metro-react-native-babel-preset": "^0.77.0",
...
}
- app.json
Code: Select all
{
"expo": {
"plugins": ["expo-router", ...],
"runtimeVersion": { "policy": "appVersion" },
"updates": { "url": "..." }
...
}
}
- babel.config.js (aktuell)
Code: Select all
module.exports = {
presets: ["module:metro-react-native-babel-preset"],
plugins: [
"expo-router/babel",
["react-native-worklets/plugin", workletsPluginOptions]
],
};
- metro.config.js
Code: Select all
const { getDefaultConfig } = require("expo/metro-config");
const { withUniwindConfig } = require("uniwind/metro");
const config = getDefaultConfig(__dirname);
module.exports = withUniwindConfig(config, { cssEntryFile: "./src/global.css" });
- Der Bundler sollte den vom expo-router verwendeten Prozess.env.EXPO_ROUTER_APP_ROOT inline/transformieren, sodass require.context ein String-Literal erhält und die Bündelung erfolgreich ist.
- Hinzugefügt expo-router/babel-Plugin für babel.config.js.
- Metro-Cache geleert (), expo-doctor ausgeführt (alle Prüfungen bestanden).
Code: Select all
--reset-cache - Es wurde versucht, die Umgebungsvariable vor dem Export manuell festzulegen (PowerShell: $env:EXPO_ROUTER_APP_ROOT="src/app").
- Verifizierte App läuft einwandfrei in Expo Go (also funktionieren Laufzeitrouten lokal).
- Warum wird process.env.EXPO_ROUTER_APP_ROOT während des Bündelungsschritts nicht inline, auch nach dem Hinzufügen von expo-router/babel zur Babel-Konfiguration?
- Gibt es bekannte Probleme mit Node v24 oder bestimmten Metro/Babel-Plugin-Bestellungen, die die Transformation verhindern würden?
- Sollte ich die Metro-Konfiguration explizit ändern? Fügen Sie ein Transformations-Plugin hinzu, oder gibt es eine empfohlene Reihenfolge/Platzierung für expo-router/babel?
- Welche zusätzlichen Protokolle oder minimale Repro wären am hilfreichsten, um dies weiter zu debuggen?
- Ein minimales Repo, das expo-router mit einem Root bei app verwendet und npx expo export:embed --eager ausführt --platform android --dev false --reset-cache sollte den gleichen Fehler anzeigen (dateibasiertes Routing und Main: „expo-router/entry“).
- expo, expo-router, metro, babel, React-native, eas, bundling
Mobile version